aboutsummaryrefslogtreecommitdiffstats
path: root/ethstats
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2016-11-29 19:54:54 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-11-29 20:17:20 +0800
commit7dfeceb8ccab9e986229804ef522bcd042ab28d1 (patch)
tree5caba27178c38d2d14e3c8189c6522f268efc831 /ethstats
parent3807e520ec99dce5dc6ef28b237cd4be4a0992fe (diff)
downloadgo-tangerine-7dfeceb8ccab9e986229804ef522bcd042ab28d1.tar.gz
go-tangerine-7dfeceb8ccab9e986229804ef522bcd042ab28d1.tar.zst
go-tangerine-7dfeceb8ccab9e986229804ef522bcd042ab28d1.zip
ethstats: don't drop concurrent head reports (mini forks)
Diffstat (limited to 'ethstats')
-rw-r--r--ethstats/ethstats.go32
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