Skip to content

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

Open
yokowu wants to merge 7 commits into
mainfrom
feat/vm-recycle-cli-support
Open

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

Conversation

@yokowu

@yokowu yokowu commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

背景

control WebSocket 保活曾被当作真实任务活动,持续刷新 notify/recycle deadline 和 tasks.last_active_at,导致长连接任务长期无法按默认周期回收。旧 Redis 数据中还存在大量缺少 recycle deadline 的 VM,需要安全区分可回收、待修复和孤儿状态。

此前拟通过持久化 task-event 补齐活动日志,但 task-event 只承载文件、端口等临时环境事件,没有必要写入任务日志。本方案不修改 taskflow。

改动

  • 将 VM idle 刷新拆分为 KeepAwakeRecordActivity,并使用独立 debounce key
  • control 连接只刷新休眠时间,不再更新 tasks.last_active_at,也不延长提醒与回收时间
  • 用户输入被 taskflow 接受后,直接刷新任务 last_active_at 与 VM 回收计时;拒绝的输入不刷新
  • taskflow 已有 VMActivity 回调在 MonkeyCode 内持久化到关联的非终态任务
    • 使用上报的 last_active_at
    • 时间只前进不回退
    • 5 分钟写入节流
    • 未来时间截断为服务端当前时间
    • 数据库写入失败不阻断 Redis 活动刷新
  • Analyzer 使用 max(created_at, last_active_at) 与 Redis recycle deadline 分析 VM,不再查询 ClickHouse/Loki,也不依赖 task-event 入库
  • 完善历史数据决策:
    • 终态任务活动时间已超期且 Redis deadline 缺失:candidate
    • 非终态任务 Redis deadline 缺失:deadline_missing
    • 无关联任务 VM:orphan
    • Redis deadline 仍在未来:historical_uncertain
  • 默认扫描覆盖无关联任务的孤儿 VM,但只有显式指定 VM 时才允许清理
  • 新增 DeadlineRepairer,执行时重新校验非终态任务与当前团队策略,并按 now + EffectiveRecycleSeconds 重建 deadline
  • 新增延迟队列 EnqueueIfMissing,通过 Lua 原子检查 ZSET member;并发活动已创建 deadline 时不会覆盖
  • 统一 vmrecycle.Recycler,供自动 consumer、lifecycle hook 和运维 CLI 复用
  • 统一远端删除、DB 标记、关联任务收口及 Redis 队列/缓存清理

验证

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

新增/更新测试覆盖:终态与非终态缺失 deadline、未来 deadline、孤儿扫描、当前策略重校验、并发 deadline 不覆盖和延迟队列原子入队。

依赖

monkeycode-ai MR !750 将 submodule 更新到本 PR,并提供只读扫描、显式回收及 deadline 修复 CLI。本方案不依赖 taskflow 改动。

@yokowu

yokowu commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

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