go-ethereum/p2p/discover
rayoo c944ff3d54 p2p/discover: restore nextTimeout update in UDPv4 resetTimeout loop
The refactor from `for el := plist.Front(); ...; el = el.Next()` to the
new `iterList` iterator in #34743 silently dropped two things needed by
resetTimeout:

  1. `nextTimeout = el.Value.(*replyMatcher)` at the top of the loop.
     This assignment is what gives `nextTimeout` its documented meaning
     ("head of plist when timeout was last reset"), and what makes the
     early-return optimization at the top of resetTimeout work. Without
     it, nextTimeout is only ever written to nil, so
     `nextTimeout == plist.Front().Value` is always false and the
     optimization is dead.

  2. `nextTimeout.errc <- errClockWarp` in the clock-warp branch now
     reads a stale or nil pointer. Prior to the refactor, the inner
     assignment kept nextTimeout pointing at the current matcher so its
     errc was the right channel to receive the errClockWarp signal.
     After the refactor, on first entry into the clock-warp branch
     nextTimeout is nil, which panics the UDPv4 loop goroutine with a
     nil pointer deref and takes discv4 down.

Re-assign `nextTimeout = p` at the head of the loop (restoring the
documented invariant) and send the clock-warp error on `p.errc` rather
than the now-stale `nextTimeout.errc`.

The clock-warp branch triggers only when the system clock jumps
backward after a deadline is assigned (deadline - time.Now() >=
2*respTimeout, i.e. at least ~500ms backward jump), which is why this
regression slipped past CI - it is not exercised by any existing unit
test, and writing one would require plumbing a clock through the loop.
2026-05-05 15:53:58 +08:00
..
v4wire p2p/discover: refactor node and endpoint representation (#29844) 2024-05-29 15:02:26 +02:00
v5wire p2p/discover/v5wire: use Whoareyou.ChallengeData instead of storing encoded packet (#31547) 2026-02-22 21:58:47 +01:00
common.go p2p/discover: fix timeout loop early exit when removing expired matchers (#34743) 2026-04-28 10:57:58 +02:00
lookup.go p2p/discover: remove hot-spin in table refresh trigger (#32912) 2025-10-15 11:51:33 +02:00
metrics.go metrics, cmd/geth: change init-process of metrics (#30814) 2024-12-10 13:27:29 +01:00
node.go p2p/discover: remove type encPubkey (#30172) 2024-07-18 11:09:02 +02:00
ntp.go all: remove dependency on golang.org/exp (#29314) 2024-03-25 07:50:18 +01:00
table.go p2p/discover: resolve DNS hostnames for bootstrap nodes (#34101) 2026-03-28 11:37:39 +01:00
table_reval.go p2p/discover: remove unused parameter in revalidationList.get (#31155) 2025-02-11 13:45:44 +01:00
table_reval_test.go p2p/discover: refactor node and endpoint representation (#29844) 2024-05-29 15:02:26 +02:00
table_test.go p2p/discover: resolve DNS hostnames for bootstrap nodes (#34101) 2026-03-28 11:37:39 +01:00
table_util_test.go p2p/discover: remove type encPubkey (#30172) 2024-07-18 11:09:02 +02:00
v4_lookup_test.go Revert "p2p/discover: add test for lookup returning immediately" 2025-09-12 11:29:43 +02:00
v4_udp.go p2p/discover: restore nextTimeout update in UDPv4 resetTimeout loop 2026-05-05 15:53:58 +08:00
v4_udp_test.go p2p/discover: wait for bootstrap to be done (#32881) 2025-10-13 19:58:50 +02:00
v5_talk.go p2p/discover: pass node instead of node ID to TALKREQ handler (#31075) 2025-04-02 14:56:21 +02:00
v5_udp.go p2p/discover: remove delay from discv5 RandomNodes (#32517) 2025-09-10 19:51:04 +02:00
v5_udp_test.go p2p/discover: fix flaky TestUDPv5_findnodeHandling (#34109) 2026-04-14 09:43:44 +02:00