Skip to content

Commit f80d34d

Browse files
author
Bryan C. Mills
committed
ipv4: shut down the PacketConn on failure in TestPacketConnConcurrentReadWriteUnicast
This avoids a deadlock (observed in golang/go#51342) that may otherwise swallow the error logs from a failure, which may help us better diagnose the underlying problem. This is a port of CL 376094 to the "ipv4" package. For golang/go#51342 Change-Id: I7b5ba25fcbdd1ec0b319fe35b558d9dcbf8054c6 Reviewed-on: https://go-review.googlesource.com/c/net/+/387915 Trust: Bryan Mills <[email protected]> Run-TryBot: Bryan Mills <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent cd36cc0 commit f80d34d

File tree

1 file changed

+33
-32
lines changed

1 file changed

+33
-32
lines changed

ipv4/readwrite_test.go

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -369,23 +369,37 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
369369
t.Fatal(err)
370370
}
371371

372+
var firstError sync.Once
373+
fatalf := func(format string, args ...interface{}) {
374+
// On the first error, close the PacketConn to unblock the remaining
375+
// goroutines. Suppress any further errors, which may occur simply due to
376+
// closing the PacketConn.
377+
first := false
378+
firstError.Do(func() {
379+
first = true
380+
p.Close()
381+
})
382+
if first {
383+
t.Helper()
384+
t.Errorf(format, args...)
385+
}
386+
runtime.Goexit()
387+
}
388+
372389
var wg sync.WaitGroup
373390
reader := func() {
374391
defer wg.Done()
375392
b := make([]byte, 128)
376393
n, cm, _, err := p.ReadFrom(b)
377394
if err != nil {
378-
t.Error(err)
379-
return
395+
fatalf("%v", err)
380396
}
381397
if !bytes.Equal(b[:n], data) {
382-
t.Errorf("got %#v; want %#v", b[:n], data)
383-
return
398+
fatalf("got %#v; want %#v", b[:n], data)
384399
}
385400
s := cm.String()
386401
if strings.Contains(s, ",") {
387-
t.Errorf("should be space-separated values: %s", s)
388-
return
402+
fatalf("should be space-separated values: %s", s)
389403
}
390404
}
391405
batchReader := func() {
@@ -398,37 +412,31 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
398412
}
399413
n, err := p.ReadBatch(ms, 0)
400414
if err != nil {
401-
t.Error(err)
402-
return
415+
fatalf("%v", err)
403416
}
404417
if n != len(ms) {
405-
t.Errorf("got %d; want %d", n, len(ms))
406-
return
418+
fatalf("got %d; want %d", n, len(ms))
407419
}
408420
var cm ipv4.ControlMessage
409421
if err := cm.Parse(ms[0].OOB[:ms[0].NN]); err != nil {
410-
t.Error(err)
411-
return
422+
fatalf("%v", err)
412423
}
413424
var b []byte
414425
if _, ok := dst.(*net.IPAddr); ok {
415426
var h ipv4.Header
416427
if err := h.Parse(ms[0].Buffers[0][:ms[0].N]); err != nil {
417-
t.Error(err)
418-
return
428+
fatalf("%v", err)
419429
}
420430
b = ms[0].Buffers[0][h.Len:ms[0].N]
421431
} else {
422432
b = ms[0].Buffers[0][:ms[0].N]
423433
}
424434
if !bytes.Equal(b, data) {
425-
t.Errorf("got %#v; want %#v", b, data)
426-
return
435+
fatalf("got %#v; want %#v", b, data)
427436
}
428437
s := cm.String()
429438
if strings.Contains(s, ",") {
430-
t.Errorf("should be space-separated values: %s", s)
431-
return
439+
fatalf("should be space-separated values: %s", s)
432440
}
433441
}
434442
writer := func(toggle bool) {
@@ -440,17 +448,14 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
440448
cm.IfIndex = ifi.Index
441449
}
442450
if err := p.SetControlMessage(cf, toggle); err != nil {
443-
t.Error(err)
444-
return
451+
fatalf("%v", err)
445452
}
446453
n, err := p.WriteTo(data, &cm, dst)
447454
if err != nil {
448-
t.Error(err)
449-
return
455+
fatalf("%v", err)
450456
}
451457
if n != len(data) {
452-
t.Errorf("got %d; want %d", n, len(data))
453-
return
458+
fatalf("got %d; want %d", n, len(data))
454459
}
455460
}
456461
batchWriter := func(toggle bool) {
@@ -462,8 +467,7 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
462467
cm.IfIndex = ifi.Index
463468
}
464469
if err := p.SetControlMessage(cf, toggle); err != nil {
465-
t.Error(err)
466-
return
470+
fatalf("%v", err)
467471
}
468472
ms := []ipv4.Message{
469473
{
@@ -474,16 +478,13 @@ func testPacketConnConcurrentReadWriteUnicast(t *testing.T, p *ipv4.PacketConn,
474478
}
475479
n, err := p.WriteBatch(ms, 0)
476480
if err != nil {
477-
t.Error(err)
478-
return
481+
fatalf("%v", err)
479482
}
480483
if n != len(ms) {
481-
t.Errorf("got %d; want %d", n, len(ms))
482-
return
484+
fatalf("got %d; want %d", n, len(ms))
483485
}
484486
if ms[0].N != len(data) {
485-
t.Errorf("got %d; want %d", ms[0].N, len(data))
486-
return
487+
fatalf("got %d; want %d", ms[0].N, len(data))
487488
}
488489
}
489490

0 commit comments

Comments
 (0)