From 9a764d8a08f11ab15ffd8d26566b22ced6490360 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 10 Nov 2013 16:53:57 +0100 Subject: [PATCH 1/5] Optimize signal calls. Refs #5049 --- components/checker/checkercomponent.h | 9 +-------- lib/icinga/notification.cpp | 2 +- lib/icinga/service-check.cpp | 20 +++++++++----------- lib/icinga/service-comment.cpp | 4 ++-- lib/icinga/service-downtime.cpp | 6 +++--- lib/icinga/service-flapping.cpp | 2 +- lib/icinga/service-notification.cpp | 4 ++-- lib/icinga/service.cpp | 5 ++--- 8 files changed, 21 insertions(+), 31 deletions(-) diff --git a/components/checker/checkercomponent.h b/components/checker/checkercomponent.h index a393328a0..b0e9a2f23 100644 --- a/components/checker/checkercomponent.h +++ b/components/checker/checkercomponent.h @@ -50,14 +50,7 @@ struct ServiceNextCheckExtractor if (!service->HasAuthority("checker")) return Utility::GetTime() + 60; - double next = service->GetNextCheck(); - - while (next == 0) { - service->UpdateNextCheck(); - next = service->GetNextCheck(); - } - - return next; + return service->GetNextCheck(); } }; diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 36a734982..f6204ca18 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -130,7 +130,7 @@ void Notification::SetNextNotification(double time, const String& authority) { SetNextNotificationRaw(time); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnNextNotificationChanged), GetSelf(), time, authority)); + OnNextNotificationChanged(GetSelf(), time, authority); } void Notification::UpdateNotificationNumber(void) diff --git a/lib/icinga/service-check.cpp b/lib/icinga/service-check.cpp index 3a1152a35..45e98fc8a 100644 --- a/lib/icinga/service-check.cpp +++ b/lib/icinga/service-check.cpp @@ -94,7 +94,7 @@ void Service::SetNextCheck(double nextCheck, const String& authority) { SetNextCheckRaw(nextCheck); - Utility::QueueAsyncCallback(boost::bind(boost::ref(Service::OnNextCheckChanged), GetSelf(), nextCheck, authority)); + OnNextCheckChanged(GetSelf(), nextCheck, authority); } double Service::GetNextCheck(void) @@ -150,7 +150,7 @@ void Service::SetEnableActiveChecks(bool enabled, const String& authority) { SetOverrideEnableActiveChecks(enabled); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnableActiveChecksChanged), GetSelf(), enabled, authority)); + OnEnableActiveChecksChanged(GetSelf(), enabled, authority); } bool Service::GetEnablePassiveChecks(void) const @@ -165,7 +165,7 @@ void Service::SetEnablePassiveChecks(bool enabled, const String& authority) { SetOverrideEnablePassiveChecks(enabled); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnablePassiveChecksChanged), GetSelf(), enabled, authority)); + OnEnablePassiveChecksChanged(GetSelf(), enabled, authority); } bool Service::GetForceNextCheck(void) const @@ -177,7 +177,7 @@ void Service::SetForceNextCheck(bool forced, const String& authority) { SetForceNextCheckRaw(forced); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnForceNextCheckChanged), GetSelf(), forced, authority)); + OnForceNextCheckChanged(GetSelf(), forced, authority); } void Service::ProcessCheckResult(const CheckResult::Ptr& cr, const String& authority) @@ -367,15 +367,13 @@ void Service::ProcessCheckResult(const CheckResult::Ptr& cr, const String& autho // " threshold: " + Convert::ToString(GetFlappingThreshold()) + // "% current: " + Convert::ToString(GetFlappingCurrent()) + "%."); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnNewCheckResult), GetSelf(), cr, authority)); + OnNewCheckResult(GetSelf(), cr, authority); OnStateChanged(GetSelf()); - if (hardChange) { - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnStateChange), GetSelf(), cr, StateTypeHard, authority)); - } - else if (stateChange) { - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnStateChange), GetSelf(), cr, StateTypeSoft, authority)); - } + if (hardChange) + OnStateChange(GetSelf(), cr, StateTypeHard, authority); + else if (stateChange) + OnStateChange(GetSelf(), cr, StateTypeSoft, authority); if (call_eventhandler) ExecuteEventHandler(); diff --git a/lib/icinga/service-comment.cpp b/lib/icinga/service-comment.cpp index e07f2a08e..b06f4c25d 100644 --- a/lib/icinga/service-comment.cpp +++ b/lib/icinga/service-comment.cpp @@ -79,7 +79,7 @@ String Service::AddComment(CommentType entryType, const String& author, l_CommentsCache[uid] = GetSelf(); } - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnCommentAdded), GetSelf(), comment, authority)); + OnCommentAdded(GetSelf(), comment, authority); return uid; } @@ -126,7 +126,7 @@ void Service::RemoveComment(const String& id, const String& authority) l_CommentsCache.erase(id); } - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnCommentRemoved), owner, comment, authority)); + OnCommentRemoved(owner, comment, authority); } String Service::GetCommentIDFromLegacyID(int id) diff --git a/lib/icinga/service-downtime.cpp b/lib/icinga/service-downtime.cpp index 31a06f5e9..d1442239b 100644 --- a/lib/icinga/service-downtime.cpp +++ b/lib/icinga/service-downtime.cpp @@ -99,7 +99,7 @@ String Service::AddDowntime(const String& author, const String& comment, Log(LogWarning, "icinga", "added downtime with ID '" + Convert::ToString(downtime->GetLegacyId()) + "'."); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnDowntimeAdded), GetSelf(), downtime, authority)); + OnDowntimeAdded(GetSelf(), downtime, authority); return uid; } @@ -132,7 +132,7 @@ void Service::RemoveDowntime(const String& id, bool cancelled, const String& aut Log(LogWarning, "icinga", "removed downtime with ID '" + Convert::ToString(downtime->GetLegacyId()) + "' from service '" + owner->GetName() + "'."); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnDowntimeRemoved), owner, downtime, authority)); + OnDowntimeRemoved(owner, downtime, authority); } void Service::TriggerDowntimes(void) @@ -185,7 +185,7 @@ void Service::TriggerDowntime(const String& id) TriggerDowntime(tid); } - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnDowntimeTriggered), owner, downtime)); + OnDowntimeTriggered(owner, downtime); } String Service::GetDowntimeIDFromLegacyID(int id) diff --git a/lib/icinga/service-flapping.cpp b/lib/icinga/service-flapping.cpp index ac9a01b48..144b165a5 100644 --- a/lib/icinga/service-flapping.cpp +++ b/lib/icinga/service-flapping.cpp @@ -50,7 +50,7 @@ void Service::SetEnableFlapping(bool enabled, const String& authority) SetEnableFlappingRaw(enabled); OnFlappingChanged(GetSelf(), enabled ? FlappingEnabled : FlappingDisabled); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnableFlappingChanged), GetSelf(), enabled, authority)); + OnEnableFlappingChanged(GetSelf(), enabled, authority); } void Service::UpdateFlappingStatus(bool stateChange) diff --git a/lib/icinga/service-notification.cpp b/lib/icinga/service-notification.cpp index 491345940..77158fad1 100644 --- a/lib/icinga/service-notification.cpp +++ b/lib/icinga/service-notification.cpp @@ -171,7 +171,7 @@ void Service::SetEnableNotifications(bool enabled, const String& authority) { SetEnableNotificationsRaw(enabled); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnableNotificationsChanged), GetSelf(), enabled, authority)); + OnEnableNotificationsChanged(GetSelf(), enabled, authority); } bool Service::GetForceNextNotification(void) const @@ -183,5 +183,5 @@ void Service::SetForceNextNotification(bool forced, const String& authority) { SetForceNextNotificationRaw(forced); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnForceNextNotificationChanged), GetSelf(), forced, authority)); + OnForceNextNotificationChanged(GetSelf(), forced, authority); } diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 9d526dc68..dbec5f49c 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -199,8 +199,7 @@ void Service::AcknowledgeProblem(const String& author, const String& comment, Ac OnNotificationsRequested(GetSelf(), NotificationAcknowledgement, GetLastCheckResult(), author, comment); - boost::function f = boost::bind(boost::ref(Service::OnAcknowledgementSet), GetSelf(), author, comment, type, expiry, authority); - Utility::QueueAsyncCallback(f); + OnAcknowledgementSet(GetSelf(), author, comment, type, expiry, authority); } void Service::ClearAcknowledgement(const String& authority) @@ -210,7 +209,7 @@ void Service::ClearAcknowledgement(const String& authority) SetAcknowledgementRaw(AcknowledgementNone); SetAcknowledgementExpiry(0); - Utility::QueueAsyncCallback(boost::bind(boost::ref(OnAcknowledgementCleared), GetSelf(), authority)); + OnAcknowledgementCleared(GetSelf(), authority); } std::set Service::GetParentHosts(void) const From ca9b31d4f08071009dabda5838701ba046eeb4a8 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 10 Nov 2013 17:47:47 +0100 Subject: [PATCH 2/5] Add check statistics. Refs #5049 --- components/checker/checkercomponent.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/checker/checkercomponent.cpp b/components/checker/checkercomponent.cpp index 9d806ca53..34921a659 100644 --- a/components/checker/checkercomponent.cpp +++ b/components/checker/checkercomponent.cpp @@ -19,6 +19,7 @@ #include "checker/checkercomponent.h" #include "icinga/icingaapplication.h" +#include "icinga/cib.h" #include "base/dynamictype.h" #include "base/objectlock.h" #include "base/utility.h" @@ -183,7 +184,7 @@ void CheckerComponent::ResultTimerHandler(void) { boost::mutex::scoped_lock lock(m_Mutex); - msgbuf << "Pending services: " << m_PendingServices.size() << "; Idle services: " << m_IdleServices.size(); + msgbuf << "Pending services: " << m_PendingServices.size() << "; Idle services: " << m_IdleServices.size() << "; Checks/s: " << CIB::GetActiveChecksStatistics(5) / 5.0; } Log(LogInformation, "checker", msgbuf.str()); From f7171e3e90243dbdd4c2ede90e82151543d94c35 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 10 Nov 2013 22:04:18 +0100 Subject: [PATCH 3/5] Optimize Service::GetHost. Refs #5049 --- lib/icinga/service.cpp | 11 ++++++----- lib/icinga/service.h | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index dbec5f49c..1eb4d84c1 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -72,9 +72,10 @@ void Service::OnConfigLoaded(void) } } - Host::Ptr host = GetHost(); - if (host) - host->AddService(GetSelf()); + m_Host = Host::GetByName(GetHostRaw()); + + if (m_Host) + m_Host->AddService(GetSelf()); UpdateSlaveNotifications(); } @@ -95,7 +96,7 @@ Service::Ptr Service::GetByNamePair(const String& hostName, const String& servic Host::Ptr Service::GetHost(void) const { - return Host::GetByName(GetHostRaw()); + return m_Host; } bool Service::IsHostCheck(void) const @@ -227,7 +228,7 @@ std::set Service::GetParentHosts(void) const if (dependencies) { ObjectLock olock(dependencies); - BOOST_FOREACH(const Value& dependency, dependencies) { + BOOST_FOREACH(const String& dependency, dependencies) { Host::Ptr host = Host::GetByName(dependency); if (!host) diff --git a/lib/icinga/service.h b/lib/icinga/service.h index 1ae8fca8a..c11e0ea85 100644 --- a/lib/icinga/service.h +++ b/lib/icinga/service.h @@ -255,6 +255,8 @@ protected: virtual void OnConfigLoaded(void); private: + Host::Ptr m_Host; + bool m_CheckRunning; long m_SchedulingOffset; From eb746b9929f451399a48bf6860362bffa42752b4 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Nov 2013 08:22:58 +0100 Subject: [PATCH 4/5] Optimize DynamicObject::HasAuthority(). Refs #5049 --- components/checker/checkercomponent.h | 3 --- lib/base/dynamicobject.cpp | 5 ++++- lib/base/dynamicobject.ti | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/components/checker/checkercomponent.h b/components/checker/checkercomponent.h index b0e9a2f23..a3f1e69e2 100644 --- a/components/checker/checkercomponent.h +++ b/components/checker/checkercomponent.h @@ -47,9 +47,6 @@ struct ServiceNextCheckExtractor */ double operator()(const Service::Ptr& service) { - if (!service->HasAuthority("checker")) - return Utility::GetTime() + 60; - return service->GetNextCheck(); } }; diff --git a/lib/base/dynamicobject.cpp b/lib/base/dynamicobject.cpp index ba7f52c08..2bd119eb5 100644 --- a/lib/base/dynamicobject.cpp +++ b/lib/base/dynamicobject.cpp @@ -74,6 +74,9 @@ void DynamicObject::SetAuthority(const String& type, bool value) if (old_value == value) return; + if (GetAuthorityInfo() == NULL) + SetAuthorityInfo(make_shared()); + GetAuthorityInfo()->Set(type, value); } @@ -84,7 +87,7 @@ bool DynamicObject::HasAuthority(const String& type) const { Dictionary::Ptr authorityInfo = GetAuthorityInfo(); - if (!authorityInfo->Contains(type)) + if (!authorityInfo || !authorityInfo->Contains(type)) return true; return authorityInfo->Get(type); diff --git a/lib/base/dynamicobject.ti b/lib/base/dynamicobject.ti index faf1c4a78..bbf361e73 100644 --- a/lib/base/dynamicobject.ti +++ b/lib/base/dynamicobject.ti @@ -10,9 +10,7 @@ abstract class DynamicObject [config] Array::Ptr domains; [config] Array::Ptr authorities; [get_protected] bool active; - Dictionary::Ptr authority_info { - default {{{ return make_shared(); }}} - }; + Dictionary::Ptr authority_info; [protected] Dictionary::Ptr extensions; }; From 893243db5faac653c63484c9fb514954ea5f84a9 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Nov 2013 09:27:01 +0100 Subject: [PATCH 5/5] Fix exception in Value::ToJson(). Refs #5049 --- lib/base/value.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/base/value.cpp b/lib/base/value.cpp index 5a6bfa9ea..4bdefde52 100644 --- a/lib/base/value.cpp +++ b/lib/base/value.cpp @@ -174,10 +174,8 @@ cJSON *Value::ToJson(void) const } else if (IsObjectType()) { Array::Ptr array = *this; return array->ToJson(); - } else if (IsEmpty()) { - return cJSON_CreateNull(); } else { - BOOST_THROW_EXCEPTION(std::runtime_error("Unknown object type.")); + return cJSON_CreateNull(); } case ValueEmpty: