summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan.goodliffe@octal.co.uk>2026-03-17 15:24:46 +0000
committerDan Goodliffe <dan.goodliffe@octal.co.uk>2026-03-17 15:24:46 +0000
commitfc96582867acd2bcaef29feaae5c1193969d9a27 (patch)
treeee26552a7ce3d4e27a2d35acc844926273f6828d
parentd2ecb7f49c3f3b60e3d1f297fd033071a02cfa9a (diff)
downloadwebstat-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.cpp5
-rw-r--r--src/ingestor.hpp1
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;
};
}