good morning!!!!

Skip to content
Snippets Groups Projects
Commit dd1791c9 authored by Viktor Trón's avatar Viktor Trón
Browse files

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

parent 607fc788
Branches
Tags
No related merge requests found
...@@ -219,6 +219,7 @@ func (self *peers) addPeer( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment