Skip to content

fix(bench): 修复客户端池模式退出时的运行时异常#1187

Merged
poor-circle merged 1 commit into
alibaba:mainfrom
milestone-17:fix/issue-1151
May 20, 2026
Merged

fix(bench): 修复客户端池模式退出时的运行时异常#1187
poor-circle merged 1 commit into
alibaba:mainfrom
milestone-17:fix/issue-1151

Conversation

@milestone-17

Copy link
Copy Markdown
Contributor

问题

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+ 次压力测试,覆盖以下场景:

  • 客户端池模式 (c=1/4, m=1/3, -g 1 -h 0): 1500 次
  • 复用池模式 (c=1/4, m=1/5, -g 1 -h 1): 1500 次
  • 无池模式 (c=2, m=2, -g 0 -h 0): 500 次

全部以退出码 0 正常退出,无任何运行时异常。

Closes #1151

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>
@poor-circle poor-circle marked this pull request as ready for review May 20, 2026 15:32
@poor-circle poor-circle self-assigned this May 20, 2026
@poor-circle

Copy link
Copy Markdown
Collaborator

LGTM, thank you

@milestone-17

Copy link
Copy Markdown
Contributor Author

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 修。

@poor-circle

Copy link
Copy Markdown
Collaborator

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 修。

是的,这个错可以先不管

@milestone-17

Copy link
Copy Markdown
Contributor Author

你好,请问目前这个pr可以合并了吗
关于这个错误,我想单独开一个pr,尝试一下是否能够修复

@poor-circle

Copy link
Copy Markdown
Collaborator

你好,请问目前这个pr可以合并了吗 关于这个错误,我想单独开一个pr,尝试一下是否能够修复

等剩下几个跑完吧,感谢

@github-actions

Copy link
Copy Markdown

for detail, goto summary download Artifacts base-ylt-cov-report(base commit coverage report) and ylt-cov-report(current pull request coverage report)

@milestone-17

Copy link
Copy Markdown
Contributor Author

你好,当前的pr可以合并了

@poor-circle poor-circle merged commit 45ee216 into alibaba:main May 20, 2026
30 of 31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

coro_rpc客户端池连接模式下退出时存在运行时异常

2 participants