diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-11-30 18:36:22 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-30 18:36:22 +0800 |
commit | a90a170361f278d1ea4799a4c270f17f9c574779 (patch) | |
tree | 57b20c50bedeb0d4d729c34c35b184fe9e2a186b | |
parent | 889a5e0cf102a44e3f3f385d5b8b2228f795ac85 (diff) | |
parent | 7dfeceb8ccab9e986229804ef522bcd042ab28d1 (diff) | |
download | dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar.gz dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar.bz2 dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar.lz dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar.xz dexon-a90a170361f278d1ea4799a4c270f17f9c574779.tar.zst dexon-a90a170361f278d1ea4799a4c270f17f9c574779.zip |
Merge pull request #3373 from karalabe/ethstats-block-fields
ethstats: don't drop concurrent head reports (mini forks)
-rw-r--r-- | ethstats/ethstats.go | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index 4efa4a813..b87f5ab78 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -144,18 +144,13 @@ func (s *Service) loop() { if err = s.report(in, out); err != nil { glog.V(logger.Warn).Infof("Full stats report failed: %v", err) } - case <-headSub.Chan(): - // Exhaust events to avoid reporting too frequently - for exhausted := false; !exhausted; { - select { - case <-headSub.Chan(): - default: - exhausted = true - } - } - if err = s.reportBlock(out); err != nil { + case head := <-headSub.Chan(): + if err = s.reportBlock(out, head.Data.(core.ChainHeadEvent).Block); err != nil { glog.V(logger.Warn).Infof("Block stats report failed: %v", err) } + if err = s.reportPending(out); err != nil { + glog.V(logger.Warn).Infof("Post-block transaction stats report failed: %v", err) + } case <-txSub.Chan(): // Exhaust events to avoid reporting too frequently for exhausted := false; !exhausted; { @@ -245,7 +240,7 @@ func (s *Service) report(in *json.Decoder, out *json.Encoder) error { if err := s.reportLatency(in, out); err != nil { return err } - if err := s.reportBlock(out); err != nil { + if err := s.reportBlock(out, nil); err != nil { return err } if err := s.reportPending(out); err != nil { @@ -326,7 +321,7 @@ func (s uncleStats) MarshalJSON() ([]byte, error) { } // reportBlock retrieves the current chain head and repors it to the stats server. -func (s *Service) reportBlock(out *json.Encoder) error { +func (s *Service) reportBlock(out *json.Encoder, block *types.Block) error { // Gather the head block infos from the local blockchain var ( head *types.Header @@ -336,16 +331,21 @@ func (s *Service) reportBlock(out *json.Encoder) error { ) if s.eth != nil { // Full nodes have all needed information available - block := s.eth.BlockChain().CurrentBlock() - - head = s.eth.BlockChain().CurrentHeader() + if block == nil { + block = s.eth.BlockChain().CurrentBlock() + } + head = block.Header() td = s.eth.BlockChain().GetTd(head.Hash(), head.Number.Uint64()) txs = block.Transactions() uncles = block.Uncles() } else { // Light nodes would need on-demand lookups for transactions/uncles, skip - head = s.les.BlockChain().CurrentHeader() + if block != nil { + head = block.Header() + } else { + head = s.les.BlockChain().CurrentHeader() + } td = s.les.BlockChain().GetTd(head.Hash(), head.Number.Uint64()) } // Assemble the block stats report and send it to the server |