From e4577ab5f44ad8cc1322dbcb9a4a9d6da75e6f66 Mon Sep 17 00:00:00 2001 From: Dave Collins Date: Thu, 12 Sep 2013 12:10:48 -0500 Subject: [PATCH] Syncrhonize access to the blockPeer map. --- blockmanager.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blockmanager.go b/blockmanager.go index 67f1a80ff..b793698ce 100644 --- a/blockmanager.go +++ b/blockmanager.go @@ -43,6 +43,7 @@ type blockManager struct { shutdown bool blockChain *btcchain.BlockChain blockPeer map[btcwire.ShaHash]*peer + blockPeerMutex sync.Mutex receivedLogBlocks int64 receivedLogTx int64 lastBlockLogTime time.Time @@ -208,13 +209,17 @@ func (b *blockManager) handleBlockMsg(bmsg *blockMsg) { // Keep track of which peer the block was sent from so the notification // handler can request the parent blocks from the appropriate peer. blockSha, _ := bmsg.block.Sha() + b.blockPeerMutex.Lock() b.blockPeer[*blockSha] = bmsg.peer + b.blockPeerMutex.Unlock() // Process the block to include validation, best chain selection, orphan // handling, etc. err := b.blockChain.ProcessBlock(bmsg.block) if err != nil { + b.blockPeerMutex.Lock() delete(b.blockPeer, *blockSha) + b.blockPeerMutex.Unlock() log.Warnf("[BMGR] Failed to process block %v: %v", blockSha, err) return } @@ -222,7 +227,9 @@ func (b *blockManager) handleBlockMsg(bmsg *blockMsg) { // Don't keep track of the peer that sent the block any longer if it's // not an orphan. if !b.blockChain.IsKnownOrphan(blockSha) { + b.blockPeerMutex.Lock() delete(b.blockPeer, *blockSha) + b.blockPeerMutex.Unlock() } // Log info about the new block height. @@ -271,6 +278,9 @@ func (b *blockManager) handleNotifyMsg(notification *btcchain.Notification) { switch notification.Type { // An orphan block has been accepted by the block chain. case btcchain.NTOrphanBlock: + b.blockPeerMutex.Lock() + defer b.blockPeerMutex.Unlock() + orphanHash := notification.Data.(*btcwire.ShaHash) if peer, exists := b.blockPeer[*orphanHash]; exists { orphanRoot := b.blockChain.GetOrphanRoot(orphanHash)