Fix failed agent checks after restarts.

Refs #4865
This commit is contained in:
Gunnar Beutner 2014-04-15 15:56:41 +02:00
parent e32de02dea
commit 76fa54ea70
2 changed files with 25 additions and 14 deletions

View File

@ -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<CheckResult>();
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,7 +90,7 @@ 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());
@ -108,10 +108,11 @@ void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu
if (cr) {
checkable->ProcessCheckResult(cr);
return;
return true;
}
}
if (enqueue) {
{
boost::mutex::scoped_lock lock(l_Mutex);
l_PendingChecks[checkable] = now;
@ -121,4 +122,12 @@ void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu
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);
}

View File

@ -41,6 +41,8 @@ private:
AgentCheckTask(void);
static void AgentTimerHandler(void);
static bool SendResult(const Checkable::Ptr& checkable, bool enqueue);
};
}