From 7508f4d5d2499f91573b3cf2b513acbe2a06ea12 Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Mon, 29 Jul 2024 16:23:16 +0200 Subject: [PATCH] fix(disc): schedule revalidation also when all nodes are excluded --- p2p/discover/table_reval.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/p2p/discover/table_reval.go b/p2p/discover/table_reval.go index f2ea8b34fa..c043dbd148 100644 --- a/p2p/discover/table_reval.go +++ b/p2p/discover/table_reval.go @@ -77,13 +77,11 @@ func (tr *tableRevalidation) nodeEndpointChanged(tab *Table, n *tableNode) { // It returns the next time it should be invoked, which is used in the Table main loop // to schedule a timer. However, run can be called at any time. func (tr *tableRevalidation) run(tab *Table, now mclock.AbsTime) (nextTime mclock.AbsTime) { - if n := tr.fast.get(now, &tab.rand, tr.activeReq); n != nil { + if n := tr.fast.getAndSchedule(now, &tab.rand, tr.activeReq); n != nil { tr.startRequest(tab, n) - tr.fast.schedule(now, &tab.rand) } - if n := tr.slow.get(now, &tab.rand, tr.activeReq); n != nil { + if n := tr.slow.getAndSchedule(now, &tab.rand, tr.activeReq); n != nil { tr.startRequest(tab, n) - tr.slow.schedule(now, &tab.rand) } return min(tr.fast.nextTime, tr.slow.nextTime) @@ -198,9 +196,14 @@ type revalidationList struct { name string } -// get returns a random node from the queue. Nodes in the 'exclude' map are not returned. -func (list *revalidationList) get(now mclock.AbsTime, rand randomSource, exclude map[enode.ID]struct{}) *tableNode { - if now < list.nextTime || len(list.nodes) == 0 { +// getAndSchedule returns a random node from the queue. Nodes in the 'exclude' map are not returned. +// It also schedules the next invocation if nextTime has already passed. +func (list *revalidationList) getAndSchedule(now mclock.AbsTime, rand randomSource, exclude map[enode.ID]struct{}) *tableNode { + if now < list.nextTime { + return nil + } + list.schedule(now, rand) + if len(list.nodes) == 0 { return nil } for i := 0; i < len(list.nodes)*3; i++ {