RestCatalog: concurrent HTTP requests can crash in libcurl
维护者通常 2 天内回复
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 20/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 停滞
- 技术栈
- cpp
- 领域
- backend, networking
调研方向
Start with src/iceberg/catalog/rest/http_client.cc around line 201, where HttpClient uses the shared cpr::ConnectionPool, and review issue #530 for the earlier mutex guarded session. Reproduce the concurrent requests against the REST fixture used by rest_catalog_integration_test, then inspect the client and pool behavior with the libcurl versions named in the issue. Done means concurrent requests no longer trigger the reported crash; pull request #1090 is already open.
由索引模型根据 Issue 内容生成。
描述
HttpClient sends every request through one cpr::ConnectionPool (http_client.cc#L201). That pool wraps a libcurl share handle that shares the connection cache, and libcurl doesn't support using a shared connection cache from several threads at once. When two requests overlap, the process can crash.
A RestCatalog sends all its requests through one HttpClient, so requests can overlap even when the application only calls the catalog from one thread:
- Metrics reports are posted from the executor passed to
RestCatalog::Make(rest_metrics_reporter.cc#L73-L74). - OAuth2 tokens are refreshed on the
auth_executorpassed toRestCatalog::Make(auth_session_internal.h#L284). - Vended S3 credentials are refreshed through LoadCredentials when the AWS SDK signs a request. The refresh runs on whichever thread is doing the S3 I/O (arrow_s3_file_io.cc#L701-L708, rest_catalog.cc#L91).
Applications that share one catalog between threads run into it directly.
The shared pool was introduced in apache/iceberg-cpp#530, which replaced a mutex-guarded cpr::Session.
Reproduction
Run this against the REST fixture that rest_catalog_integration_test uses:
HttpClient client;
auto session = auth::AuthSession::MakeDefault({});
std::vector<std::thread> threads;
for (int i = 0; i < 32; ++i) {
threads.emplace_back([&] {
for (int j = 0; j < 200; ++j) {
(void)client.Get("http://localhost:8181/v1/config", {}, {},
*DefaultErrorHandler::Instance(), *session);
}
});
}
for (auto& thread : threads) thread.join();
With libcurl 8.22.0, this aborted in 6 of 6 runs with heap corruption (free(): corrupted unsorted chunks or double free or corruption). Sharing one RestCatalog between 32 threads that each call LoadTable also crashes, with both 8.22.0 and 8.5.0. Neither reproduces with 8.18.0, the version CI uses, so CI doesn't catch it.
- 主要语言
- C++
- 星标
- 227
- 派生
- 142
- 平均合并
- 3 天 21 分钟
- 30 天内合并 PR
- 70
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
apache/iceberg-cpp 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 77/100
apache/iceberg-cpp#1103 ·
维护者通常 2 天内回复
-
help wanted
难度 4/5 3-5 天 新手友好度 48/100
apache/iceberg-cpp#1101 ·
维护者通常 2 天内回复
-
难度 5/5 一周以上 新手友好度 25/100
apache/iceberg-cpp#1099 ·
维护者通常 2 天内回复
-
Complete OAuth2 token refresh and expiration support (Java-compatible)可能已有人在做 @lishuxu 于 2 天前认领。 未关闭
apache/iceberg-cpp#1095 · 2 条评论 · 已指派 1 人 ·
维护者通常 2 天内回复
-
Make RestCatalog safe to share across threads可能已有人在做 @smaheshwar-pltr 于 3 天前认领。 未关闭
难度 4/5 3-5 天 新手友好度 25/100
apache/iceberg-cpp#1091 ·
维护者通常 2 天内回复
查看 apache/iceberg-cpp 的全部 Issue
相似的 Issue
-
ai_p2
难度 2/5 1-3 小时 新手友好度 82/100
ClickHouse/ClickHouse#130006 ·
维护者通常 1 天内回复
-
DepotMaintain: EN longer string moves the hint popup buttons out of reach // WpfGUI English Language未关闭client: WpfGui module: depot question
难度 2/5 1-3 小时 新手友好度 64/100
MaaAssistantArknights/MaaAssistantArknights#19169 · 2 条评论 ·
维护者通常 1 天内回复
-
area: certificates bug outdated-version
难度 1/5 1 小时以内 新手友好度 65/100
RafaelNGP/xbox-cloud-gaming-ps5#381 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 85/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 74/100
ROCm/AMDMIGraphX#5490 ·
维护者通常 3 天内回复