From 73f8c4473ebce8e8ad725116e88f079baead15d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Aleksandrovi=C4=8D=20Klimov?= Date: Thu, 29 Jun 2023 10:42:12 +0200 Subject: [PATCH 1/2] ElasticsearchWriter#Pause(): call Flush() only once The first Flush() is redundant and may access m_DataBuffer at the same time as some Flush() in m_WorkQueue (race condition) which isn't joined, yet. --- lib/perfdata/elasticsearchwriter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 3df9c91a0..7a7d6f18c 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -117,7 +117,6 @@ void ElasticsearchWriter::Pause() m_HandleStateChanges.disconnect(); m_HandleNotifications.disconnect(); - Flush(); m_WorkQueue.Join(); Flush(); From 8dca4d7121885fde3287d01acc9818ffd1b46aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Aleksandrovi=C4=8D=20Klimov?= Date: Fri, 30 Jun 2023 14:57:18 +0200 Subject: [PATCH 2/2] ElasticsearchWriter#Pause(): lock m_DataBufferMutex during Flush() just to be sure regarding race conditions. --- lib/perfdata/elasticsearchwriter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 7a7d6f18c..f8e7140ea 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -118,7 +118,11 @@ void ElasticsearchWriter::Pause() m_HandleNotifications.disconnect(); m_WorkQueue.Join(); - Flush(); + + { + std::unique_lock lock (m_DataBufferMutex); + Flush(); + } Log(LogInformation, "ElasticsearchWriter") << "'" << GetName() << "' paused.";