From b41c62bfc2996be0510ec9f9427aa93cd31dd150 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Tue, 2 Jun 2026 19:10:35 +0800 Subject: [PATCH] auto-sync: 2026-06-02 19:10:35 (catch-all) --- src/daemon/spawner.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/daemon/spawner.py b/src/daemon/spawner.py index 5e8ec45..f3dd7d9 100644 --- a/src/daemon/spawner.py +++ b/src/daemon/spawner.py @@ -842,6 +842,9 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ "compact_hanging", "agent_error") and self.counter: self.counter.set_cooldown(agent_id, seconds=300) # 5 分钟 logger.info("Crash/error cooldown set for %s: 300s (outcome=%s)", agent_id, outcome) + # 注意: cooldown 期间任务状态仍为 working,但 counter 已释放。 + # DB 中的 working 是“假 working”——ticker 不会重新分配,_check_timeouts 会 + # 在 cooldown 结束后回收。如果 ticker 在此期间给同一 agent 分配新任务,属正常行为。 # 进程退出 → on_complete release counter # 任务状态由各 outcome 自行处理(或等 ticker) await self._do_on_complete_async(on_complete, agent_id, outcome) @@ -1303,6 +1306,8 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ return {"outcome": "fallback_timeout", "should_retry": False} # A2/A3: status=timeout → 唯一续杯场景 + # 注意: PM2 restart 时 daemon 自身也收到 SIGTERM,此时 retry spawn 的新进程 + # 会随 daemon 一起被杀。A14 retry 假设 daemon 存活,PM2 级重启不在此场景内。 if status == "timeout": return {"outcome": "gateway_timeout", "should_retry": True, "retry_field": "retry_count"}