RestCatalog: concurrent HTTP requests can crash in libcurl
Mantenedores costumam responder em até 2 dias
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 20/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Estagnada
- Stack de tecnologia
- cpp
- Domínio
- backend, networking
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- C++
- Estrelas
- 227
- Forks
- 142
- Merge médio
- 3d 21min
- PRs com merge (30d)
- 70
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de apache/iceberg-cpp
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 77/100
apache/iceberg-cpp#1103 ·
Mantenedores costumam responder em até 2 dias
-
help wanted
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
apache/iceberg-cpp#1101 ·
Mantenedores costumam responder em até 2 dias
-
Support Iceberg SQL viewsAberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
apache/iceberg-cpp#1099 ·
Mantenedores costumam responder em até 2 dias
-
Complete OAuth2 token refresh and expiration support (Java-compatible)Talvez já em andamento @lishuxu assumiu há 2 dias. Aberta
apache/iceberg-cpp#1095 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 2 dias
-
Make RestCatalog safe to share across threadsTalvez já em andamento @smaheshwar-pltr assumiu há 3 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 25/100
apache/iceberg-cpp#1091 ·
Mantenedores costumam responder em até 2 dias
Todas as issues de apache/iceberg-cpp
Issues semelhantes
-
ai_p2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
ClickHouse/ClickHouse#130006 ·
Mantenedores costumam responder em até 1 dia
-
DepotMaintain: EN longer string moves the hint popup buttons out of reach // WpfGUI English LanguageAbertaclient: WpfGui module: depot question
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
MaaAssistantArknights/MaaAssistantArknights#19169 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
area: certificates bug outdated-version
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 65/100
RafaelNGP/xbox-cloud-gaming-ps5#381 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
Mantenedores costumam responder em até 1 dia
-
parse_selu lowering loses catastrophic cancellation → silent 0.0 for moderate positive inputsAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
ROCm/AMDMIGraphX#5490 ·
Mantenedores costumam responder em até 3 dias