catch spurious UDP sendmsg errors in multiplex integration test (#4451)

* catch spurious UDP sendmsg errors in multiplex integration test

* platform-dependent isPermissionError
This commit is contained in:
Marten Seemann
2024-04-20 15:21:24 +02:00
committed by GitHub
parent 18422ad1c4
commit e58fa87566
3 changed files with 36 additions and 0 deletions

View File

@@ -249,6 +249,7 @@ var _ = Describe("Multiplexing", func() {
defer GinkgoRecover() defer GinkgoRecover()
ticker := time.NewTicker(time.Millisecond / 10) ticker := time.NewTicker(time.Millisecond / 10)
defer ticker.Stop() defer ticker.Stop()
var wroteFirstPacket bool
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
@@ -258,11 +259,18 @@ var _ = Describe("Multiplexing", func() {
b := make([]byte, packetLen) b := make([]byte, packetLen)
rand.Read(b[1:]) // keep the first byte set to 0, so it's not classified as a QUIC packet rand.Read(b[1:]) // keep the first byte set to 0, so it's not classified as a QUIC packet
_, err := tr1.WriteTo(b, tr2.Conn.LocalAddr()) _, err := tr1.WriteTo(b, tr2.Conn.LocalAddr())
// The first sendmsg call on a new UDP socket sometimes errors on Linux.
// It's not clear why this happens.
// See https://github.com/golang/go/issues/63322.
if err != nil && !wroteFirstPacket && isPermissionError(err) {
_, err = tr1.WriteTo(b, tr2.Conn.LocalAddr())
}
if ctx.Err() != nil { // ctx canceled while Read was executing if ctx.Err() != nil { // ctx canceled while Read was executing
return return
} }
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
sentPackets.Add(1) sentPackets.Add(1)
wroteFirstPacket = true
} }
}() }()

View File

@@ -0,0 +1,21 @@
//go:build linux
package self_test
import (
"errors"
"os"
"golang.org/x/sys/unix"
)
// The first sendmsg call on a new UDP socket sometimes errors on Linux.
// It's not clear why this happens.
// See https://github.com/golang/go/issues/63322.
func isPermissionError(err error) bool {
var serr *os.SyscallError
if errors.As(err, &serr) {
return serr.Syscall == "sendmsg" && serr.Err == unix.EPERM
}
return false
}

View File

@@ -0,0 +1,7 @@
//go:build !linux
package self_test
func isPermissionError(err error) bool {
return false
}