forked from cerc-io/plugeth
proper locking to prevent "parent unknown" INVALID blocks due to race in peer head info update
This commit is contained in:
parent
dd1791c9fd
commit
5cb1b41440
@ -133,13 +133,10 @@ func (self *peer) addError(code int, format string, params ...interface{}) {
|
|||||||
self.addToBlacklist(self.id)
|
self.addToBlacklist(self.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// caller must hold peer lock
|
||||||
func (self *peer) setChainInfo(td *big.Int, c common.Hash) {
|
func (self *peer) setChainInfo(td *big.Int, c common.Hash) {
|
||||||
self.lock.Lock()
|
|
||||||
defer self.lock.Unlock()
|
|
||||||
|
|
||||||
self.td = td
|
self.td = td
|
||||||
self.currentBlockHash = c
|
self.currentBlockHash = c
|
||||||
|
|
||||||
self.currentBlock = nil
|
self.currentBlock = nil
|
||||||
self.parentHash = common.Hash{}
|
self.parentHash = common.Hash{}
|
||||||
self.headSection = nil
|
self.headSection = nil
|
||||||
@ -171,7 +168,7 @@ func (self *peers) requestBlocks(attempts int, hashes []common.Hash) {
|
|||||||
defer self.lock.RUnlock()
|
defer self.lock.RUnlock()
|
||||||
peerCount := len(self.peers)
|
peerCount := len(self.peers)
|
||||||
// on first attempt use the best peer
|
// on first attempt use the best peer
|
||||||
if attempts == 0 {
|
if attempts == 0 && self.best != nil {
|
||||||
plog.DebugDetailf("request %v missing blocks from best peer <%s>", len(hashes), self.best.id)
|
plog.DebugDetailf("request %v missing blocks from best peer <%s>", len(hashes), self.best.id)
|
||||||
self.best.requestBlocks(hashes)
|
self.best.requestBlocks(hashes)
|
||||||
return
|
return
|
||||||
@ -224,6 +221,7 @@ func (self *peers) addPeer(
|
|||||||
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
|
||||||
// peer head info is updated
|
// peer head info is updated
|
||||||
|
p.lock.Lock()
|
||||||
if p.currentBlockHash != currentBlockHash {
|
if p.currentBlockHash != currentBlockHash {
|
||||||
previousBlockHash = p.currentBlockHash
|
previousBlockHash = p.currentBlockHash
|
||||||
plog.Debugf("addPeer: Update peer <%s> with td %v and current block %s (was %v)", id, td, hex(currentBlockHash), hex(previousBlockHash))
|
plog.Debugf("addPeer: Update peer <%s> with td %v and current block %s (was %v)", id, td, hex(currentBlockHash), hex(previousBlockHash))
|
||||||
@ -233,6 +231,7 @@ func (self *peers) addPeer(
|
|||||||
self.status.values.NewBlocks++
|
self.status.values.NewBlocks++
|
||||||
self.status.lock.Unlock()
|
self.status.lock.Unlock()
|
||||||
}
|
}
|
||||||
|
p.lock.Unlock()
|
||||||
} else {
|
} else {
|
||||||
p = self.newPeer(td, currentBlockHash, id, requestBlockHashes, requestBlocks, peerError)
|
p = self.newPeer(td, currentBlockHash, id, requestBlockHashes, requestBlocks, peerError)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user