fix(bench): 修复客户端池模式退出时的运行时异常#1187
Conversation
client_pool在连接时会通过directlyStart在全局executor上启动 collect_idle_timeout_client后台协程。当main()返回时,这些协程 仍在全局io_context_pool的线程上sleep,导致Windows下进程退出 时产生运行时异常。 在客户端模式结束后调用g_io_context_pool().stop(true)强制停止 所有io_context,使后台线程立即退出。 Closes alibaba#1151 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
LGTM, thank you |
|
CI 里挂的 coro_http_test 跟本次改动无关,是 test ssl client 用例连 www.baidu.com 时偶发的网络问题。 具体看 test_cinatra.cpp:301,用了 assert(result.status == 200) 硬断言,baidu 在 macOS runner 上偶尔返回非 200(302 重定向或超时),直接 SIGABRT。同文件其他类似测试都用的 CHECK(result.status >= 200),只有这两处是 assert。 翻了下 main 分支的 CI Daily 记录,5/18、5/16、5/11 都有同样的间歇性失败,跟本 PR 的改动(bench.cpp 加一行 stop)没有关系。 这个 flaky test 我会单独开个 PR 修。 |
是的,这个错可以先不管 |
|
你好,请问目前这个pr可以合并了吗 |
等剩下几个跑完吧,感谢 |
|
for detail, goto summary download Artifacts |
|
你好,当前的pr可以合并了 |
问题
Windows 下使用 bench 工具以客户端池模式 (
-g 1 -h 0) 运行少量请求后退出时,进程会触发运行时异常(abort / 非零退出码)。
根因:
client_pool在建立连接时会通过directlyStart在全局io_context_pool的 executor 上启动
collect_idle_timeout_client后台协程(30s 定时器循环)。当
main()返回时,这些协程仍在后台线程的io_context::run()中 sleep,导致 Windows 运行时在进程退出阶段检测到活跃线程/未释放资源而触发异常。
修复
在 bench 客户端模式的所有请求完成后,显式调用
coro_io::g_io_context_pool().stop(true)强制停止全局 io_context_pool。
stop(true)会对每个 io_context 调用stop(),使
run()立即返回,后台线程随即退出,进程可以干净地结束。测试
在 Windows 上对修复后的 bench 进行了 3500+ 次压力测试,覆盖以下场景:
全部以退出码 0 正常退出,无任何运行时异常。
Closes #1151