From: Michael Friedrich <michael.friedrich@icinga.com>
Date: Wed, 20 Feb 2019 14:21:24 +0000 (+0100)
Subject: InfluxdbWriter: Ensure to flush buffers after emptying the metrics queue on Pause... 
X-Git-Tag: v2.11.0-rc1~212^2~7
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4bdebc79505f999ec9de2bc3d5a0fea012de976;p=icinga2

InfluxdbWriter: Ensure to flush buffers after emptying the metrics queue on Pause/Shutdown/Reload

Patch taken from @al2klimov but moved into Pause()
---

diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp
index 91fb1be10..13b15d30b 100644
--- a/lib/perfdata/influxdbwriter.cpp
+++ b/lib/perfdata/influxdbwriter.cpp
@@ -130,13 +130,30 @@ void InfluxdbWriter::Resume()
 	Checkable::OnNewCheckResult.connect(std::bind(&InfluxdbWriter::CheckResultHandler, this, _1, _2));
 }
 
+/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */
 void InfluxdbWriter::Pause()
 {
-	Log(LogInformation, "InfluxdbWriter")
-		<< "'" << GetName() << "' paused.";
+	/* Force a flush. */
+	Log(LogDebug, "InfluxdbWriter")
+		<< "Flushing pending data buffers.";
+
+	Flush();
+
+	/* Work on the missing tasks. TODO: Find a way to cache them on disk. */
+	Log(LogDebug, "InfluxdbWriter")
+		<< "Joining existing WQ tasks.";
 
 	m_WorkQueue.Join();
 
+	/* Flush again after the WQ tasks have filled the data buffer. */
+	Log(LogDebug, "InfluxdbWriter")
+		<< "Flushing data buffers from WQ tasks.";
+
+	Flush();
+
+	Log(LogInformation, "InfluxdbWriter")
+		<< "'" << GetName() << "' paused.";
+
 	ObjectImpl<InfluxdbWriter>::Pause();
 }
 
@@ -428,6 +445,9 @@ void InfluxdbWriter::FlushTimeoutWQ()
 
 void InfluxdbWriter::Flush()
 {
+	Log(LogDebug, "InfluxdbWriter")
+		<< "Flushing data buffer to InfluxDB.";
+
 	String body = boost::algorithm::join(m_DataBuffer, "\n");
 	m_DataBuffer.clear();