aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzelig <viktor.tron@gmail.com>2015-04-02 22:32:41 +0800
committerzelig <viktor.tron@gmail.com>2015-04-02 22:32:41 +0800
commitdd1791c9fd87b3744dc0747153e41fe893cc727b (patch)
tree9569e5b3661ab842cc126eb637c63df524b61158
parent607fc788e378c62ceea72dbc536da0b484323a44 (diff)
downloaddexon-dd1791c9fd87b3744dc0747153e41fe893cc727b.tar.gz
dexon-dd1791c9fd87b3744dc0747153e41fe893cc727b.tar.zst
dexon-dd1791c9fd87b3744dc0747153e41fe893cc727b.zip
proper locking to prevent close of closed channel crash when multiple mining peers compete
-rw-r--r--blockpool/peers.go10
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
}