ethstats: avoid creating subscriptions on background goroutine #22587 (#1445)

This commit is contained in:
Daniel Liu 2025-09-08 15:38:18 +08:00 committed by GitHub
parent 3d59a3930f
commit 24a1f37892
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -102,6 +102,9 @@ type Service struct {
pongCh chan struct{} // Pong notifications are fed into this channel pongCh chan struct{} // Pong notifications are fed into this channel
histCh chan []uint64 // History request block numbers are fed into this channel histCh chan []uint64 // History request block numbers are fed into this channel
headSub event.Subscription
txSub event.Subscription
} }
// connWrapper is a wrapper to prevent concurrent-write or concurrent-read on the // connWrapper is a wrapper to prevent concurrent-write or concurrent-read on the
@ -175,7 +178,12 @@ func New(node *node.Node, backend backend, engine consensus.Engine, url string)
// Start implements node.Lifecycle, starting up the monitoring and reporting daemon. // Start implements node.Lifecycle, starting up the monitoring and reporting daemon.
func (s *Service) Start() error { func (s *Service) Start() error {
go s.loop() // Subscribe to chain events to execute updates on
chainHeadCh := make(chan core.ChainHeadEvent, chainHeadChanSize)
s.headSub = s.backend.SubscribeChainHeadEvent(chainHeadCh)
txEventCh := make(chan core.NewTxsEvent, txChanSize)
s.txSub = s.backend.SubscribeNewTxsEvent(txEventCh)
go s.loop(chainHeadCh, txEventCh)
log.Info("Stats daemon started") log.Info("Stats daemon started")
return nil return nil
@ -183,22 +191,15 @@ func (s *Service) Start() error {
// Stop implements node.Lifecycle, terminating the monitoring and reporting daemon. // Stop implements node.Lifecycle, terminating the monitoring and reporting daemon.
func (s *Service) Stop() error { func (s *Service) Stop() error {
s.headSub.Unsubscribe()
s.txSub.Unsubscribe()
log.Info("Stats daemon stopped") log.Info("Stats daemon stopped")
return nil return nil
} }
// loop keeps trying to connect to the netstats server, reporting chain events // loop keeps trying to connect to the netstats server, reporting chain events
// until termination. // until termination.
func (s *Service) loop() { func (s *Service) loop(chainHeadCh chan core.ChainHeadEvent, txEventCh chan core.NewTxsEvent) {
// Subscribe to chain events to execute updates on
chainHeadCh := make(chan core.ChainHeadEvent, chainHeadChanSize)
headSub := s.backend.SubscribeChainHeadEvent(chainHeadCh)
defer headSub.Unsubscribe()
txEventCh := make(chan core.NewTxsEvent, txChanSize)
txSub := s.backend.SubscribeNewTxsEvent(txEventCh)
defer txSub.Unsubscribe()
// Forensics events // Forensics events
forensicsEventCh := make(chan types.ForensicsEvent) forensicsEventCh := make(chan types.ForensicsEvent)
if engine, ok := s.engine.(consensusEngine); ok && engine != nil { if engine, ok := s.engine.(consensusEngine); ok && engine != nil {
@ -244,9 +245,9 @@ func (s *Service) loop() {
} }
// node stopped // node stopped
case <-txSub.Err(): case <-s.txSub.Err():
break HandleLoop break HandleLoop
case <-headSub.Err(): case <-s.headSub.Err():
break HandleLoop break HandleLoop
} }
} }