2.5 KiB
2.5 KiB
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 保持关机。临时测试数据库容器已清理。