|
|
@ -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 |
|
|
@ -219,10 +216,12 @@ 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
|
|
|
|
// 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)) |
|
|
@ -232,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) |
|
|
|
|
|
|
|
|
|
|
@ -243,7 +243,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 +268,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 +279,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 |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|