From 78a69b4802e9e15eb03bf196be0a5ae111b44737 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 12 Dec 2017 00:25:22 -0700 Subject: [PATCH] chain/neutrino: fix deadlock --- chain/neutrino.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/chain/neutrino.go b/chain/neutrino.go index 0803e4d..280ec1e 100644 --- a/chain/neutrino.go +++ b/chain/neutrino.go @@ -201,7 +201,6 @@ func (s *NeutrinoClient) Rescan(startHash *chainhash.Hash, addrs []btcutil.Addre // notification indicating the rescan has "finished". if header.BlockHash() == *startHash { s.finished = true - s.clientMtx.Unlock() select { case s.enqueueNotification <- &RescanFinished{ Hash: startHash, @@ -213,7 +212,6 @@ func (s *NeutrinoClient) Rescan(startHash *chainhash.Hash, addrs []btcutil.Addre case <-s.rescanQuit: return nil } - s.clientMtx.Lock() } s.rescan = s.CS.NewRescan( @@ -249,11 +247,11 @@ func (s *NeutrinoClient) NotifyBlocks() error { // NotifyReceived replicates the RPC client's NotifyReceived command. func (s *NeutrinoClient) NotifyReceived(addrs []btcutil.Address) error { s.clientMtx.Lock() - defer s.clientMtx.Unlock() // If we have a rescan running, we just need to add the appropriate // addresses to the watch list. if s.scanning { + s.clientMtx.Unlock() return s.rescan.Update(neutrino.AddAddrs(addrs...)) } @@ -276,6 +274,7 @@ func (s *NeutrinoClient) NotifyReceived(addrs []btcutil.Address) error { neutrino.WatchAddrs(addrs...), ) s.rescanErr = s.rescan.Start() + s.clientMtx.Unlock() return nil }