headscale/hscontrol/mapper
Kristoffer Dalby 87b8507ac9 mapper/batcher: replace connected map with per-node disconnectedAt
The Batcher's connected field (*xsync.Map[types.NodeID, *time.Time])
encoded three states via pointer semantics:

  - nil value:    node is connected
  - non-nil time: node disconnected at that timestamp
  - key missing:  node was never seen

This was error-prone (nil meaning 'connected' inverts Go idioms),
redundant with b.nodes + hasActiveConnections(), and required keeping
two parallel maps in sync. It also contained a bug in RemoveNode where
new(time.Now()) was used instead of &now, producing a zero time.

Replace the separate connected map with a disconnectedAt field on
multiChannelNodeConn (atomic.Pointer[time.Time]), tracked directly
on the object that already manages the node's connections.

Changes:
  - Add disconnectedAt field and helpers (markConnected, markDisconnected,
    isConnected, offlineDuration) to multiChannelNodeConn
  - Remove the connected field from Batcher
  - Simplify IsConnected from two map lookups to one
  - Simplify ConnectedMap and Debug from two-map iteration to one
  - Rewrite cleanupOfflineNodes to scan b.nodes directly
  - Remove the markDisconnectedIfNoConns helper
  - Update all tests and benchmarks

Fixes #3141
2026-03-16 02:22:56 -07:00
..
batcher.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
batcher_bench_test.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
batcher_concurrency_test.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
batcher_scale_bench_test.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
batcher_test.go mapper/batcher: remove disabled X-prefixed test functions 2026-03-14 02:52:28 -07:00
batcher_unit_test.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
builder.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
builder_test.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
mapper.go mapper: remove Batcher interface, rename to Batcher struct 2026-03-14 02:52:28 -07:00
mapper_test.go all: upgrade to Go 1.26rc2 and modernize codebase 2026-02-08 12:35:23 +01:00
node_conn.go mapper/batcher: replace connected map with per-node disconnectedAt 2026-03-16 02:22:56 -07:00
tail_test.go all: upgrade to Go 1.26rc2 and modernize codebase 2026-02-08 12:35:23 +01:00