Skip to content

修复 VM 空闲回收活动语义并统一回收流程#868

Merged
yokowu merged 10 commits into
mainfrom
feat/vm-recycle-cli-support
Jul 14, 2026
Merged

修复 VM 空闲回收活动语义并统一回收流程#868
yokowu merged 10 commits into
mainfrom
feat/vm-recycle-cli-support

Conversation

@yokowu

@yokowu yokowu commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

背景

control WebSocket 只能证明 VM 需要保持唤醒,不能代表任务仍在活动。此前 control 保活会持续延长 notify/recycle deadline,导致长连接任务无法按空闲策略回收;历史 Redis 数据还存在 deadline 缺失,需要保守分析和显式修复。

本方案不修改 taskflow,也不为了回收持久化 task-event。

改动

  • 将 VM idle 刷新拆为 KeepAwake 与 RecordActivity,并使用独立 debounce key
  • control 连接只刷新休眠;有效 user-input、任务创建及 taskflow VMActivity 才刷新真实活动时间和回收计时
  • 持久化 tasks.last_active_at,Analyzer 使用 max(created_at, last_active_at) 与 Redis deadline 判定
  • 完善 candidate、deadline_missing、historical_uncertain、orphan 等历史数据决策
  • 默认扫描孤儿 VM,但只有显式指定 VM 才允许清理
  • 新增 DeadlineRepairer 与原子 EnqueueIfMissing,修复缺失 deadline 时不覆盖并发活动
  • 统一 vmrecycle.Recycler,供自动 consumer、lifecycle hook 和运维 CLI 复用
  • Recycler 统一负责 taskflow 删除、is_recycled 置位、关联任务收口及 Redis 清理

自动回收失败补偿

  • 新增 ErrRemoteDelete,只标识 taskflow 远端删除失败
  • 空闲回收队列最多执行 5 次远端删除
  • 前 4 次远端失败继续重试;第 5 次仍失败时写 is_recycled=true 并结束远端删除阶段
  • Agent 重连发现 is_recycled=true 后拒绝连接,并触发已有异步 taskflow 删除补偿
  • 若第 5 次后的数据库置位暂时失败,队列保留最终阶段并只重试数据库写入,不会发起第 6 次 taskflow 删除
  • recycle_delete_exhausted 为可选 Redis payload 字段;旧队列数据缺少该字段时按 false 读取,无需迁移
  • 锁冲突、数据库读取或其他非远端错误不会提前置位

验证

  • GOWORK=off go test ./...
  • GOWORK=off go vet ./...
  • git diff --check

测试覆盖正常回收、幂等清理、远端错误类型传播、前 4 次重试、第 5 次置位、置位失败持续保留且不重复远端删除、非远端错误不置位,以及历史候选和 deadline 修复。

依赖

monkeycode-ai MR !750 将子模块更新到本 PR,并提供中文运维 CLI、显式回收、强制回收和 deadline 修复。

远端环境不存在的幂等处理

  • taskflow 返回包含 environment not found: 时,表示远端删除目标状态已经满足
  • Recycler 不再包装 ErrRemoteDelete,也不会阻断强制回收或自动回收
  • 后续仍会设置 is_recycled=true、收口关联任务并清理 Redis 状态
  • 其他 taskflow 删除错误仍保持失败和重试语义
  • 新增客户端错误识别与 Recycler 回归测试

强制回收处理脱敏远端错误

实际链路会把 taskflow 内部 environment not found 脱敏为通用 HTTP 500,客户端只能看到 trace_id。为避免该错误阻断运维强制回收:

  • 新增 ForceRecycler.ForceRecycle 显式入口
  • ForceRecycle 仍调用一次 taskflow 删除,但远端删除失败后继续设置 is_recycled=true 并执行本地任务/Redis 清理
  • Agent 重连继续承担已有的异步远端删除补偿
  • 普通 Recycle 仍严格返回 ErrRemoteDelete,自动回收重试语义不变
  • 强制回收仍严格传播锁、VM 查询、数据库置位和本地清理错误

@yokowu

yokowu commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

@yokowu yokowu merged commit 8902c11 into main Jul 14, 2026
@yokowu yokowu deleted the feat/vm-recycle-cli-support branch July 14, 2026 13:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant