proper locking to prevent close of closed channel crash when multiple mining peers compete

pull/627/head
zelig 10 years ago
parent 607fc788e3
commit dd1791c9fd
  1. 10
      blockpool/peers.go

@ -219,6 +219,7 @@ func (self *peers) addPeer(
return return
} }
self.lock.Lock() self.lock.Lock()
defer self.lock.Unlock()
p, found := self.peers[id] p, found := self.peers[id]
if found { if found {
// when called on an already connected peer, it means a newBlockMsg is received // 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)) 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 // check if peer's current head block is known
if self.bp.hasBlock(currentBlockHash) { if self.bp.hasBlock(currentBlockHash) {
@ -269,7 +269,10 @@ func (self *peers) addPeer(
} else { } else {
// baseline is our own TD // baseline is our own TD
currentTD := self.bp.getTD() 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 currentTD = self.best.td
} }
if td.Cmp(currentTD) > 0 { if td.Cmp(currentTD) > 0 {
@ -277,11 +280,12 @@ func (self *peers) addPeer(
self.status.bestPeers[p.id]++ self.status.bestPeers[p.id]++
self.status.lock.Unlock() self.status.lock.Unlock()
plog.Debugf("addPeer: peer <%v> (td: %v > current td %v) promoted best peer", id, td, currentTD) 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 self.best = p
best = true best = true
} }
} }
return return
} }

Loading…
Cancel
Save