docs: record bug-1512 multi-worker over-dispatch fix + wolf bookkeeping

- left_scheduler_work.md: bug-1494 子问题三(bug-1512)已修复,多 worker 8/8/8 均匀分布验证
- buglog.json: bug-1512 entry(controller code=0 成功 ack 被误判为失败)
- cerebrum.md: Do-Not-Repeat — notify 带 outcome code 字段时需按 controller 侧实际值做 gate
- memory.md: session log

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
lei.chen 2026-08-13 06:22:00 +00:00
parent e4aaef4b3b
commit 7b7294dd1e
4 changed files with 30 additions and 1 deletions

View file

@ -15,7 +15,8 @@
- **来源**:`CLAUDE.md`、`docs/Scheduler-Agent-设计文档.md` §10.2b
- **子问题一(已修复,commit 6928f74,bug-1510)**:scheduler 在 worker 未就绪(down/joining)时派发,controller 拒绝(`dispatch_a_job_ worker t1 status=0x10000 ep nil`)并回 `jobDispatchFail` 通知,但 scheduler 的 `sched_handle_notify` 无此 case(丢弃)→ 作业保持 RUN 视图永不重选 → 永久 PEND(worker 恢复也不派发)。**修复**:handler.c 加 `jobDispatchFail` case + `sched_requeue_pend_job()`(重置 PEND + 重新入 fcfs pendJobs)。
- **子问题二(已修复,commit 1a2bd3f)**:controller 重启 / worker 死亡后,scheduler 资源视图 slots=0 → 无法派发。**根因**:worker 死亡时 `mark_worker_unavail` 正确清零 slots=0;worker 重新 join(slots=8)时 controller 推送新 worker,但 scheduler 的 `sched_update_workers` → `sched_add_worker` 用 `key_add` 遇 EEXIST **丢弃新 worker**,scheduler 永久保留旧的 slots=0 → PEND 作业永不派发。**修复**:`sched_update_workers` 对已存在 worker **就地更新**(交换新 resvals/resInUse/status,释放旧对象),并 NULL-guard make_sched_worker。**集群验证**:scheduler 在 worker 死亡时启动(slots=0)→ worker 重新 join(slots=8)→ 之前卡住的 PEND 作业全部派发完成,无 ASAN。
- **关联**:scheduler 运行时重连(component-failover-adoption)仍为独立待办——scheduler 本身不会在 controller 重启后自动重连,需手动重启(但重连后 slots 恢复正常)。
- **子问题三(已修复,commit e4aaef4,bug-1512,2026-08-13)**:多 worker(t1/t2/t3)下作业重复派发/过派发,分布严重不均。**根因**:controller `handle_jobdispatch` 对**成功**派发也发 `jobDispatchFail` 通知(code=0 是成功 ack,else 分支 `notify_dispatch(jobid, 0)`);scheduler `sched_handle_notify` 无 code 判断(bug-1510 修复引入),把成功 ack 也当失败 → 每个成功派发的作业立即 re-PEND → 下次 session 重选 → 再派发,原实例继续跑 → 重复实例(3 worker 上 24 个作业跑出 38 个实例,堆积在 t1)。**修复**:`fail->code >= 0` 当成功 ack no-op 消费(作业已在 commit 标记 RUN),仅 `code < 0` 才 `sched_requeue_pend_job`。**集群验证**(新 scheduler 部署 t1):24 个 sleep-300 作业均匀 **8/8/8** 分布、零重复、全部 DONE;dispatchFail 日志 38→0;新单测 `test_handle_dispatch_fail_requeues_only_on_negative_code` + 原 15 测试全过。
- **关联**:scheduler 运行时重连(component-failover-adoption)仍为独立待办——scheduler 本身不会在 controller 重启后自动重连,需手动重启(但重连后 slots 恢复正常)。`sched_try_alloc_on_hosts` 只试 worker group member 0(resource.c FIXME)在 worker 名互异时休眠,同名冗余 worker 场景仍需处理。
- **临时恢复**:不再需要(worker 重新 join 即可恢复 slots)。
### 2. bug-1490 — apiserver control HTTP 500【已修复,2026-08-07】