mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-10 18:45:53 +00:00
9d39b1bd11
Every list-shaped resources request deep-cloned the whole registry: HandleListResources via ListForPresentation, the storage summary and incidents handlers and the k8s namespaces handler via List/ListByType, and the stats handler once more. With the frontend polling three pages plus summaries every few seconds, the same unchanged world was cloned dozens of times between snapshot updates. Cache the raw and presentation lists on the existing per-generation registry cache entry (same invalidation: entries rebuild when the seed lastUpdate moves) and hand requests a flat top-level copy instead. Every decorator in the request pipeline was audited to write only top-level fields on request-owned elements: action availability, discovery targets and readiness, metrics targets, canonical metadata refresh, and contract types all assign freshly built values. The one nested writer — the PMG list prune, which cleared relay domains through the shared pointer — now clones the PMG struct before clearing, with a regression test pinning both the clone-on-write and the cache's immunity to request decoration. Read-only consumers (stats aggregation, storage filtering, namespace counting) use the shared list with no copy at all. Single-resource lookups (presentationResourceByReference and its callers) still deep-clone per lookup; they are cold paths and stay as-is. Contract-Neutral: per-generation shared resource lists: response bytes pinned by contract tests, no payload delta