From a2a90ddcdfa1276712d8e7b7a7142366b30b424d Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Fri, 10 Apr 2020 12:42:32 -0700 Subject: [PATCH] chain/neutrino: only acquire mutex once in Rescan --- chain/neutrino.go | 49 ++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/chain/neutrino.go b/chain/neutrino.go index 2db01ce8bb..a2c8150ec6 100644 --- a/chain/neutrino.go +++ b/chain/neutrino.go @@ -338,6 +338,29 @@ func (s *NeutrinoClient) pollCFilter(hash *chainhash.Hash) (*gcs.Filter, error) func (s *NeutrinoClient) Rescan(startHash *chainhash.Hash, addrs []btcutil.Address, outPoints map[wire.OutPoint]btcutil.Address) error { + bestBlock, err := s.CS.BestBlock() + if err != nil { + return fmt.Errorf("Can't get chain service's best block: %s", err) + } + header, err := s.CS.GetBlockHeader(&bestBlock.Hash) + if err != nil { + return fmt.Errorf("Can't get block header for hash %v: %s", + bestBlock.Hash, err) + } + + var inputsToWatch []neutrino.InputWithScript + for op, addr := range outPoints { + addrScript, err := txscript.PayToAddrScript(addr) + if err != nil { + return err + } + + inputsToWatch = append(inputsToWatch, neutrino.InputWithScript{ + OutPoint: op, + PkScript: addrScript, + }) + } + s.clientMtx.Lock() if !s.started { s.clientMtx.Unlock() @@ -367,23 +390,11 @@ func (s *NeutrinoClient) Rescan(startHash *chainhash.Hash, addrs []btcutil.Addre s.lastProgressSent = false s.lastFilteredBlockHeader = nil s.isRescan = true - s.clientMtx.Unlock() - - bestBlock, err := s.CS.BestBlock() - if err != nil { - return fmt.Errorf("Can't get chain service's best block: %s", err) - } - header, err := s.CS.GetBlockHeader(&bestBlock.Hash) - if err != nil { - return fmt.Errorf("Can't get block header for hash %v: %s", - bestBlock.Hash, err) - } // If the wallet is already fully caught up, or the rescan has started // with state that indicates a "fresh" wallet, we'll send a // notification indicating the rescan has "finished". if header.BlockHash() == *startHash { - s.clientMtx.Lock() s.finished = true rescanQuit := s.rescanQuit s.clientMtx.Unlock() @@ -404,20 +415,6 @@ func (s *NeutrinoClient) Rescan(startHash *chainhash.Hash, addrs []btcutil.Addre } } - var inputsToWatch []neutrino.InputWithScript - for op, addr := range outPoints { - addrScript, err := txscript.PayToAddrScript(addr) - if err != nil { - return err - } - - inputsToWatch = append(inputsToWatch, neutrino.InputWithScript{ - OutPoint: op, - PkScript: addrScript, - }) - } - - s.clientMtx.Lock() newRescan := neutrino.NewRescan( &neutrino.RescanChainSource{ ChainService: s.CS,