mirror of
https://github.com/juanfont/headscale.git
synced 2026-07-13 11:29:09 +09:00
c1ecc562d2
electPrimaryRoutes' all-unhealthy fallback used to pick candidates[0] (lowest NodeID) regardless of who was prev primary. Under cable-pull semantics IsOnline lags reality (long-poll TCP half-open), so both routers stay in candidates and both go Unhealthy via the prober — the fallback then churned primary to a node that was itself unreachable. Prefer prev when still in candidates; fall through to candidates[0] only when prev is gone. Anti-blackhole property is preserved (peers still see *some* primary), but no flap to a known-bad node. Update the property test's reference model to mirror the new algorithm and split the unit test into existence (KeepsAPrimary) and identity (PreservesPrevious) cases — the old "lowest-ID wins" assertion encoded the bug. Fixes #3203