mapper: fix empty Peers list not clearing client peer state
When a FullUpdate produces zero visible peers (e.g., a restrictive policy isolates a node), the MapResponse has Peers: [] (empty non-nil). The Tailscale client only processes Peers as a full replacement when len(Peers) > 0 (controlclient/map.go:462), so an empty list is silently ignored and stale peers persist. This triggers when a FullUpdate() replaces a pending PolicyChange() in the batcher. The PolicyChange would have used computePeerDiff to send explicit PeersRemoved, but the FullUpdate goes through buildFromChange which sets Peers: [] that the client ignores. When a full update produces zero peers, compute the peer diff against lastSentPeers and add explicit PeersRemoved entries so the client correctly clears its stale peer state.
K
Kristoffer Dalby committed
9371b4ee2889fc4d605d89a299cec3cb6a925710
Parent: cef5338
Committed by Kristoffer Dalby <kristoffer@dalby.cc>
on 4/10/2026, 12:18:56 PM