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
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
@ -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.
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")
return nil
@ -183,22 +191,15 @@ func (s *Service) Start() error {
// Stop implements node.Lifecycle, terminating the monitoring and reporting daemon.
func (s *Service) Stop() error {
s.headSub.Unsubscribe()
s.txSub.Unsubscribe()
log.Info("Stats daemon stopped")
return nil
}
// loop keeps trying to connect to the netstats server, reporting chain events
// until termination.
func (s *Service) loop() {
// 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()
func (s *Service) loop(chainHeadCh chan core.ChainHeadEvent, txEventCh chan core.NewTxsEvent) {
// Forensics events
forensicsEventCh := make(chan types.ForensicsEvent)
if engine, ok := s.engine.(consensusEngine); ok && engine != nil {
@ -244,9 +245,9 @@ func (s *Service) loop() {
}
// node stopped
case <-txSub.Err():
case <-s.txSub.Err():
break HandleLoop
case <-headSub.Err():
case <-s.headSub.Err():
break HandleLoop
}
}