From 677836cbee1105043335c672b41dc4402e98c227 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 2 Oct 2014 17:35:38 +0200 Subject: Kick off bad peers on bad chains and improved catch up on diverted chain --- block_pool.go | 14 ++++++++++++-- peer.go | 15 +++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/block_pool.go b/block_pool.go index e31babfd6..a951672c3 100644 --- a/block_pool.go +++ b/block_pool.go @@ -56,6 +56,11 @@ func (self *BlockPool) Len() int { return len(self.hashPool) } +func (self *BlockPool) Reset() { + self.pool = make(map[string]*block) + self.hashPool = nil +} + func (self *BlockPool) HasLatestHash() bool { self.mut.Lock() defer self.mut.Unlock() @@ -77,7 +82,7 @@ func (self *BlockPool) Blocks() (blocks ethchain.Blocks) { return } -func (self *BlockPool) FetchHashes(peer *Peer) { +func (self *BlockPool) FetchHashes(peer *Peer) bool { highestTd := self.eth.HighestTDPeer() if (self.peer == nil && peer.td.Cmp(highestTd) >= 0) || (self.peer != nil && peer.td.Cmp(self.peer.td) >= 0) || self.peer == peer { @@ -95,7 +100,11 @@ func (self *BlockPool) FetchHashes(peer *Peer) { peerlogger.Debugf("Fetching hashes (%d)\n", amount) peer.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{peer.lastReceivedHash, uint32(amount)})) } + + return true } + + return false } func (self *BlockPool) AddHash(hash []byte, peer *Peer) { @@ -122,7 +131,7 @@ func (self *BlockPool) Add(b *ethchain.Block, peer *Peer) { self.pool[hash] = &block{peer, peer, b, time.Now(), 0} if !self.eth.BlockChain().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes { - poollogger.Infof("Unknown block, requesting parent (%x...)\n", b.PrevHash[0:4]) + poollogger.Infof("Unknown chain, requesting (%x...)\n", b.PrevHash[0:4]) peer.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{b.Hash(), uint32(256)})) } } else if self.pool[hash] != nil { @@ -308,6 +317,7 @@ out: } if err != nil { + self.Reset() // Remove this bad chain for _, block := range blocks { self.Remove(block.Hash()) diff --git a/peer.go b/peer.go index 2806e8a11..763658dd5 100644 --- a/peer.go +++ b/peer.go @@ -202,7 +202,7 @@ func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer { go func() { conn, err := p.Connect(addr) if err != nil { - peerlogger.Debugln("Connection to peer failed. Giving up.", err) + //peerlogger.Debugln("Connection to peer failed. Giving up.", err) p.Stop() return } @@ -517,7 +517,9 @@ func (p *Peer) HandleInbound() { } if !foundCommonHash && msg.Data.Len() != 0 { - p.FetchHashes() + if !p.FetchHashes() { + p.doneFetchingHashes = true + } } else { peerlogger.Infof("Found common hash (%x...)\n", p.lastReceivedHash[0:4]) p.doneFetchingHashes = true @@ -553,9 +555,9 @@ func (self *Peer) FetchBlocks(hashes [][]byte) { } } -func (self *Peer) FetchHashes() { +func (self *Peer) FetchHashes() bool { blockPool := self.ethereum.blockPool - blockPool.FetchHashes(self) + return blockPool.FetchHashes(self) /* if self.td.Cmp(self.ethereum.HighestTDPeer()) >= 0 { @@ -718,10 +720,7 @@ func (self *Peer) handleStatus(msg *ethwire.Msg) { // Compare the total TD with the blockchain TD. If remote is higher // fetch hashes from highest TD node. - if self.td.Cmp(self.ethereum.BlockChain().TD) > 0 { - self.ethereum.blockPool.AddHash(self.lastReceivedHash, self) - self.FetchHashes() - } + self.FetchHashes() ethlogger.Infof("Peer is [eth] capable. (TD = %v ~ %x) %d / %d", self.td, self.bestHash, protoVersion, netVersion) -- cgit v1.2.3