docs: mark PEND reason end-to-end done (bug-1513), note main_reason follow-up

- aibot_poc_investiagting.md: PEND reason 调查完成 + 转换层补全;新增遗留项(main_reason 恒 0)
- buglog.json: bug-1513 entry
- memory.md: session log

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
lei.chen 2026-08-13 09:16:49 +00:00
parent ac6131dbd7
commit 86265fb7bc
3 changed files with 22 additions and 1 deletions

View file

@ -15018,5 +15018,24 @@
],
"occurrences": 1,
"last_seen": "2026-08-13"
},
{
"id": "bug-1513",
"timestamp": "2026-08-13",
"error_message": "PEND reason 字段 pending_reason 声明了但恒为空:scheduler 已计算并 setpreason 到 controller,controller 已存 job->pend_reasons,但 API/SSE 查询作业永远拿不到(MCP 无法解释'为什么作业在等')",
"file": "src/controller/apiserver.c + src/frontend/apiserver/backend/{convert,convert_pure}.go + models/jobs.go",
"root_cause": "两个缺口叠加:(1) controller 的 apiserver_job_hook_fun 不处理 HOOK_DETAIL_SETPREASON——setpreason 事件不触发任何 JOB_* 推送,apiserver 永远收不到 pend_reasons 变化的作业(JOB_NEW/UPDATE/START/EXIT 才推);(2) apiserver 转换层 cJobToModel/rawJobToModel 从不读 C 的 xce_job_t.pend_reasons,且 JOB_DEFAULT_COLUMN 不含 pending_reason(默认查询不选该字段)。",
"fix": "(1) apiserver_job_hook_fun 加 case HOOK_DETAIL_SETPREASON 复用 apiserver_job_update_fun 推 updateJob;(2) cJobToModel/rawJobToModel 提取 pend_reasons(main_reason + host/res reasons)marshal 为 JSONB 塞进 models.JobInfo.PendingReason;JOB_DEFAULT_COLUMN 加 pending_reason。集群验证:resreq type==nosuchhost 作业 PEND 返回 host_reasons [{t1,3},{t2,3},{t3,3}](3=MATCH_FAIL)。commit ac6131d。遗留:main_reason 恒 0(allocator 只加明细 reason),修法待定。",
"tags": [
"apiserver",
"pend-reason",
"setpreason-hook",
"conversion-gap",
"scheduler-agent",
"fixed"
],
"related_bugs": [],
"occurrences": 1,
"last_seen": "2026-08-13"
}
]

View file

@ -7398,3 +7398,4 @@
|------|--------|---------|---------|--------|
| 02:1x | Added human-readable jobid (job_id_human/human_id) to apiserver responses (backend.FormatJobID reuse); renamed SSE perm event:subscribe->event:view; updated docs (left_scheduler_work, design doc v1.3, cerebrum) | src/frontend/apiserver, src/frontend/schedulerclient, docs | verified live (submit + get_job return 1-0-... form); all tests pass; pushed | ~90k tok |
| 06:21 | bug-1512 多 worker 过派发修复:handler.c code<0 才 re-PEND;24 作业 8/8/8 全 DONE;单测+提交 e4aaef4 | handler.c test_handlers.c | fixed+verified | ~2k |
| 09:1x | PEND reason 全链路补全(bug-1513):controller SETPREASON hook 推送 + apiserver 转换层填充 + JOB_DEFAULT_COLUMN;集群验证 resreq type==nosuchhost → host_reasons [{t1,3},{t2,3},{t3,3}];提交 ac6131d | apiserver.c convert.go convert_pure.go convert_test.go models/jobs.go | verified | ~40k |

View file

@ -45,7 +45,8 @@ scheduler 侧已有 PEND 原因(`PREASON_NO_RESOURCE`、`PREASON_MATCH_FAIL`
## 四、待办
- [x] 检查 PEND reason 全链路(scheduler → apiserver)是否暴露齐全(2026-08-13 完成,结论:只差 apiserver Go 转换层)
- [ ] 补 apiserver 转换层:`cJobToModel` / `rawJobToModel` 填充 `PendingReason`(convert.go / convert_pure.go)
- [x] 补 apiserver 转换层:`cJobToModel` / `rawJobToModel` 填充 `PendingReason`(convert.go / convert_pure.go)—— **ac6131d 完成并集群验证**
- [ ] **(新)scheduler `main_reason` 恒为 0**:allocator 只加 host/res 明细 reason(`add_job_preason` host≠NULL 时只走 add_host/add_res 分支),从不设 main_reason → API 显示 `main_reason:0 / "unknown(0)"`。host_reasons(如 `[{t1,3},{t2,3},{t3,3}]`)信息完整可用;要不要让 `add_job_preason` 在 main_reason==0 时补首个 code,待定(需重建 lib+scheduler+controller)
- [ ] ① 自愈闭环:失败归因分类器 + 自愈复跑流程
- [ ] ② 实时叙事 prompt/模板