aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-10-07 20:25:01 +0800
committerFelix Lange <fjl@twurst.com>2016-10-08 03:03:38 +0800
commite66b158f0bf85edf39edc978241226cb8f7df45b (patch)
treea4934ffac3b6a7b7270d3c7e4dc1af2aec343d68 /core/blockchain.go
parentc88e4357240d8c92d7866cb805781b792e166ec2 (diff)
downloaddexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar.gz
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar.bz2
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar.lz
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar.xz
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.tar.zst
dexon-e66b158f0bf85edf39edc978241226cb8f7df45b.zip
core: print import stats more often
If geth is busy importing 2048 heavy blocks it can take a while before it prints anything. This change ensures that a message gets printed every 8s.
Diffstat (limited to 'core/blockchain.go')
-rw-r--r--core/blockchain.go53
1 files changed, 42 insertions, 11 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index 1fbcdfc6f..01aa987dd 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -834,19 +834,16 @@ func (self *BlockChain) InsertChain(chain types.Blocks) (int, error) {
// faster than direct delivery and requires much less mutex
// acquiring.
var (
- stats struct{ queued, processed, ignored int }
+ stats = insertStats{startTime: time.Now()}
events = make([]interface{}, 0, len(chain))
coalescedLogs vm.Logs
- tstart = time.Now()
-
- nonceChecked = make([]bool, len(chain))
+ nonceChecked = make([]bool, len(chain))
)
// Start the parallel nonce verifier.
nonceAbort, nonceResults := verifyNoncesFromBlocks(self.pow, chain)
defer close(nonceAbort)
- txcount := 0
for i, block := range chain {
if atomic.LoadInt32(&self.procInterrupt) == 1 {
glog.V(logger.Debug).Infoln("Premature abort during block chain processing")
@@ -941,7 +938,6 @@ func (self *BlockChain) InsertChain(chain types.Blocks) (int, error) {
return i, err
}
- txcount += len(block.Transactions())
// write the block to the chain and get the status
status, err := self.WriteBlock(block)
if err != nil {
@@ -976,19 +972,54 @@ func (self *BlockChain) InsertChain(chain types.Blocks) (int, error) {
case SplitStatTy:
events = append(events, ChainSplitEvent{block, logs})
}
+
stats.processed++
+ if glog.V(logger.Info) {
+ stats.report(chain, i)
+ }
}
- if (stats.queued > 0 || stats.processed > 0 || stats.ignored > 0) && bool(glog.V(logger.Info)) {
- tend := time.Since(tstart)
- start, end := chain[0], chain[len(chain)-1]
- glog.Infof("imported %d block(s) (%d queued %d ignored) including %d txs in %v. #%v [%x / %x]\n", stats.processed, stats.queued, stats.ignored, txcount, tend, end.Number(), start.Hash().Bytes()[:4], end.Hash().Bytes()[:4])
- }
go self.postChainEvents(events, coalescedLogs)
return 0, nil
}
+// insertStats tracks and reports on block insertion.
+type insertStats struct {
+ queued, processed, ignored int
+ lastIndex int
+ startTime time.Time
+}
+
+const (
+ statsReportLimit = 1024
+ statsReportTimeLimit = 8 * time.Second
+)
+
+// report prints statistics if some number of blocks have been processed
+// or more than a few seconds have passed since the last message.
+func (st *insertStats) report(chain []*types.Block, index int) {
+ limit := statsReportLimit
+ if index == len(chain)-1 {
+ limit = 0 // Always print a message for the last block.
+ }
+ now := time.Now()
+ duration := now.Sub(st.startTime)
+ if duration > statsReportTimeLimit || st.queued > limit || st.processed > limit || st.ignored > limit {
+ start, end := chain[st.lastIndex], chain[index]
+ txcount := countTransactions(chain[st.lastIndex:index])
+ glog.Infof("imported %d block(s) (%d queued %d ignored) including %d txs in %v. #%v [%x / %x]\n", st.processed, st.queued, st.ignored, txcount, duration, end.Number(), start.Hash().Bytes()[:4], end.Hash().Bytes()[:4])
+ *st = insertStats{startTime: now, lastIndex: index}
+ }
+}
+
+func countTransactions(chain []*types.Block) (c int) {
+ for _, b := range chain {
+ c += len(b.Transactions())
+ }
+ return c
+}
+
// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them
// to be part of the new canonical chain and accumulates potential missing transactions and post an
// event about them