aboutsummaryrefslogtreecommitdiffstats
path: root/eth
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-06-15 18:05:01 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-06-15 18:05:01 +0800
commit9c03c374e32541c905adb9a3b8783cd721117030 (patch)
tree72b0f11700cce918a933405d542113177312a665 /eth
parentb240983e2bafcde1c5902ce3a196b22475412f16 (diff)
downloaddexon-9c03c374e32541c905adb9a3b8783cd721117030.tar.gz
dexon-9c03c374e32541c905adb9a3b8783cd721117030.tar.zst
dexon-9c03c374e32541c905adb9a3b8783cd721117030.zip
eth/downloader: fix import statistic reset, fetch hashes async
Diffstat (limited to 'eth')
-rw-r--r--eth/downloader/downloader.go25
1 files changed, 14 insertions, 11 deletions
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 1bbba11ed..7f8ef12ee 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -316,13 +316,8 @@ func (d *Downloader) Cancel() {
}
d.cancelLock.Unlock()
- // Reset the queue and import statistics
+ // Reset the queue
d.queue.Reset()
-
- d.importLock.Lock()
- d.importQueue = nil
- d.importDone = 0
- d.importLock.Unlock()
}
// fetchHahes starts retrieving hashes backwards from a specific peer and hash,
@@ -345,7 +340,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
<-timeout.C // timeout channel should be initially empty.
getHashes := func(from common.Hash) {
- active.getHashes(from)
+ go active.getHashes(from)
timeout.Reset(hashTTL)
}
@@ -414,9 +409,9 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error {
expire: time.Now().Add(blockSoftTTL),
parent: parent,
}
- active.getBlocks([]common.Hash{origin})
+ go active.getBlocks([]common.Hash{origin})
- // Also fetch a fresh
+ // Also fetch a fresh batch of hashes
getHashes(head)
continue
}
@@ -720,8 +715,16 @@ func (d *Downloader) process() (err error) {
err = d.process()
}
}()
- // Release the lock upon exit (note, before checking for reentry!)
- defer atomic.StoreInt32(&d.processing, 0)
+ // Release the lock upon exit (note, before checking for reentry!), and set
+ // the import statistics to zero.
+ defer func() {
+ d.importLock.Lock()
+ d.importQueue = nil
+ d.importDone = 0
+ d.importLock.Unlock()
+
+ atomic.StoreInt32(&d.processing, 0)
+ }()
// Fetch the current cancel channel to allow termination
d.cancelLock.RLock()