diff --git a/eth/handler.go b/eth/handler.go index 90d74a71bf..3b6dbec1a5 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -406,6 +406,7 @@ func (h *handler) unregisterPeer(id string) { } h.downloader.UnregisterPeer(id) h.txFetcher.Drop(id) + h.txTracker.NotifyPeerDrop(id) if err := h.peers.unregisterPeer(id); err != nil { logger.Error("Ethereum peer removal failed", "err", err) diff --git a/eth/txtracker/tracker.go b/eth/txtracker/tracker.go index 8458c8253d..28f7f27aab 100644 --- a/eth/txtracker/tracker.go +++ b/eth/txtracker/tracker.go @@ -85,6 +85,14 @@ func (t *Tracker) Start(chain Chain) { go t.loop() } +// NotifyPeerDrop removes a disconnected peer's stats to prevent unbounded +// growth. Safe to call from any goroutine. +func (t *Tracker) NotifyPeerDrop(peer string) { + t.mu.Lock() + defer t.mu.Unlock() + delete(t.peers, peer) +} + // Stop shuts down the tracker. func (t *Tracker) Stop() { t.sub.Unsubscribe()