功能:完善云管助手与GPU故障恢复核对

This commit is contained in:
songyiming committed 2026-11-13 19:08:40 +08:00
1 parent b6026f9759
commit 9f7b01e4db
42 files changed
+3576 -120

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
# GPU 切换偶发超时的自动核对
## 原因
2026-11-13 16:02(北京时间),Windows 10(VMID 100)的启动请求已被 PVE 接受,但查询原任务状态时 HTTP 超时。原任务实际以 `exitstatus=OK` 结束;旧逻辑把一次读取失败升级成持续阻塞,需要管理员手动核对。
## 行为
- PVE 任务状态和实际电源的 GET 查询,对网络暂时性故障及 HTTP 408/429/500/502/503/504 最多读取 3 次,间隔 250/500 毫秒,并遵守调用方取消和超时。权限错误不重试。
- 电源 POST 不自动重发。拿不到原任务 UPID 时保留阻塞,需要核查,避免重复关机或显卡争用。
- 后台在没有进行中的 GPU/创建操作时,间隔至少 15 秒选择一条待核对任务;恢复过程中仍持有独占组锁。每次核对最长 60 秒。
- 已知原任务结束后,检查独占组配置、全部成员电源、员工/终端授权和 Sunshine 响应。只有这些条件全部满足才自动完成为成功,并更新桌面状态、记录系统审计。
- 任务已结束但准备流程未完成,自动结束为失败并解除该任务的阻塞,用户可以重新选择桌面;后台不会补发后续电源操作。
- 仍无法确认电源、原任务未结束或发现多台成员同时运行时保持阻塞。最近 24 小时内具有 UPID 的不确定任务继续后台核对,过期任务保留供管理员处理。
- API 重启后发现的运行中 GPU 任务只恢复观察,不重放命令。尚未提交电源操作的任务结束为可重试失败。
- 前 5 分钟内,设备查询可自动核对任务时返回 `running`,让现有终端继续轮询。同一终端重新准备同一桌面复用原任务,不重复创建。
## 验证方式
测试使用独立 Docker PostgreSQL(`vdi-cloud-gpu-recovery-test-db`),不连接业务库;PVE 和 Sunshine 均使用测试 HTTP 服务。覆盖读取失败后恢复、不确定 POST 不重放、实际多 VM 冲突、原任务失败、连接服务未启动、授权撤销、配置变化、API 重启、同一任务复用和有限等待。
现场部署仅更新 API,无 VM 电源操作、终端重启或 GPU 重新绑定。回退镜像为 `vdi-cloud-live-api:before-gpu-recovery-20261113`。
验证结果:带专用数据库的 `go test ./... -count=1` 和 `go vet ./...` 均通过;GPU 故障注入及重启恢复用例通过。部署后真实 `/healthz` 返回生产模式 `ok`,独占组冲突为空,VM 100 保持运行,101/102 保持关机。临时测试数据库容器已清理。