diff options
author | zelig <viktor.tron@gmail.com> | 2015-04-02 22:32:41 +0800 |
---|---|---|
committer | zelig <viktor.tron@gmail.com> | 2015-04-02 22:32:41 +0800 |
commit | dd1791c9fd87b3744dc0747153e41fe893cc727b (patch) | |
tree | 9569e5b3661ab842cc126eb637c63df524b61158 /blockpool | |
parent | 607fc788e378c62ceea72dbc536da0b484323a44 (diff) | |
download | go-tangerine-dd1791c9fd87b3744dc0747153e41fe893cc727b.tar.gz go-tangerine-dd1791c9fd87b3744dc0747153e41fe893cc727b.tar.zst go-tangerine-dd1791c9fd87b3744dc0747153e41fe893cc727b.zip |
proper locking to prevent close of closed channel crash when multiple mining peers compete
Diffstat (limited to 'blockpool')
-rw-r--r-- | blockpool/peers.go | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/blockpool/peers.go b/blockpool/peers.go index 615058e26..802081780 100644 --- a/blockpool/peers.go +++ b/blockpool/peers.go @@ -219,6 +219,7 @@ func (self *peers) addPeer( return } self.lock.Lock() + defer self.lock.Unlock() p, found := self.peers[id] if found { // when called on an already connected peer, it means a newBlockMsg is received @@ -243,7 +244,6 @@ func (self *peers) addPeer( plog.Debugf("addPeer: add new peer <%v> with td %v and current block %s", id, td, hex(currentBlockHash)) } - self.lock.Unlock() // check if peer's current head block is known if self.bp.hasBlock(currentBlockHash) { @@ -269,7 +269,10 @@ func (self *peers) addPeer( } else { // baseline is our own TD currentTD := self.bp.getTD() - if self.best != nil { + bestpeer := self.best + if bestpeer != nil { + bestpeer.lock.Lock() + defer bestpeer.lock.Unlock() currentTD = self.best.td } if td.Cmp(currentTD) > 0 { @@ -277,11 +280,12 @@ func (self *peers) addPeer( self.status.bestPeers[p.id]++ self.status.lock.Unlock() plog.Debugf("addPeer: peer <%v> (td: %v > current td %v) promoted best peer", id, td, currentTD) - self.bp.switchPeer(self.best, p) + self.bp.switchPeer(bestpeer, p) self.best = p best = true } } + return } |