fix(chv): V-7 复测缺陷复修 D1/D2 + F1 瞬时 reset 重试
D1:snapshot_vm 在配额预检后、ch-remote 前建好 file:// 目标 目录(新 helper _ensure_snapshot_dir;fresh URL 直接 snapshot 曾 rc=1 Destination is not a directory)。建目录只在 snapshot_vm 一处,hibernate 经此调用;配额拒绝仍先于任何文件改动。 D2:keep_disk=True 时 stop 保留 seed.iso(_remove_vm_seed_files 抽出;快照 config.json 的 disks 同时引用 disk.raw 与 seed.iso), 且 cleanup_stale_secrets 不清有登记快照的 VM 的 seed(与 gc_stale_disks 的盘保护同款逻辑);正常 stop 仍删两者。 F1:首条任务 SSH 撞 kex 阶段瞬时 reset(rc=255 + kex/reset 标记) 时重试恰好 1 次(_call_ssh_with_transient_retry,_run_guest 与 _run_guest_goal 共用;host key 拒绝/认证失败/远端失败不重试; 审计 vm_ssh_transient_retry)。§5“执行器内部不重试”的唯一例外, 结论写入 docs/chv-production-readiness.md §3/§5/§7。 测试:test_chv_v3_fixes 新增 12 项(D1×3、D2×4、F1×5);旧代码 上 12 项中 9 项失败(余 3 项为守卫既有行为)。全量 test_chv* 470 测试通过。
This commit is contained in:
1 parent
65504ae8cb
commit
1836c5af32
3 files changed
+388
-24
No files matched your search
@@ -98,7 +98,18 @@
|
||||
SSH 就绪),恢复后默认 paused 的坑已在代码与测试里钉住。
|
||||
- ✅🧪 hibernate:CHV 无原生 hibernate 端点,本轨用 pause +
|
||||
snapshot + shutdown 等价实现,文档与代码双写“等价实现”,
|
||||
不声称接了原生端点;唤醒走 restore_vm。
|
||||
不声称接了原生端点;唤醒走 restore_vm。hibernate 的 stop
|
||||
用 keep_disk=True:disk.raw 与 seed.iso 都留(快照
|
||||
config.json 的 disks 同时引用两者,删其一 restore 即在
|
||||
服务端失败,见 V-7/D2);有登记快照的 VM 的盘与 seed.iso
|
||||
也不被 gc_stale_disks / cleanup_stale_secrets 当孤儿清掉,
|
||||
登记剪干净后才成孤儿可删;正常 stop(keep_disk=False)
|
||||
仍删两者(seed.iso 含宿主私钥明文,不得残留)。
|
||||
- ✅🧪 snapshot 目标目录:snapshot_vm 在 ch-remote 之前建好
|
||||
file:// 目标目录(V-7/D1):服务端要求目标是已存在的
|
||||
目录,fresh URL 直接 snapshot 会 rc=1(Destination is not
|
||||
a directory),mkdir 后即通;目标已存在且不是目录时报
|
||||
snapshot_not_persisted,不调 ch-remote。
|
||||
- ✅🧪 shutdown-destroy / recycle:shutdown_vm(ch-remote
|
||||
shutdown + 杀进程 + 删 socket)、recycle_vm(保留
|
||||
task_checkpoints/task_attempts,丢失 guest /tmp 与未拷出
|
||||
@@ -149,6 +160,17 @@
|
||||
- ✅ 超时与最大轮次:SSH 单次超时(CHV_TASK_TIMEOUT)+
|
||||
worker task_timeout 外层护栏;goal 最大轮次 100(与 Local
|
||||
同款),执行器内部不重试(重试是 worker max_retries 语义)。
|
||||
唯一例外(V-7/F1,评估结论:值得改,已改):首条任务 SSH
|
||||
撞连接建立阶段瞬时 reset(rc=255 + kex/reset 标记,崩溃后
|
||||
重 wake 实测 1 次、下一条即通,与 cloud-init 收尾重启 sshd
|
||||
的瞬态故障同款签名)时,_run_guest / _run_guest_goal 经
|
||||
_call_ssh_with_transient_retry 重试恰好 1 次(重试前等 1
|
||||
秒,发 vm_ssh_transient_retry 审计)。wait_guest_ready 的
|
||||
轮询本就容忍这类抖动,缺口只在单次调用的首条任务 SSH:
|
||||
不重试会把秒级抖动放大成 worker 级重试 = 整台 VM 冷启动
|
||||
重跑(分钟级 + 重复计费)。host key 拒绝、认证失败、远端
|
||||
命令失败一律不重试;误重试的最坏后果也被 host.py 兜住
|
||||
(dispatch 同名任务已存在即 loud fail,不静默重跑一轮)。
|
||||
- ✅ 成本复用:不另起一套计费;worker 现有 quota/成本语义
|
||||
(per-user USD 配额、quota 看门狗、成本写库)仍是唯一口径,
|
||||
执行器只把 host.py 用量原样返回。
|
||||
@@ -190,7 +212,7 @@
|
||||
release 均经 audit_callback 发出;worker 接线后转 AuthStore
|
||||
审计(_audit 本身 best-effort)。feat-chv-secfix 起补齐:
|
||||
host_key_generated/host_key_captured/host_key_mismatch、
|
||||
preflight_failed、wake 前置失败(容量/配额/net 冲突)、
|
||||
vm_ssh_transient_retry、preflight_failed、wake 前置失败(容量/配额/net 冲突)、
|
||||
vm_disk_deleted/vm_disk_delete_failed/vm_disk_gc、
|
||||
host_secret_residue_cleaned、net_config_dual、快照剪枝;
|
||||
审计回调失败记宿主 error 日志,不再双重静默。
|
||||
|
||||
Reference in new issue
Block a user