From 3e7a1ce999b2223b321573de19cef840021f77f5 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 13 May 2026 15:21:06 +0100 Subject: Fix checking of background job completeness OK, this is on me. future::valid does not tell you if the thread has completed and the result is ready. It tells you if there is some state you can get() maybe later. Here we replace those checks with a 0s wait and a test to see if the status is ready. The exit steps are updated to reflect this. Calling reset will invoke the future's destructor, which blocks until the thread is joined as needed. This should hopefully address the issue where the main thread would still block if it attempted to runJobAsNeeded for a job that was still running. --- src/ingestor.cpp | 8 +++++--- test/test-ingest.cpp | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ingestor.cpp b/src/ingestor.cpp index 2c59866..e2c6f02 100644 --- a/src/ingestor.cpp +++ b/src/ingestor.cpp @@ -281,7 +281,9 @@ namespace WebStat { withCurlLock(&Ingestor::handleCurlOperations, this); } finishAllJobs(); - std::invoke(storeQueueLines.impl, this)(); + storeQueueLines.currentRun.reset(); + beginIngestQueuedLogLines(); + storeQueueLines.currentRun.reset(); std::ignore = parkLogLines(queuedLines); std::ignore = parkLogLines(processingLines); withCurlLock([this]() { @@ -300,7 +302,7 @@ namespace WebStat { Ingestor::beginIngestQueuedLogLines() { if (storeQueueLines.currentRun) { - if (!storeQueueLines.currentRun->valid()) { + if (storeQueueLines.currentRun->wait_for(std::chrono::seconds {}) != std::future_status::ready) { return {*storeQueueLines.currentRun, false}; } finalizeJob(storeQueueLines, {}, Job::LastRunTime::clock::now()); @@ -447,7 +449,7 @@ namespace WebStat { { auto runJobAsNeeded = [this, now = Job::LastRunTime::clock::now()](Job & job, auto freq) { if (job.currentRun) { - if (job.currentRun->valid()) { + if (job.currentRun->wait_for(std::chrono::seconds {}) == std::future_status::ready) { finalizeJob(job, freq, now); } } diff --git a/test/test-ingest.cpp b/test/test-ingest.cpp index 60338a2..0dad6e6 100644 --- a/test/test-ingest.cpp +++ b/test/test-ingest.cpp @@ -272,7 +272,7 @@ BOOST_AUTO_TEST_CASE(StoreLog, *boost::unit_test::depends_on("I/StoreLogLine")) WebStat::LogFile log {"/tmp/store-log-fixture.log", 10}; WebStat::FilePtr input {fopen(log.path.c_str(), "r")}; BOOST_REQUIRE(input); - ingestLog(input.get()); + BOOST_CHECK_NO_THROW(ingestLog(input.get())); BOOST_CHECK_EQUAL(stats.linesRead, 10); BOOST_CHECK_EQUAL(stats.linesParsed, 10); BOOST_CHECK_EQUAL(stats.linesParseFailed, 0); -- cgit v1.3