diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 2ac155e33..c42e91615 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -34,6 +34,7 @@ func (js *jsre) adminBindings() { admin.Set("export", js.exportChain) admin.Set("verbosity", js.verbosity) admin.Set("backtrace", js.backtrace) + admin.Set("progress", js.downloadProgress) admin.Set("miner", struct{}{}) t, _ = admin.Get("miner") @@ -51,6 +52,12 @@ func (js *jsre) adminBindings() { debug.Set("getBlockRlp", js.getBlockRlp) } +func (js *jsre) downloadProgress(call otto.FunctionCall) otto.Value { + current, max := js.ethereum.Downloader().Stats() + + return js.re.ToVal(fmt.Sprintf("%d/%d", current, max)) +} + func (js *jsre) getBlockRlp(call otto.FunctionCall) otto.Value { var block *types.Block if len(call.ArgumentList) > 0 { diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index c4af5e17b..addcbcc44 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -41,6 +41,17 @@ type chainInsertFn func(types.Blocks) error type hashIterFn func() (common.Hash, error) type currentTdFn func() *big.Int +type blockPack struct { + peerId string + blocks []*types.Block +} + +type syncPack struct { + peer *peer + hash common.Hash + ignoreInitial bool +} + type Downloader struct { mu sync.RWMutex queue *queue @@ -65,17 +76,6 @@ type Downloader struct { quit chan struct{} } -type blockPack struct { - peerId string - blocks []*types.Block -} - -type syncPack struct { - peer *peer - hash common.Hash - ignoreInitial bool -} - func New(hasBlock hashCheckFn, insertChain chainInsertFn, currentTd currentTdFn) *Downloader { downloader := &Downloader{ queue: newqueue(), @@ -95,6 +95,10 @@ func New(hasBlock hashCheckFn, insertChain chainInsertFn, currentTd currentTdFn) return downloader } +func (d *Downloader) Stats() (current int, max int) { + return d.queue.blockHashes.Size(), d.queue.fetchPool.Size() + d.queue.hashPool.Size() +} + func (d *Downloader) RegisterPeer(id string, td *big.Int, hash common.Hash, getHashes hashFetcherFn, getBlocks blockFetcherFn) error { d.mu.Lock() defer d.mu.Unlock()