forked from lei.chen/myxce
docs: scheduler reconnect — confirmed real heap corruption (ASAN + debug both crash)
Deep-dive: the rejoin works but crashes ~3-8s later with a REAL heap corruption (ASAN bad-free freeing a pointer 56B into a 60B region, all-loader frames; non-ASAN debug build aborts with free(): invalid pointer, gdb stack corrupted). The endpoint-unmonitor fix (correct, matches xce_ctx_stop) did not help. Candidate roots: config re-push re-running sched_init_config non-idempotently (sharedInst MOVE_PTR/zarray_put), lib reconnect vs in-flight vtask, or state-resync merge. All scheduler reconnect changes reverted to keep the scheduler stable; this is a dedicated deep-debugging task. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
f3e510a548
commit
d4b98aab01
1 changed files with 6 additions and 5 deletions
|
|
@ -92,11 +92,12 @@ spec 声称 36/36 任务完成,但 re-audit(research.md)发现缺陷。来
|
|||
- **✅ 已完成并集群验证(commit 2165b1a)**:
|
||||
- **worker 无限重试**(controller_connector.c `checking_connection`):去掉 5 次上限,无限重试直到重连(连接器线程专用,不阻塞硬件/进程监控线程)。实测:杀 controller 后 3 worker 全部存活并持续重试,controller 回来后自动 rejoin。
|
||||
- **apiserver rejoin**(clib.go `StartHeartbeat` + `xce_backend_rejoin`):心跳从失败转成功时显式 rejoin(HostRole_apiserver),恢复 push 通知。实测:controller 重启后日志 `backend re-joined controller after reconnect`。
|
||||
- **❌ scheduler reconnect 被 lib 竞态阻塞(未合入,已回退)**:
|
||||
- scheduler 的 rejoin(`xcecli_set_reconnect_handler` flag + 主循环 `xcecli_join`)**功能上能重连并 rejoin**(实测收到 config push),但 rejoin 后 ~8s 崩溃。
|
||||
- **根因**:libxce `xce_ctx_reconnect`(client_failover.c→xcectx.c)里的 `endpoint_fini` 拆除旧 endpoint,而 lib 的 vtask/io 线程(T5)仍在处理旧 endpoint → 确定性 double-free(ASAN bad-free,两次崩溃释放地址偏移相同 `...66b8`)。这是 lib 既有竞态,被 reconnect 首次触发。netio.c 注释自认 endpoint 生命周期与 in-flight vtask 的 teardown 复杂。
|
||||
- **修法**:需在 libxce netio/endpoint 生命周期里同步 endpoint 拆除与 in-flight vtask 处理(涉及 ref-counting/teardown 顺序),独立较深任务。
|
||||
- 为保持 scheduler 稳定已回退 reconnect 改动(否则 controller 一重启 scheduler 就崩)。
|
||||
- **❌ scheduler reconnect 被真实 heap corruption 阻塞(未合入,已回退)**:
|
||||
- scheduler 的 rejoin(`xcecli_set_reconnect_handler` flag + 主循环 `xcecli_join`)**功能上能重连并 rejoin**(实测收到 config push),但 rejoin 后 ~3-8s **崩溃**。
|
||||
- **诊断(2026-08-14 深入)**:ASAN 报 `bad-free`(释放 60 字节区域偏移 56 处的指针,`...66b8`,分配线程 T4/释放线程 T5,**全栈在 loader**);**debug 非 ASAN 构建同样崩**(`free(): invalid pointer` + core,gdb 显示 malloc_printerr 后栈被破坏)——**真实堆损坏,非 ASAN 假象**。
|
||||
- 尝试的修复(均无效):`xce_ctx_reconnect` 先 `iomgr_unmonitor` 再 `endpoint_fini`(对齐 xce_ctx_stop 的安全拆除,正确但不充分)。
|
||||
- **候选根因**:(a) rejoin 触发 config 重推 → `sched_init_config` 非幂等重跑(sharedInst 的 MOVE_PTR/zarray_put killer 覆盖、queues/resources 重加);(b) lib reconnect 与 vtask 并发处理旧 endpoint;(c) 重新同步时 scheduler 本地状态与重推的 merge 缺陷。栈被破坏无法干净回溯,需 valgrind/隔离测试定位。
|
||||
- **修法**:独立深层调试任务(scheduler 状态重同步幂等性 + lib reconnect/vtask 生命周期)。为保持 scheduler 稳定已回退全部 reconnect 改动。
|
||||
- 剩余任务(scheduler reconnect + 多 controller E2E + apiserver 电路熔断等)见 spec。
|
||||
|
||||
### P2.5
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue