From 6f80218492390d2cbb81763175b2f92712a470d4 Mon Sep 17 00:00:00 2001 From: Ferenc Szabo Date: Thu, 24 Jan 2019 12:11:52 +0100 Subject: [PATCH] swarm/pss: fix data race in notify_test.go (TestStart) TestStart failed when all tests were run with race detection. Simplest way to reproduce: `go test -race -count 1 -run TestStart ./swarm/pss/notify` The handler passed to `ctrlClient.Subscribe` is run in a goroutine, started in `p2p.(*Peer).startProtocols()`. There were 2 problems/races cased by the handler closure: 1. `t.Fatalf` was called from a goroutine 2. `updateMsg` passed to the handler (reda) was later modified in the main thread (write) fixes ethersphere/go-ethereum#1158 --- swarm/pss/notify/notify_test.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/swarm/pss/notify/notify_test.go b/swarm/pss/notify/notify_test.go index 5c29f68e0f..860a91bbe4 100644 --- a/swarm/pss/notify/notify_test.go +++ b/swarm/pss/notify/notify_test.go @@ -128,7 +128,7 @@ func TestStart(t *testing.T) { defer rightSub.Unsubscribe() updateC := make(chan []byte) - updateMsg := []byte{} + var updateMsg []byte ctrlClient := NewController(psses[rightPub]) ctrlNotifier := NewController(psses[leftPub]) ctrlNotifier.NewNotifier("foo.eth", 2, updateC) @@ -145,17 +145,24 @@ func TestStart(t *testing.T) { if err != nil { t.Fatal(err) } + + copyOfUpdateMsg := make([]byte, len(updateMsg)) + copy(copyOfUpdateMsg, updateMsg) + ctrlClientError := make(chan error, 1) ctrlClient.Subscribe(rsrcName, pubkey, addrbytes, func(s string, b []byte) error { - if s != "foo.eth" || !bytes.Equal(updateMsg, b) { - t.Fatalf("unexpected result in client handler: '%s':'%x'", s, b) + if s != "foo.eth" || !bytes.Equal(copyOfUpdateMsg, b) { + ctrlClientError <- fmt.Errorf("unexpected result in client handler: '%s':'%x'", s, b) + } else { + log.Info("client handler receive", "s", s, "b", b) } - log.Info("client handler receive", "s", s, "b", b) return nil }) var inMsg *pss.APIMsg select { case inMsg = <-rmsgC: + case err := <-ctrlClientError: + t.Fatal(err) case <-ctx.Done(): t.Fatal(ctx.Err()) }