aboutsummaryrefslogtreecommitdiffstats
path: root/eth
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2015-04-30 06:52:25 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2015-04-30 06:52:25 +0800
commit3fef60190384106af390dd23a65384b9cc6e4a28 (patch)
tree49f52b8bba6af0228bb20758dd1465f8dce6842d /eth
parent764e81bf12bc45b00cec7db216e72d6396cf0c13 (diff)
parent30b921ef463247da63dece1cb81887f7e66668ff (diff)
downloaddexon-3fef60190384106af390dd23a65384b9cc6e4a28.tar.gz
dexon-3fef60190384106af390dd23a65384b9cc6e4a28.tar.zst
dexon-3fef60190384106af390dd23a65384b9cc6e4a28.zip
Merge pull request #830 from obscuren/downloader-missing-parent
eth/downloader: missing parent improvement
Diffstat (limited to 'eth')
-rw-r--r--eth/downloader/downloader.go21
-rw-r--r--eth/downloader/downloader_test.go4
-rw-r--r--eth/handler.go6
3 files changed, 18 insertions, 13 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index a3917854f..4cd927fd5 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -37,7 +37,7 @@ var (
)
type hashCheckFn func(common.Hash) bool
-type chainInsertFn func(types.Blocks) error
+type chainInsertFn func(types.Blocks) (int, error)
type hashIterFn func() (common.Hash, error)
type blockPack struct {
@@ -418,27 +418,30 @@ func (d *Downloader) process(peer *peer) error {
// link). We should at least check whihc queue match. This code could move
// to a seperate goroutine where it periodically checks for linked pieces.
types.BlockBy(types.Number).Sort(d.queue.blocks)
- blocks := d.queue.blocks
- if len(blocks) == 0 {
+ if len(d.queue.blocks) == 0 {
return nil
}
+ var (
+ blocks = d.queue.blocks
+ err error
+ )
glog.V(logger.Debug).Infof("Inserting chain with %d blocks (#%v - #%v)\n", len(blocks), blocks[0].Number(), blocks[len(blocks)-1].Number())
- var err error
// Loop untill we're out of blocks
for len(blocks) != 0 {
max := int(math.Min(float64(len(blocks)), 256))
// TODO check for parent error. When there's a parent error we should stop
// processing and start requesting the `block.hash` so that it's parent and
// grandparents can be requested and queued.
- err = d.insertChain(blocks[:max])
+ var i int
+ i, err = d.insertChain(blocks[:max])
if err != nil && core.IsParentErr(err) {
- glog.V(logger.Debug).Infoln("Aborting process due to missing parent.")
+ // Ignore the missing blocks. Handler should take care of anything that's missing.
+ glog.V(logger.Debug).Infof("Ignored block with missing parent (%d)\n", i)
+ blocks = blocks[i+1:]
- // XXX this needs a lot of attention
- blocks = nil
- break
+ continue
} else if err != nil {
// immediatly unregister the false peer but do not disconnect
d.UnregisterPeer(d.activePeer)
diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go
index 8843ca0c7..5518163ca 100644
--- a/eth/downloader/downloader_test.go
+++ b/eth/downloader/downloader_test.go
@@ -62,10 +62,10 @@ func (dl *downloadTester) hasBlock(hash common.Hash) bool {
return false
}
-func (dl *downloadTester) insertChain(blocks types.Blocks) error {
+func (dl *downloadTester) insertChain(blocks types.Blocks) (int, error) {
dl.insertedBlocks += len(blocks)
- return nil
+ return 0, nil
}
func (dl *downloadTester) getHashes(hash common.Hash) error {
diff --git a/eth/handler.go b/eth/handler.go
index 61149049e..fecd71632 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -346,6 +346,8 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
if err := request.Block.ValidateFields(); err != nil {
return errResp(ErrDecode, "block validation %v: %v", msg, err)
}
+ request.Block.ReceivedAt = msg.ReceivedAt
+
hash := request.Block.Hash()
// Add the block hash as a known hash to the peer. This will later be used to determine
// who should receive this.
@@ -376,7 +378,7 @@ func (self *ProtocolManager) handleMsg(p *peer) error {
// if the parent exists we process the block and propagate to our peers
// if the parent does not exists we delegate to the downloader.
if self.chainman.HasBlock(request.Block.ParentHash()) {
- if err := self.chainman.InsertChain(types.Blocks{request.Block}); err != nil {
+ if _, err := self.chainman.InsertChain(types.Blocks{request.Block}); err != nil {
// handle error
return nil
}
@@ -419,7 +421,7 @@ func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block)
for _, peer := range peers {
peer.sendNewBlock(block)
}
- glog.V(logger.Detail).Infoln("broadcast block to", len(peers), "peers")
+ glog.V(logger.Detail).Infoln("broadcast block to", len(peers), "peers. Total propagation time:", time.Since(block.ReceivedAt))
}
// BroadcastTx will propagate the block to its connected peers. It will sort