From 76fa54ea704a87cbcdfad8dd86e89585b3c5ab7f Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 15 Apr 2014 15:56:41 +0200 Subject: [PATCH] Fix failed agent checks after restarts. Refs #4865 --- components/agent/agentchecktask.cpp | 37 ++++++++++++++++++----------- components/agent/agentchecktask.h | 2 ++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/components/agent/agentchecktask.cpp b/components/agent/agentchecktask.cpp index 58ee20214..674ea4237 100644 --- a/components/agent/agentchecktask.cpp +++ b/components/agent/agentchecktask.cpp @@ -58,7 +58,7 @@ void AgentCheckTask::AgentTimerHandler(void) double now = Utility::GetTime(); BOOST_FOREACH(kv, l_PendingChecks) { - if (kv.second < now - 60 && kv.first->IsCheckPending()) { + if (kv.second < now - 60 && kv.first->IsCheckPending() && !SendResult(kv.first, false)) { CheckResult::Ptr cr = make_shared(); cr->SetOutput("Agent isn't responding."); cr->SetState(ServiceCritical); @@ -71,7 +71,7 @@ void AgentCheckTask::AgentTimerHandler(void) l_PendingChecks.swap(newmap); } -void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) +bool AgentCheckTask::SendResult(const Checkable::Ptr& checkable, bool enqueue) { Host::Ptr host; Service::Ptr service; @@ -90,14 +90,14 @@ void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu if (agent_identity.IsEmpty() || agent_host.IsEmpty()) { Log(LogWarning, "agent", "'agent_name' and 'agent_host' must be set for agent checks."); - return; + return false; } String agent_peer_host = MacroProcessor::ResolveMacros("$agent_peer_host$", resolvers, checkable->GetLastCheckResult()); String agent_peer_port = MacroProcessor::ResolveMacros("$agent_peer_port$", resolvers, checkable->GetLastCheckResult()); - + double now = Utility::GetTime(); - + BOOST_FOREACH(const AgentListener::Ptr& al, DynamicType::GetObjects()) { double seen = al->GetAgentSeen(agent_identity); @@ -108,17 +108,26 @@ void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu if (cr) { checkable->ProcessCheckResult(cr); - return; + return true; } } - - { - boost::mutex::scoped_lock lock(l_Mutex); - l_PendingChecks[checkable] = now; - } - BOOST_FOREACH(const AgentListener::Ptr& al, DynamicType::GetObjects()) { - if (!agent_peer_host.IsEmpty() && !agent_peer_port.IsEmpty()) - al->AddConnection(agent_peer_host, agent_peer_port); + if (enqueue) { + { + boost::mutex::scoped_lock lock(l_Mutex); + l_PendingChecks[checkable] = now; + } + + BOOST_FOREACH(const AgentListener::Ptr& al, DynamicType::GetObjects()) { + if (!agent_peer_host.IsEmpty() && !agent_peer_port.IsEmpty()) + al->AddConnection(agent_peer_host, agent_peer_port); + } } + + return false; +} + +void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) +{ + SendResult(checkable, true); } diff --git a/components/agent/agentchecktask.h b/components/agent/agentchecktask.h index 2102f2a9d..e35a34e5c 100644 --- a/components/agent/agentchecktask.h +++ b/components/agent/agentchecktask.h @@ -41,6 +41,8 @@ private: AgentCheckTask(void); static void AgentTimerHandler(void); + + static bool SendResult(const Checkable::Ptr& checkable, bool enqueue); }; } -- 2.40.0