cmd/geth, eth/downloader: collect and report import progress too

pull/1224/head
Péter Szilágyi 9 years ago
parent e972a116ac
commit b3d5ce7d48
  1. 8
      cmd/geth/admin.go
  2. 39
      eth/downloader/downloader.go

@ -51,7 +51,7 @@ func (js *jsre) adminBindings() {
admin.Set("import", js.importChain) admin.Set("import", js.importChain)
admin.Set("export", js.exportChain) admin.Set("export", js.exportChain)
admin.Set("verbosity", js.verbosity) admin.Set("verbosity", js.verbosity)
admin.Set("progress", js.downloadProgress) admin.Set("progress", js.syncProgress)
admin.Set("setSolc", js.setSolc) admin.Set("setSolc", js.setSolc)
admin.Set("contractInfo", struct{}{}) admin.Set("contractInfo", struct{}{})
@ -324,9 +324,9 @@ func (js *jsre) setHead(call otto.FunctionCall) otto.Value {
return otto.UndefinedValue() return otto.UndefinedValue()
} }
func (js *jsre) downloadProgress(call otto.FunctionCall) otto.Value { func (js *jsre) syncProgress(call otto.FunctionCall) otto.Value {
pending, cached := js.ethereum.Downloader().Stats() pending, cached, importing := js.ethereum.Downloader().Stats()
v, _ := call.Otto.ToValue(map[string]interface{}{"pending": pending, "cached": cached}) v, _ := call.Otto.ToValue(map[string]interface{}{"pending": pending, "cached": cached, "importing": importing})
return v return v
} }

@ -78,6 +78,10 @@ type Downloader struct {
checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain
banned *set.Set // Set of hashes we've received and banned banned *set.Set // Set of hashes we've received and banned
// Statistics
importQueue []common.Hash // Hashes of the previously taken blocks to check import progress
importLock sync.Mutex
// Callbacks // Callbacks
hasBlock hashCheckFn hasBlock hashCheckFn
getBlock getBlockFn getBlock getBlockFn
@ -121,8 +125,21 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock getBlockFn) *Downloa
return downloader return downloader
} }
func (d *Downloader) Stats() (current int, max int) { // Stats retrieves the current status of the downloader.
return d.queue.Size() func (d *Downloader) Stats() (pending int, cached int, importing int) {
// Fetch the download status
pending, cached = d.queue.Size()
// Generate the import status
d.importLock.Lock()
defer d.importLock.Unlock()
for len(d.importQueue) > 0 && d.hasBlock(d.importQueue[0]) {
d.importQueue = d.importQueue[1:]
}
importing = len(d.importQueue)
return
} }
// Synchronising returns the state of the downloader // Synchronising returns the state of the downloader
@ -202,7 +219,17 @@ func (d *Downloader) Synchronise(id string, hash common.Hash) error {
// TakeBlocks takes blocks from the queue and yields them to the caller. // TakeBlocks takes blocks from the queue and yields them to the caller.
func (d *Downloader) TakeBlocks() []*Block { func (d *Downloader) TakeBlocks() []*Block {
return d.queue.TakeBlocks() blocks := d.queue.TakeBlocks()
if len(blocks) > 0 {
hashes := make([]common.Hash, len(blocks))
for i, block := range blocks {
hashes[i] = block.RawBlock.Hash()
}
d.importLock.Lock()
d.importQueue = hashes
d.importLock.Unlock()
}
return blocks
} }
// Has checks if the downloader knows about a particular hash, meaning that its // Has checks if the downloader knows about a particular hash, meaning that its
@ -255,9 +282,13 @@ func (d *Downloader) Cancel() bool {
} }
d.cancelLock.Unlock() d.cancelLock.Unlock()
// reset the queue // Reset the queue and import statistics
d.queue.Reset() d.queue.Reset()
d.importLock.Lock()
d.importQueue = nil
d.importLock.Unlock()
return true return true
} }

Loading…
Cancel
Save