Don't load the replication component on standalone instances.

Fixes #3687
This commit is contained in:
Gunnar Beutner 2013-02-11 23:37:39 +01:00
parent a8e584811f
commit c878065a1f
5 changed files with 46 additions and 26 deletions

View File

@ -63,26 +63,14 @@ void ReplicationComponent::CheckResultRequestHandler(const RequestMessage& reque
String svcname = params.GetService(); String svcname = params.GetService();
Service::Ptr service = Service::GetByName(svcname); Service::Ptr service = Service::GetByName(svcname);
Service::OnCheckResultReceived(service, params);
Dictionary::Ptr cr = params.GetCheckResult(); Dictionary::Ptr cr = params.GetCheckResult();
if (!cr) if (!cr)
return; return;
Value active = cr->Get("active"); if (cr->Contains("checker") && cr->Get("checker") == EndpointManager::GetInstance()->GetIdentity())
return;
time_t ts; Service::UpdateStatistics(cr);
Value schedule_end = cr->Get("schedule_end");
if (!schedule_end.IsEmpty())
ts = static_cast<time_t>(schedule_end);
else
ts = static_cast<time_t>(Utility::GetTime());
if (active.IsEmpty() || static_cast<long>(active))
CIB::UpdateActiveChecksStatistics(ts, 1);
else
CIB::UpdatePassiveChecksStatistics(ts, 1);
} }
void ReplicationComponent::EndpointConnectedHandler(const Endpoint::Ptr& endpoint) void ReplicationComponent::EndpointConnectedHandler(const Endpoint::Ptr& endpoint)

20
itl/cluster.conf Normal file
View File

@ -0,0 +1,20 @@
/******************************************************************************
* Icinga 2 *
* Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software Foundation *
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
******************************************************************************/
local object Component "replication" {}

View File

@ -32,15 +32,7 @@ REGISTER_TYPE(IcingaApplication, NULL);
IcingaApplication::IcingaApplication(const Dictionary::Ptr& serializedUpdate) IcingaApplication::IcingaApplication(const Dictionary::Ptr& serializedUpdate)
: Application(serializedUpdate) : Application(serializedUpdate)
{ { }
/* load replication config component */
ConfigItemBuilder::Ptr replicationComponentConfig = boost::make_shared<ConfigItemBuilder>();
replicationComponentConfig->SetType("Component");
replicationComponentConfig->SetName("replication");
replicationComponentConfig->SetLocal(true);
replicationComponentConfig->Compile()->Commit();
replicationComponentConfig.reset();
}
/** /**
* The entry point for the Icinga application. * The entry point for the Icinga application.

View File

@ -25,7 +25,6 @@ const int Service::DefaultMaxCheckAttempts = 3;
const int Service::DefaultCheckInterval = 5 * 60; const int Service::DefaultCheckInterval = 5 * 60;
const int Service::CheckIntervalDivisor = 5; const int Service::CheckIntervalDivisor = 5;
boost::signal<void (const Service::Ptr&, const CheckResultMessage&)> Service::OnCheckResultReceived;
boost::signal<void (const Service::Ptr&, const String&)> Service::OnCheckerChanged; boost::signal<void (const Service::Ptr&, const String&)> Service::OnCheckerChanged;
boost::signal<void (const Service::Ptr&, const Value&)> Service::OnNextCheckChanged; boost::signal<void (const Service::Ptr&, const Value&)> Service::OnNextCheckChanged;
@ -500,6 +499,9 @@ void Service::CheckCompletedHandler(const Dictionary::Ptr& scheduleInfo,
if (!result->Contains("active")) if (!result->Contains("active"))
result->Set("active", 1); result->Set("active", 1);
if (!result->Contains("checker"))
result->Set("checker", EndpointManager::GetInstance()->GetIdentity());
ProcessCheckResult(result); ProcessCheckResult(result);
} }
@ -515,6 +517,8 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr)
{ {
ApplyCheckResult(cr); ApplyCheckResult(cr);
Service::UpdateStatistics(cr);
/* flush the current transaction so other instances see the service's /* flush the current transaction so other instances see the service's
* new state when they receive the CheckResult message */ * new state when they receive the CheckResult message */
DynamicObject::FlushTx(); DynamicObject::FlushTx();
@ -531,3 +535,19 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr)
EndpointManager::GetInstance()->SendMulticastMessage(rm); EndpointManager::GetInstance()->SendMulticastMessage(rm);
} }
void Service::UpdateStatistics(const Dictionary::Ptr& cr)
{
time_t ts;
Value schedule_end = cr->Get("schedule_end");
if (!schedule_end.IsEmpty())
ts = static_cast<time_t>(schedule_end);
else
ts = static_cast<time_t>(Utility::GetTime());
Value active = cr->Get("active");
if (active.IsEmpty() || static_cast<long>(active))
CIB::UpdateActiveChecksStatistics(ts, 1);
else
CIB::UpdatePassiveChecksStatistics(ts, 1);
}

View File

@ -169,6 +169,7 @@ public:
void SetAcknowledgementExpiry(double timestamp); void SetAcknowledgementExpiry(double timestamp);
void ApplyCheckResult(const Dictionary::Ptr& cr); void ApplyCheckResult(const Dictionary::Ptr& cr);
static void UpdateStatistics(const Dictionary::Ptr& cr);
void BeginExecuteCheck(const function<void (void)>& callback); void BeginExecuteCheck(const function<void (void)>& callback);
void ProcessCheckResult(const Dictionary::Ptr& cr); void ProcessCheckResult(const Dictionary::Ptr& cr);
@ -179,7 +180,6 @@ public:
static ServiceStateType StateTypeFromString(const String& state); static ServiceStateType StateTypeFromString(const String& state);
static String StateTypeToString(ServiceStateType state); static String StateTypeToString(ServiceStateType state);
static boost::signal<void (const Service::Ptr& service, const CheckResultMessage&)> OnCheckResultReceived;
static boost::signal<void (const Service::Ptr&, const String&)> OnCheckerChanged; static boost::signal<void (const Service::Ptr&, const String&)> OnCheckerChanged;
static boost::signal<void (const Service::Ptr&, const Value&)> OnNextCheckChanged; static boost::signal<void (const Service::Ptr&, const Value&)> OnNextCheckChanged;