fix(ip-pool): reconcile stale leases against live clones (§2.8, W1)

A job killed mid-flight never released its IP lease; with only 4 pool addresses a single leak exhausted the pool ("IP pool exhausted after 60s"). IpSlotPool.reconcile() releases leases whose owner clone-dir is gone; vm cleanup runs it only against the real build_vms base. Closes TODO §2.8.
This commit is contained in:
2026-07-23 17:15:23 +02:00
parent b0415f36e4
commit f0d856b644
8 changed files with 263 additions and 3 deletions
+11 -1
View File
@@ -299,7 +299,7 @@ Cooldown: max 3 restart/h via JSON state file `F:\CI\State\runner-restart-log.js
Oltre il limite: EventId 1004 (Error) + webhook `:sos:` senza restart. Webhook opzionale
Discord/Gitea identico a `Watch-DiskSpace.ps1`.
### 2.8 [P2] [ ] IP-pool auto-riconciliazione vs clone reali — APERTO (2026-06-07)
### 2.8 [P2] [x] IP-pool auto-riconciliazione vs clone reali — CHIUSO (2026-07-23)
`ip-pool.json` non viene riconciliato contro i clone vivi all'avvio. Un job
killato mid-flight (SIGKILL/crash) **leaka il lease in modo permanente**; con
@@ -312,6 +312,16 @@ mai rilasciati. Workaround manuale: reset a `{}` con `build-vms/` vuoto.
cui clone-dir non esiste più in `CloneBaseDir`. Opzionale: allargare il pool
(es. 201–210) per dare margine oltre parallelism. Aggiungere test.
**Risolto 2026-07-23 (W1 del web-UI plan)**: `IpSlotPool.reconcile(live_owners)`
rilascia i lease il cui owner (== nome clone-dir) non è più fra le sotto-dir di
`CloneBaseDir`; `operations.vms.reconcile_ip_leases(clone_base, pool)` calcola i
`live_owners` e delega. `vm cleanup` lo invoca **solo** quando opera sul clone
base reale (`base_path == config.paths.build_vms`) — un `--clone-base-dir`
custom NON riconcilia (i lease appartengono al build-vms reale). Supporta
`--what-if` (dry-run, nessuna scrittura). Test: `test_ip_pool.py` (reconcile),
`test_operations_vms.py` (reconcile_ip_leases), `test_commands_vm.py` (CLI, real
vs custom base). Allargamento del pool oltre 201–204: non fatto (opzionale).
### 2.9 [P2] [ ] `retention run` non copre backup/template/ISO — APERTO (2026-07-22)
`ci-retention-policy` agisce solo su **artifact, log e lease IP**. Su questo host