问题:TaskGuard::drop 中调用 tokio::task::id()。abort 路径下 future 的销毁若发生在非任务上下文,id() 直接 panic 刷日志; 若发生在调用方任务上下文,则拿到调用方的任务 id,把它从 任务组中误删,破坏任务组记账。 修复:spawn 时在任务上下文内获取自身 id 存入 TaskGuard, Drop 只使用保存的 id。 测试:test_abort_task_keeps_caller_bookkeeping 验证在同组任务内 abort 其他任务后,调用方条目不被误删、wait_all_stopped 正常返回。
- 启动任务(含注册重试循环)此前是裸 tokio::spawn,stop 打不断: 服务器不可达时点击停止,状态永远卡在 Starting 或显示 Running 的死网络。 现在保存 JoinHandle,stop/restart 时先 abort_start_task 中断它, defer 守卫负责把状态迁移到 Stopped - 清理任务此前 spawn 在自己所等待的 task_group 里,形成自引用等待, 网络自行停止时永不返回;改为在任务组外等待 - 顺带修复 TaskGroup::wait_all_stopped 的丢失唤醒竞态: notified() 先 enable 注册再检查条件 - 补充 Starting 状态停止迁移、任务自然结束唤醒两个测试