From 940ae4b0c3e68d59d47491946f36bc84f4d7da01 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 21 Feb 2014 17:26:56 +0100 Subject: [PATCH] DB IDO: Send endpoint authority for status updates. Refs #5636 --- components/db_ido_pgsql/schema/pgsql.sql | 1 - lib/base/dynamicobject.cpp | 2 +- lib/base/dynamicobject.h | 2 +- lib/db_ido/dbobject.cpp | 15 +++++++++++---- lib/db_ido/dbobject.h | 4 ++-- lib/icinga/service-check.cpp | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/components/db_ido_pgsql/schema/pgsql.sql b/components/db_ido_pgsql/schema/pgsql.sql index bd01157ac5d..4cf055ec671 100644 --- a/components/db_ido_pgsql/schema/pgsql.sql +++ b/components/db_ido_pgsql/schema/pgsql.sql @@ -1420,7 +1420,6 @@ ALTER TABLE icinga_servicechecks ADD COLUMN endpoint_object_id bigint default NU ALTER TABLE icinga_statehistory ADD COLUMN endpoint_object_id bigint default NULL; ALTER TABLE icinga_systemcommands ADD COLUMN endpoint_object_id bigint default NULL; - -- ----------------------------------------- -- add index (delete) -- ----------------------------------------- diff --git a/lib/base/dynamicobject.cpp b/lib/base/dynamicobject.cpp index 65c831096e0..11be09821cc 100644 --- a/lib/base/dynamicobject.cpp +++ b/lib/base/dynamicobject.cpp @@ -44,7 +44,7 @@ INITIALIZE_ONCE(&DynamicObject::StaticInitialize); boost::signals2::signal DynamicObject::OnStarted; boost::signals2::signal DynamicObject::OnStopped; -boost::signals2::signal DynamicObject::OnStateChanged; +boost::signals2::signal DynamicObject::OnStateChanged; boost::signals2::signal DynamicObject::OnAuthorityChanged; void DynamicObject::StaticInitialize(void) diff --git a/lib/base/dynamicobject.h b/lib/base/dynamicobject.h index c2b4337973a..fa7e5761787 100644 --- a/lib/base/dynamicobject.h +++ b/lib/base/dynamicobject.h @@ -56,7 +56,7 @@ class I2_BASE_API DynamicObject : public ObjectImpl static boost::signals2::signal OnStarted; static boost::signals2::signal OnStopped; - static boost::signals2::signal OnStateChanged; + static boost::signals2::signal OnStateChanged; static boost::signals2::signal OnAuthorityChanged; Value InvokeMethod(const String& method, const std::vector& arguments); diff --git a/lib/db_ido/dbobject.cpp b/lib/db_ido/dbobject.cpp index 89307a72cbb..f20f731a330 100644 --- a/lib/db_ido/dbobject.cpp +++ b/lib/db_ido/dbobject.cpp @@ -21,6 +21,7 @@ #include "db_ido/dbtype.h" #include "db_ido/dbvalue.h" #include "icinga/service.h" +#include "cluster/endpoint.h" #include "base/dynamictype.h" #include "base/objectlock.h" #include "base/utility.h" @@ -41,7 +42,7 @@ DbObject::DbObject(const shared_ptr& type, const String& name1, const St void DbObject::StaticInitialize(void) { /* triggered in ProcessCheckResult(), requires UpdateNextCheck() to be called before */ - DynamicObject::OnStateChanged.connect(boost::bind(&DbObject::StateChangedHandler, _1)); + DynamicObject::OnStateChanged.connect(boost::bind(&DbObject::StateChangedHandler, _1, _2)); } void DbObject::SetObject(const DynamicObject::Ptr& object) @@ -95,10 +96,12 @@ void DbObject::SendConfigUpdate(void) OnConfigUpdate(); } -void DbObject::SendStatusUpdate(void) +void DbObject::SendStatusUpdate(const String& authority) { Dictionary::Ptr fields = GetStatusFields(); + Endpoint::Ptr endpoint = Endpoint::GetByName(authority); + if (!fields) return; @@ -109,6 +112,10 @@ void DbObject::SendStatusUpdate(void) query.Fields = fields; query.Fields->Set(GetType()->GetIDColumn(), GetObject()); query.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + if (endpoint) + query.Fields->Set("endpoint_object_id", endpoint); + query.Fields->Set("status_update_time", DbValue::FromTimestamp(Utility::GetTime())); query.WhereCriteria = make_shared(); query.WhereCriteria->Set(GetType()->GetIDColumn(), GetObject()); @@ -183,12 +190,12 @@ DbObject::Ptr DbObject::GetOrCreateByObject(const DynamicObject::Ptr& object) return dbobj; } -void DbObject::StateChangedHandler(const DynamicObject::Ptr& object) +void DbObject::StateChangedHandler(const DynamicObject::Ptr& object, const String& authority) { DbObject::Ptr dbobj = GetOrCreateByObject(object); if (!dbobj) return; - dbobj->SendStatusUpdate(); + dbobj->SendStatusUpdate(authority); } diff --git a/lib/db_ido/dbobject.h b/lib/db_ido/dbobject.h index d6bc9abbb32..896f730897b 100644 --- a/lib/db_ido/dbobject.h +++ b/lib/db_ido/dbobject.h @@ -79,7 +79,7 @@ class I2_DB_IDO_API DbObject : public Object static boost::signals2::signal OnQuery; void SendConfigUpdate(void); - void SendStatusUpdate(void); + void SendStatusUpdate(const String& authority = String()); double GetLastConfigUpdate(void) const; double GetLastStatusUpdate(void) const; @@ -100,7 +100,7 @@ class I2_DB_IDO_API DbObject : public Object double m_LastConfigUpdate; double m_LastStatusUpdate; - static void StateChangedHandler(const DynamicObject::Ptr& object); + static void StateChangedHandler(const DynamicObject::Ptr& object, const String& authority); friend class DbType; }; diff --git a/lib/icinga/service-check.cpp b/lib/icinga/service-check.cpp index 6fb654d395a..b6885485389 100644 --- a/lib/icinga/service-check.cpp +++ b/lib/icinga/service-check.cpp @@ -417,7 +417,7 @@ void Service::ProcessCheckResult(const CheckResult::Ptr& cr, const String& autho OnNewCheckResult(GetSelf(), cr, authority); /* signal status updates to for example db_ido */ - OnStateChanged(GetSelf()); + OnStateChanged(GetSelf(), authority); if (hardChange) OnStateChange(GetSelf(), cr, StateTypeHard, authority);