From 77b0599fd1c3ba330c2826b0f64f711b8d317bbd Mon Sep 17 00:00:00 2001 From: Janos Guljas Date: Tue, 19 Feb 2019 17:28:04 +0100 Subject: [PATCH] swarm/network/stream: fix sync between NewRegistry goroutine and Close method --- swarm/network/stream/stream.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go index 1bc70fe763..622b46e4ca 100644 --- a/swarm/network/stream/stream.go +++ b/swarm/network/stream/stream.go @@ -178,7 +178,10 @@ func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.Sy for { select { - case i := <-in: + case i, ok := <-in: + if !ok { + return + } select { case <-out: default: @@ -193,13 +196,21 @@ func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.Sy return out } + kad := streamer.delivery.kad + // get notification channels from Kademlia before returning + // from this function to avoid race with Close method and + // the goroutine created below + depthC := latestIntC(kad.NeighbourhoodDepthC()) + addressBookSizeC := latestIntC(kad.AddrCountC()) + go func() { // wait for kademlia table to be healthy - time.Sleep(options.SyncUpdateDelay) - - kad := streamer.delivery.kad - depthC := latestIntC(kad.NeighbourhoodDepthC()) - addressBookSizeC := latestIntC(kad.AddrCountC()) + // but return if Registry is closed before + select { + case <-time.After(options.SyncUpdateDelay): + case <-quit: + return + } // initial requests for syncing subscription to peers streamer.updateSyncing()