mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-24 04:33:17 +00:00
fa02fcf5c9
While a standalone agent stays offline across a restart (up to the 72-hour continuity window), every canonical read-state lookup adds it back from host continuity by building a whole registry clone (`readStateWithRecords`). Alert evaluation makes one lookup per resource per poll, so in that state each poll rebuilt the registry once per resource. Each lookup also called `GetLiveHostsSnapshot` twice, and that went through `State.GetSnapshot()`, deep-copying every VM and container just to return the hosts. **Changes** - **Overlay cache.** The adapter keeps the last continuity overlay, keyed by: - the registry pointer; - `LastRebuiltAt` (every replace and in-place supplemental ingest updates it); - a fingerprint of the requested records. The fingerprint leaves out `Resource.UpdatedAt`, which `resourceFromHost` stamps with `time.Now()` at build time. It reuses the overlay for at most 2 s, because the overlay evaluates source staleness when it is built. The live adapter is never mutated. - **Hosts-only copy.** `GetLiveHostsSnapshot` now copies only hosts, through the existing `State.GetHosts()`. The result is identical, because `GetSnapshot` sets `Hosts: cloneHosts(s.Hosts)`. This also removes a full state copy from each agent report (`ApplyHostReport`), each config fetch and every other caller. - **Single host copy per lookup.** `readStateWithStandaloneHostContinuity` takes the host list once instead of twice. **One read-state lookup** with one offline standalone agent (synthetic, 8-node clusters, pulse-dev): | Resources | main | this PR | |---|---|---| | 130 | 3.0 ms / 1.9 MB | 13 µs / 10 KB | | 520 | 15.9 ms / 11.8 MB | 25 µs / 29 KB | | 1,040 | 41 ms / 28 MB | 39 µs / 54 KB | | 2,080 | 136 ms / 95 MB | 74 µs / 104 KB | **Tests.** Each fails when its mechanism is reverted. - `TestHostContinuityOverlayReusedWithinRegistryGeneration`: reuse within a generation, including records rebuilt with a fresh `UpdatedAt`; rebuild after a new generation or different records; the 2 s age bound; and no mutation of the live adapter. - `TestStandaloneHostContinuityReadStateReusedAcrossLookups`: end to end through `GetUnifiedReadStateOrSnapshot` with a real continuity store. - `TestGetLiveHostsSnapshotCopiesOnlyHosts`: 1 host with 1,000 VMs must not allocate per guest. The old path made 1,010 allocations. **Verification on pulse-dev:** `internal/unifiedresources`, `internal/monitoring`, the `internal/api/...` subpackages and `cmd/pulse-control-plane` pass. `TestServerInfoEndpointReportsDevelopment` fails in that source export with and without this change, because the export has no git checkout. Refs #2199