Agent-Flag-TTL-Cache + Backoff für tote Guest-Agents → Scan-Cap entkappen (offener Teil von #38) #67

Closed
opened 2026-06-02 16:23:11 +00:00 by chinux · 0 comments
Owner

Kontext

Folge-Issue zu #38 (geschlossen, aber nur Cap+Rotation wurde umgesetzt). Der im Titel von #38 genannte Agent-Flag-Cache + Backoff fehlt bis heute — der Code liest den agent-Flag gar nicht und pingt jede laufende VM jede Rotation blind an (data.rs:95-97, Kommentar: "we just try qemu-agent ping on every running VM ... let identity_scan bail out").

Folgen (aktuell)

  • VMs mit agent=0 werden jede Rotation sinnlos ge-ping't und scheitern.
  • Tote agent=1-Gaeste kosten pro Rotation einen vollen Ping-Timeout (serielle Scans → blockiert die data_loop).
  • Der 12er-Cap (data.rs SCAN_CAP=12, Rotation via SCAN_CURSOR) stammt aus der 30s-Aera. Bei scan_interval=300 refresht eine grosse Node pro VM nur alle ceil(N/12)x5min, und ein transienter Timeout klebt eine ganze Rotationsrunde (Minuten), obwohl die VM laengst wieder da ist.
  • Hinweis: Datenverlust gibt es NICHT — das Backend merged vm_qemu_scans (agent_ws.py:324-327). Es geht rein um Frische + Kosten.

Loesung

1. Agent-Flag-TTL-Cache

  • Neue Funktion (proxmox.rs): get_vm_agent_enabled(vmid) -> bool via qm config <vmid> / pvesh /nodes/<node>/qemu/<vmid>/config → Feld agent (enabled wenn Wert mit 1 beginnt, z. B. 1,fstrim_cloned_disks=1).
  • Pro VMID cachen mit TTL (Default 900s/15min) in der AgentState (Mutex<HashMap<vmid,(enabled, checked_at)>>).
  • In collect(): pro laufender VM Cache konsultieren; ist der Flag aelter als TTL → billig neu lesen (nur Config, kein Ping). agent=0identity_scan ueberspringen.
  • Eine agent=0-VM wird nach Ablauf der TTL wieder geprueft (nur der Flag), nicht der teure Ping. Wird der Guest-Agent in Proxmox aktiviert, faengt theProx innerhalb des TTL-Fensters wieder an, voll zu scannen.

2. Backoff fuer tote agent=1

  • agent=1, aber Ping/identity_scan timeoutet → VMID als tot markieren mit exponentiellem Backoff (z. B. 1→2→4→… gedeckelt bei z. B. 1800s), next_retry_at pro VMID.
  • Bis Ablauf ueberspringen; bei Erfolg Backoff zuruecksetzen.

3. Cap entkappen

  • Mit billigen Skips dominieren nur noch lebende, schnelle Scans die Runde → SCAN_CAP/Rotation entfernen oder stark anheben: alle scanbaren VMs (agent=1, nicht im Backoff) jede Runde → volle Frische alle 5 Min.
  • Optional statt Cap: begrenzte Parallelitaet der Scans (Rundenzeit != N x Timeout).

4. Konfigurierbar + manueller Trigger

  • Knoepfe: agent_flag_ttl (Default 900s), dead_agent_backoff_max (Default 1800s) — getrennt vom scan_interval.
  • "Jetzt neu pruefen": Trigger, der Cache+Backoff einer VMID verwirft (Flag frisch lesen + sofort scannen) — beim Enrollment und als manueller Rescan-Button. Damit muss man nach bewusstem Aktivieren des Guest-Agents nicht die TTL abwarten.

Akzeptanz

  • agent=0-VMs werden nicht mehr ge-ping't, ihr Flag aber alle ~TTL neu evaluiert.
  • Tote agent=1-Gaeste werden mit Backoff uebersprungen statt jede Rotation neu zu timeouten.
  • Lebende VMs werden jede Runde gescannt (kein 12er-Cap-Stau); transiente Timeouts kleben nicht mehr ueber Minuten.
  • data_loop-Rundenzeit bleibt beschraenkt (Backoff/Skip oder Parallelitaet), CPU-Spike kehrt nicht zurueck.
  • Manueller Rescan + Enrollment umgehen den Cache.

Bezug

  • #38 (geschlossen — dies ist dessen nicht umgesetzter Ursachen-Teil)
  • #56 (Haertung auf fremden Umgebungen)
  • #66 (nutzt denselben gecachten Scan/Flag fuer die OS-Erkennung)

Branch

feat/agent-flag-cache-and-dead-agent-backoff

## Kontext Folge-Issue zu **#38** (geschlossen, aber nur **Cap+Rotation** wurde umgesetzt). Der im Titel von #38 genannte **Agent-Flag-Cache + Backoff** fehlt bis heute — der Code liest den `agent`-Flag gar nicht und pingt **jede laufende VM jede Rotation blind** an (`data.rs:95-97`, Kommentar: "we just try qemu-agent ping on every running VM ... let identity_scan bail out"). ## Folgen (aktuell) - VMs mit `agent=0` werden jede Rotation sinnlos ge-ping't und scheitern. - Tote `agent=1`-Gaeste kosten pro Rotation einen vollen Ping-Timeout (serielle Scans → blockiert die data_loop). - Der **12er-Cap** (`data.rs` `SCAN_CAP=12`, Rotation via `SCAN_CURSOR`) stammt aus der 30s-Aera. Bei `scan_interval=300` refresht eine grosse Node pro VM nur alle `ceil(N/12)x5min`, und ein **transienter Timeout klebt eine ganze Rotationsrunde** (Minuten), obwohl die VM laengst wieder da ist. - Hinweis: Datenverlust gibt es NICHT — das Backend merged `vm_qemu_scans` (`agent_ws.py:324-327`). Es geht rein um **Frische + Kosten**. ## Loesung ### 1. Agent-Flag-TTL-Cache - Neue Funktion (`proxmox.rs`): `get_vm_agent_enabled(vmid) -> bool` via `qm config <vmid>` / pvesh `/nodes/<node>/qemu/<vmid>/config` → Feld `agent` (enabled wenn Wert mit `1` beginnt, z. B. `1,fstrim_cloned_disks=1`). - Pro VMID cachen mit **TTL** (Default 900s/15min) in der `AgentState` (`Mutex<HashMap<vmid,(enabled, checked_at)>>`). - In `collect()`: pro laufender VM Cache konsultieren; ist der Flag aelter als TTL → **billig** neu lesen (nur Config, kein Ping). `agent=0` → `identity_scan` **ueberspringen**. - → **Eine `agent=0`-VM wird nach Ablauf der TTL wieder geprueft** (nur der Flag), nicht der teure Ping. Wird der Guest-Agent in Proxmox aktiviert, faengt theProx innerhalb des TTL-Fensters wieder an, voll zu scannen. ### 2. Backoff fuer tote `agent=1` - `agent=1`, aber Ping/`identity_scan` timeoutet → VMID als tot markieren mit **exponentiellem Backoff** (z. B. 1→2→4→… gedeckelt bei z. B. 1800s), `next_retry_at` pro VMID. - Bis Ablauf ueberspringen; bei Erfolg Backoff zuruecksetzen. ### 3. Cap entkappen - Mit billigen Skips dominieren nur noch **lebende, schnelle** Scans die Runde → `SCAN_CAP`/Rotation **entfernen oder stark anheben**: alle scanbaren VMs (agent=1, nicht im Backoff) **jede Runde** → volle Frische alle 5 Min. - Optional statt Cap: **begrenzte Parallelitaet** der Scans (Rundenzeit != N x Timeout). ### 4. Konfigurierbar + manueller Trigger - Knoepfe: `agent_flag_ttl` (Default 900s), `dead_agent_backoff_max` (Default 1800s) — getrennt vom `scan_interval`. - **"Jetzt neu pruefen"**: Trigger, der Cache+Backoff einer VMID verwirft (Flag frisch lesen + sofort scannen) — beim Enrollment und als manueller Rescan-Button. Damit muss man nach bewusstem Aktivieren des Guest-Agents nicht die TTL abwarten. ## Akzeptanz - `agent=0`-VMs werden nicht mehr ge-ping't, ihr Flag aber alle ~TTL neu evaluiert. - Tote `agent=1`-Gaeste werden mit Backoff uebersprungen statt jede Rotation neu zu timeouten. - Lebende VMs werden jede Runde gescannt (kein 12er-Cap-Stau); transiente Timeouts kleben nicht mehr ueber Minuten. - data_loop-Rundenzeit bleibt beschraenkt (Backoff/Skip oder Parallelitaet), CPU-Spike kehrt nicht zurueck. - Manueller Rescan + Enrollment umgehen den Cache. ## Bezug - **#38** (geschlossen — dies ist dessen nicht umgesetzter Ursachen-Teil) - **#56** (Haertung auf fremden Umgebungen) - **#66** (nutzt denselben gecachten Scan/Flag fuer die OS-Erkennung) ## Branch `feat/agent-flag-cache-and-dead-agent-backoff`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#67
No description provided.