diff options
| author | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-03-17 15:24:46 +0000 |
|---|---|---|
| committer | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-03-17 15:24:46 +0000 |
| commit | fc96582867acd2bcaef29feaae5c1193969d9a27 (patch) | |
| tree | ee26552a7ce3d4e27a2d35acc844926273f6828d | |
| parent | d2ecb7f49c3f3b60e3d1f297fd033071a02cfa9a (diff) | |
| download | webstat-fc96582867acd2bcaef29feaae5c1193969d9a27.tar.bz2 webstat-fc96582867acd2bcaef29feaae5c1193969d9a27.tar.xz webstat-fc96582867acd2bcaef29feaae5c1193969d9a27.zip | |
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.
| -rw-r--r-- | src/ingestor.cpp | 5 | ||||
| -rw-r--r-- | 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; }; } |
