ipv6: retry ENOBUFS errors in TestPacketConnConcurrentReadWriteUnicast
This change is sheer speculation based on the failures observed in
golang/go#37319.
(A deadlock in the test prevented us from seeing the actual failure
mode of golang/go#50455 up until CL 376094, and it isn't obvious to me
that we should wait for another failure before trying a likely — and
otherwise harmless — fix.)
Fixes golang/go#50455.
(Maybe.)
Change-Id: I7483eb2243832d07cb1f815da196b3978a50c6b3
Reviewed-on: https://go-review.googlesource.com/c/net/+/376095
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/ipv6/readwrite_test.go b/ipv6/readwrite_test.go
index 9d1ed88..d319632 100644
--- a/ipv6/readwrite_test.go
+++ b/ipv6/readwrite_test.go
@@ -12,6 +12,7 @@
"strings"
"sync"
"testing"
+ "time"
"golang.org/x/net/internal/iana"
"golang.org/x/net/ipv6"
@@ -440,12 +441,22 @@
if err := p.SetControlMessage(cf, toggle); err != nil {
fatalf("%v", err)
}
- n, err := p.WriteTo(data, &cm, dst)
- if err != nil {
- fatalf("%v", err)
- }
- if n != len(data) {
- fatalf("got %d; want %d", n, len(data))
+
+ backoff := time.Millisecond
+ for {
+ n, err := p.WriteTo(data, &cm, dst)
+ if err != nil {
+ if n == 0 && isENOBUFS(err) {
+ time.Sleep(backoff)
+ backoff *= 2
+ continue
+ }
+ fatalf("%v", err)
+ }
+ if n != len(data) {
+ fatalf("got %d; want %d", n, len(data))
+ }
+ break
}
}
batchWriter := func(toggle bool) {
@@ -468,15 +479,25 @@
Addr: dst,
},
}
- n, err := p.WriteBatch(ms, 0)
- if err != nil {
- fatalf("%v", err)
- }
- if n != len(ms) {
- fatalf("got %d; want %d", n, len(ms))
- }
- if ms[0].N != len(data) {
- fatalf("got %d; want %d", ms[0].N, len(data))
+
+ backoff := time.Millisecond
+ for {
+ n, err := p.WriteBatch(ms, 0)
+ if err != nil {
+ if n == 0 && isENOBUFS(err) {
+ time.Sleep(backoff)
+ backoff *= 2
+ continue
+ }
+ fatalf("%v", err)
+ }
+ if n != len(ms) {
+ fatalf("got %d; want %d", n, len(ms))
+ }
+ if ms[0].N != len(data) {
+ fatalf("got %d; want %d", ms[0].N, len(data))
+ }
+ break
}
}