RestCatalog: concurrent HTTP requests can crash in libcurl
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 20/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- backend, networking
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- C++
- Stelle
- 227
- Fork
- 142
- Merge medio
- 3g 21m
- PR unite (30g)
- 70
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/iceberg-cpp
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
apache/iceberg-cpp#1103 ·
I maintainer di solito rispondono entro 2 giorni
-
help wanted
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
apache/iceberg-cpp#1101 ·
I maintainer di solito rispondono entro 2 giorni
-
Support Iceberg SQL viewsAperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
apache/iceberg-cpp#1099 ·
I maintainer di solito rispondono entro 2 giorni
-
Complete OAuth2 token refresh and expiration support (Java-compatible)Forse già presa @lishuxu l’ha presa 2 giorni fa. Aperta
apache/iceberg-cpp#1095 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
Make RestCatalog safe to share across threadsForse già presa @smaheshwar-pltr l’ha presa 3 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
apache/iceberg-cpp#1091 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di apache/iceberg-cpp
Issue simili
-
ai_p2
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
ClickHouse/ClickHouse#130006 ·
I maintainer di solito rispondono entro 1 giorno
-
DepotMaintain: EN longer string moves the hint popup buttons out of reach // WpfGUI English LanguageApertaclient: WpfGui module: depot question
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
MaaAssistantArknights/MaaAssistantArknights#19169 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
area: certificates bug outdated-version
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
RafaelNGP/xbox-cloud-gaming-ps5#381 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 1 giorno
-
parse_selu lowering loses catastrophic cancellation → silent 0.0 for moderate positive inputsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
ROCm/AMDMIGraphX#5490 ·
I maintainer di solito rispondono entro 3 giorni