From fc96582867acd2bcaef29feaae5c1193969d9a27 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 17 Mar 2026 15:24:46 +0000 Subject: Don't start new curl operations outside the main thread Neither the curl handle, not the operation map is thread safe. This isn't ideal, but it does solve the problem in a safe manor. --- src/ingestor.cpp | 5 +++-- src/ingestor.hpp | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ingestor.cpp b/src/ingestor.cpp index 950641b..ba89991 100644 --- a/src/ingestor.cpp +++ b/src/ingestor.cpp @@ -76,7 +76,8 @@ namespace WebStat { Ingestor::Ingestor(const utsname & host, DB::ConnectionPoolPtr dbpl, IngestorSettings settings) : settings {std::move(settings)}, dbpool {std::move(dbpl)}, ingestParkedLines {&Ingestor::jobIngestParkedLines}, - purgeOldLogs {&Ingestor::jobPurgeOldLogs}, hostnameId {crc32(host.nodename)}, curl {curl_multi_init()} + purgeOldLogs {&Ingestor::jobPurgeOldLogs}, hostnameId {crc32(host.nodename)}, curl {curl_multi_init()}, + mainThread {std::this_thread::get_id()} { auto dbconn = dbpool->get(); auto ins = dbconn->modify(SQL::HOST_UPSERT, SQL::HOST_UPSERT_OPTS); @@ -347,7 +348,7 @@ namespace WebStat { const auto & [entityId, type, value] = *entity; const auto & [typeName, onInsert] = ENTITY_TYPE_VALUES[std::to_underlying(type)]; bindMany(insert, 0, entityId, typeName, value); - if (insert->execute() > 0 && onInsert) { + if (insert->execute() > 0 && onInsert && std::this_thread::get_id() == mainThread) { std::invoke(onInsert, this, *entity); } return std::get<0>(*entity); diff --git a/src/ingestor.hpp b/src/ingestor.hpp index b158f03..c5628d6 100644 --- a/src/ingestor.hpp +++ b/src/ingestor.hpp @@ -101,5 +101,6 @@ namespace WebStat { uint32_t hostnameId; CurlMultiPtr curl; mutable CurlOperations curlOperations; + std::thread::id mainThread; }; } -- cgit v1.3