diff --git a/eth/backend.go b/eth/backend.go index 356e7fd1a..d0a56de1c 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -217,7 +217,7 @@ func New(config *Config) (*Ethereum, error) { } eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.EventMux()) - eth.downloader = downloader.New(eth.chainManager.HasBlock, eth.chainManager.InsertChain, eth.chainManager.Td) + eth.downloader = downloader.New(eth.chainManager.HasBlock, eth.chainManager.InsertChain) eth.pow = ethash.New(eth.chainManager) eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State) eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.txPool, eth.chainManager, eth.EventMux()) @@ -448,7 +448,7 @@ func (self *Ethereum) SuggestPeer(nodeURL string) error { } func (s *Ethereum) Stop() { - s.txSub.Unsubscribe() // quits txBroadcastLoop + s.txSub.Unsubscribe() // quits txBroadcastLoop s.protocolManager.Stop() s.txPool.Stop() diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 6ac8310b3..00c4cd88f 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -39,7 +39,6 @@ var ( type hashCheckFn func(common.Hash) bool type chainInsertFn func(types.Blocks) error type hashIterFn func() (common.Hash, error) -type currentTdFn func() *big.Int type blockPack struct { peerId string @@ -61,7 +60,6 @@ type Downloader struct { // Callbacks hasBlock hashCheckFn insertChain chainInsertFn - currentTd currentTdFn // Status fetchingHashes int32 @@ -76,13 +74,12 @@ type Downloader struct { quit chan struct{} } -func New(hasBlock hashCheckFn, insertChain chainInsertFn, currentTd currentTdFn) *Downloader { +func New(hasBlock hashCheckFn, insertChain chainInsertFn) *Downloader { downloader := &Downloader{ queue: newqueue(), peers: make(peers), hasBlock: hasBlock, insertChain: insertChain, - currentTd: currentTd, newPeerCh: make(chan *peer, 1), syncCh: make(chan syncPack, 1), hashCh: make(chan []common.Hash, 1), diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 1d449cfba..ddb3ec7ae 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -49,7 +49,7 @@ type downloadTester struct { func newTester(t *testing.T, hashes []common.Hash, blocks map[common.Hash]*types.Block) *downloadTester { tester := &downloadTester{t: t, hashes: hashes, blocks: blocks, done: make(chan bool)} - downloader := New(tester.hasBlock, tester.insertChain, func() *big.Int { return new(big.Int) }) + downloader := New(tester.hasBlock, tester.insertChain) tester.downloader = downloader return tester @@ -112,7 +112,8 @@ func TestDownload(t *testing.T) { minDesiredPeerCount = 4 blockTtl = 1 * time.Second - hashes := createHashes(0, 1000) + targetBlocks := 1000 + hashes := createHashes(0, targetBlocks) blocks := createBlocksFromHashes(hashes) tester := newTester(t, hashes, blocks) @@ -121,21 +122,21 @@ func TestDownload(t *testing.T) { tester.badBlocksPeer("peer3", big.NewInt(0), common.Hash{}) tester.badBlocksPeer("peer4", big.NewInt(0), common.Hash{}) -success: - select { - case <-tester.done: - break success - case <-time.After(10 * time.Second): // XXX this could actually fail on a slow computer - t.Error("timeout") + blox, err := tester.downloader.Synchronise("peer1", hashes[0]) + if err != nil { + t.Error("download error", err) + } + + if len(blox) != targetBlocks { + t.Error("expected", targetBlocks, "have", len(blox)) } } func TestMissing(t *testing.T) { - t.Skip() - glog.SetV(logger.Detail) glog.SetToStderr(true) + targetBlocks := 1000 hashes := createHashes(0, 1000) extraHashes := createHashes(1001, 1003) blocks := createBlocksFromHashes(append(extraHashes, hashes...)) @@ -146,13 +147,12 @@ func TestMissing(t *testing.T) { hashes = append(extraHashes, hashes[:len(hashes)-1]...) tester.newPeer("peer2", big.NewInt(0), common.Hash{}) -success1: - select { - case <-tester.done: - break success1 - case <-time.After(10 * time.Second): // XXX this could actually fail on a slow computer - t.Error("timout") + blox, err := tester.downloader.Synchronise("peer1", hashes[0]) + if err != nil { + t.Error("download error", err) } - tester.downloader.AddBlock("peer2", blocks[hashes[len(hashes)-1]], big.NewInt(10001)) + if len(blox) != targetBlocks { + t.Error("expected", targetBlocks, "have", len(blox)) + } } diff --git a/eth/handler.go b/eth/handler.go index a1b03f57c..a5bc125da 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -134,14 +134,14 @@ out: if len(pm.peers) < minDesiredPeerCount { break } - itimer.Stop() // Find the best peer peer := getBestPeer(pm.peers) if peer == nil { glog.V(logger.Debug).Infoln("Sync attempt cancelled. No peers available") - return } + + itimer.Stop() go pm.synchronise(peer) case <-itimer.C: // The timer will make sure that the downloader keeps an active state