diff options
author | Felix Lange <fjl@twurst.com> | 2016-10-11 02:38:27 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-11 02:38:27 +0800 |
commit | be6a3696a9642c9511c565f4c35d1c8aae6434ad (patch) | |
tree | 9954d837719e7ce421c0685089a49830cc627519 /core | |
parent | 7943ecb81292c09d85abb2509f76fd3637810eca (diff) | |
parent | 82b14a05f2c1aca2df62e8fd5da9df6934fed2de (diff) | |
download | go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar.gz go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar.bz2 go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar.lz go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar.xz go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.tar.zst go-tangerine-be6a3696a9642c9511c565f4c35d1c8aae6434ad.zip |
Merge pull request #3104 from fjl/core-import-log
core: print import stats more often
Diffstat (limited to 'core')
-rw-r--r-- | core/blockchain.go | 53 |
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 |