diff --git a/lib/perfdata/gelfwriter.cpp b/lib/perfdata/gelfwriter.cpp index 6f8567f7073..2828839eea4 100644 --- a/lib/perfdata/gelfwriter.cpp +++ b/lib/perfdata/gelfwriter.cpp @@ -49,11 +49,12 @@ void GelfWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perf for (const GelfWriter::Ptr& gelfwriter : ConfigType::GetObjectsByType()) { size_t workQueueItems = gelfwriter->m_WorkQueue.GetLength(); double workQueueItemRate = gelfwriter->m_WorkQueue.GetTaskCount(60) / 60.0; + auto connection = gelfwriter->m_LockedConnection.load(); nodes.emplace_back(gelfwriter->GetName(), new Dictionary({ { "work_queue_items", workQueueItems }, { "work_queue_item_rate", workQueueItemRate }, - { "connected", gelfwriter->m_Connection->IsConnected() }, + { "connected", connection && connection->IsConnected() }, { "source", gelfwriter->GetSource() } })); @@ -90,7 +91,8 @@ void GelfWriter::Resume() /* Register exception handler for WQ tasks. */ m_WorkQueue.SetExceptionCallback([this](boost::exception_ptr exp) { ExceptionHandler(std::move(exp)); }); - m_Connection = new PerfdataWriterConnection{this, GetHost(), GetPort(), m_SslContext, !GetInsecureNoverify()}; + m_LockedConnection.store(new PerfdataWriterConnection{this, GetHost(), GetPort(), m_SslContext, !GetInsecureNoverify()}); + m_Connection = m_LockedConnection.load(); /* Register event handlers. */ m_HandleCheckResults = Checkable::OnNewCheckResult.connect([this](const Checkable::Ptr& checkable, diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp index f7d2a10c339..3663dfbe9de 100644 --- a/lib/perfdata/gelfwriter.hpp +++ b/lib/perfdata/gelfwriter.hpp @@ -34,6 +34,7 @@ class GelfWriter final : public ObjectImpl private: PerfdataWriterConnection::Ptr m_Connection; + Locked m_LockedConnection; WorkQueue m_WorkQueue{10000000, 1}; Shared::Ptr m_SslContext; diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index e00cd927589..71eaeb359b9 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -58,11 +58,12 @@ void GraphiteWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& for (const GraphiteWriter::Ptr& graphitewriter : ConfigType::GetObjectsByType()) { size_t workQueueItems = graphitewriter->m_WorkQueue.GetLength(); double workQueueItemRate = graphitewriter->m_WorkQueue.GetTaskCount(60) / 60.0; + auto connection = graphitewriter->m_LockedConnection.load(); nodes.emplace_back(graphitewriter->GetName(), new Dictionary({ { "work_queue_items", workQueueItems }, { "work_queue_item_rate", workQueueItemRate }, - { "connected", graphitewriter->m_Connection->IsConnected() } + { "connected", connection && connection->IsConnected() } })); perfdata->Add(new PerfdataValue("graphitewriter_" + graphitewriter->GetName() + "_work_queue_items", workQueueItems)); @@ -85,7 +86,8 @@ void GraphiteWriter::Resume() /* Register exception handler for WQ tasks. */ m_WorkQueue.SetExceptionCallback([this](boost::exception_ptr exp) { ExceptionHandler(std::move(exp)); }); - m_Connection = new PerfdataWriterConnection{this, GetHost(), GetPort()}; + m_LockedConnection.store(new PerfdataWriterConnection{this, GetHost(), GetPort()}); + m_Connection = m_LockedConnection.load(); /* Register event handlers. */ m_HandleCheckResults = Checkable::OnNewCheckResult.connect([this](const Checkable::Ptr& checkable, diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index 470fcc07dac..2785e5e29ca 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -36,6 +36,7 @@ class GraphiteWriter final : public ObjectImpl private: PerfdataWriterConnection::Ptr m_Connection; + Locked m_LockedConnection; WorkQueue m_WorkQueue{10000000, 1}; boost::signals2::connection m_HandleCheckResults; diff --git a/lib/perfdata/opentsdbwriter.cpp b/lib/perfdata/opentsdbwriter.cpp index 1b2f82a7d9c..c79e09d7ac1 100644 --- a/lib/perfdata/opentsdbwriter.cpp +++ b/lib/perfdata/opentsdbwriter.cpp @@ -55,11 +55,12 @@ void OpenTsdbWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& for (const OpenTsdbWriter::Ptr& opentsdbwriter : ConfigType::GetObjectsByType()) { size_t workQueueItems = opentsdbwriter->m_WorkQueue.GetLength(); double workQueueItemRate = opentsdbwriter->m_WorkQueue.GetTaskCount(60) / 60.0; + auto connection = opentsdbwriter->m_LockedConnection.load(); nodes.emplace_back( opentsdbwriter->GetName(), new Dictionary({ - { "connected", opentsdbwriter->m_Connection->IsConnected() }, + { "connected", connection && connection->IsConnected() }, {"work_queue_items", workQueueItems}, {"work_queue_item_rate", workQueueItemRate} } @@ -90,7 +91,8 @@ void OpenTsdbWriter::Resume() ReadConfigTemplate(); - m_Connection = new PerfdataWriterConnection{this, GetHost(), GetPort()}; + m_LockedConnection.store(new PerfdataWriterConnection{this, GetHost(), GetPort()}); + m_Connection = m_LockedConnection.load(); m_HandleCheckResults = Service::OnNewCheckResult.connect([this](const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const MessageOrigin::Ptr&) { CheckResultHandler(checkable, cr); diff --git a/lib/perfdata/opentsdbwriter.hpp b/lib/perfdata/opentsdbwriter.hpp index 5db2985400a..0dc00f9d07b 100644 --- a/lib/perfdata/opentsdbwriter.hpp +++ b/lib/perfdata/opentsdbwriter.hpp @@ -37,6 +37,7 @@ class OpenTsdbWriter final : public ObjectImpl WorkQueue m_WorkQueue{10000000, 1}; std::string m_MsgBuf; PerfdataWriterConnection::Ptr m_Connection; + Locked m_LockedConnection; boost::signals2::connection m_HandleCheckResults;