p2p/tracker: fix crash in clean when tracker is stopped

This commit is contained in:
Felix Lange 2026-03-03 08:07:49 +01:00
parent 723aae2b4e
commit 1a482cac6a
2 changed files with 23 additions and 0 deletions

View file

@ -138,6 +138,10 @@ func (t *Tracker) clean() {
t.lock.Lock() t.lock.Lock()
defer t.lock.Unlock() defer t.lock.Unlock()
if t.expire == nil {
return
}
// Expire anything within a certain threshold (might be no items at all if // Expire anything within a certain threshold (might be no items at all if
// we raced with the delivery) // we raced with the delivery)
for t.expire.Len() > 0 { for t.expire.Len() > 0 {

View file

@ -24,6 +24,25 @@ import (
"github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p"
) )
// TestCleanAfterStop verifies that the clean method does not crash when called
// after Stop. This can happen because clean is scheduled via time.AfterFunc and
// may fire after Stop sets t.expire to nil.
func TestCleanAfterStop(t *testing.T) {
cap := p2p.Cap{Name: "test", Version: 1}
timeout := 50 * time.Millisecond
tr := New(cap, "peer1", timeout)
// Track a request to start the expiration timer.
tr.Track(Request{ID: 1, ReqCode: 0x01, RespCode: 0x02, Size: 1})
// Stop the tracker, then wait for the timer to fire.
tr.Stop()
time.Sleep(timeout + 50*time.Millisecond)
// Also verify that calling clean directly after stop doesn't panic.
tr.clean()
}
// This checks that metrics gauges for pending requests are be decremented when a // This checks that metrics gauges for pending requests are be decremented when a
// Tracker is stopped. // Tracker is stopped.
func TestMetricsOnStop(t *testing.T) { func TestMetricsOnStop(t *testing.T) {