mirror of
https://github.com/Icinga/icinga2.git
synced 2025-04-08 17:05:25 +02:00
IDO: use per-instance notification_id in history
When there are multiple active IDO instances on the same node, before this commit, all of them would share a single DbValue object for the notification_id column of the icinga_contactnotifications table. This resulted in the issue that one database references the notification_id in another database. This commit fixes this by using a separate DbValue value for each IDO instance. This needs a new signal as the existing OnQuery and OnMultipleQueries signals perform the same queries on all IDO instances, but different queries are needed here per instance (they only differ in the referenced DbValue). Therefore, a new signal OnMakeQueries is added that takes a std::function which is called once per IDO instance and can access callbacks to perform one or multiple queries only on this specific IDO instance.
This commit is contained in:
parent
8016b013ac
commit
7c9d0fff01
@ -45,8 +45,19 @@ void DbConnection::Start(bool runtimeCreated)
|
||||
Log(LogInformation, "DbConnection")
|
||||
<< "'" << GetName() << "' started.";
|
||||
|
||||
DbObject::OnQuery.connect([this](const DbQuery& query) { ExecuteQuery(query); });
|
||||
DbObject::OnMultipleQueries.connect([this](const std::vector<DbQuery>& multiQueries) { ExecuteMultipleQueries(multiQueries); });
|
||||
auto onQuery = [this](const DbQuery& query) { ExecuteQuery(query); };
|
||||
DbObject::OnQuery.connect(onQuery);
|
||||
|
||||
auto onMultipleQueries = [this](const std::vector<DbQuery>& multiQueries) { ExecuteMultipleQueries(multiQueries); };
|
||||
DbObject::OnMultipleQueries.connect(onMultipleQueries);
|
||||
|
||||
DbObject::QueryCallbacks queryCallbacks;
|
||||
queryCallbacks.Query = onQuery;
|
||||
queryCallbacks.MultipleQueries = onMultipleQueries;
|
||||
|
||||
DbObject::OnMakeQueries.connect([queryCallbacks](const std::function<void (const DbObject::QueryCallbacks&)>& queryFunc) {
|
||||
queryFunc(queryCallbacks);
|
||||
});
|
||||
}
|
||||
|
||||
void DbConnection::Stop(bool runtimeRemoved)
|
||||
|
@ -837,6 +837,12 @@ void DbEvents::AddAcknowledgementInternal(const Checkable::Ptr& checkable, Ackno
|
||||
void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, const Checkable::Ptr& checkable, const std::set<User::Ptr>& users, NotificationType type,
|
||||
const CheckResult::Ptr& cr, const String& author, const String& text)
|
||||
{
|
||||
/* NotificationInsertID has to be tracked per IDO instance, therefore the OnQuery and OnMultipleQueries signals
|
||||
* cannot be called directly as all IDO instances would insert rows with the same ID which is (most likely) only
|
||||
* correct in one database. Instead, pass a lambda which generates the queries with new DbValue for
|
||||
* NotificationInsertID each IDO instance.
|
||||
*/
|
||||
DbObject::OnMakeQueries([&checkable, &users, &type, &cr](const DbObject::QueryCallbacks& callbacks) {
|
||||
/* start and end happen at the same time */
|
||||
std::pair<unsigned long, unsigned long> timeBag = ConvertTimestamp(Utility::GetTime());
|
||||
|
||||
@ -879,7 +885,7 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con
|
||||
fields1->Set("endpoint_object_id", endpoint);
|
||||
|
||||
query1.Fields = fields1;
|
||||
DbObject::OnQuery(query1);
|
||||
callbacks.Query(query1);
|
||||
|
||||
std::vector<DbQuery> queries;
|
||||
|
||||
@ -902,7 +908,8 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con
|
||||
queries.emplace_back(std::move(query2));
|
||||
}
|
||||
|
||||
DbObject::OnMultipleQueries(queries);
|
||||
callbacks.MultipleQueries(queries);
|
||||
});
|
||||
}
|
||||
|
||||
/* statehistory */
|
||||
|
@ -25,6 +25,7 @@ using namespace icinga;
|
||||
|
||||
boost::signals2::signal<void (const DbQuery&)> DbObject::OnQuery;
|
||||
boost::signals2::signal<void (const std::vector<DbQuery>&)> DbObject::OnMultipleQueries;
|
||||
boost::signals2::signal<void (const std::function<void (const DbObject::QueryCallbacks&)>&)> DbObject::OnMakeQueries;
|
||||
|
||||
INITIALIZE_ONCE(&DbObject::StaticInitialize);
|
||||
|
||||
|
@ -61,8 +61,14 @@ public:
|
||||
|
||||
static DbObject::Ptr GetOrCreateByObject(const ConfigObject::Ptr& object);
|
||||
|
||||
struct QueryCallbacks {
|
||||
std::function<void(const DbQuery&)> Query;
|
||||
std::function<void(const std::vector<DbQuery>&)> MultipleQueries;
|
||||
};
|
||||
|
||||
static boost::signals2::signal<void (const DbQuery&)> OnQuery;
|
||||
static boost::signals2::signal<void (const std::vector<DbQuery>&)> OnMultipleQueries;
|
||||
static boost::signals2::signal<void (const std::function<void (const QueryCallbacks&)>&)> OnMakeQueries;
|
||||
|
||||
void SendConfigUpdateHeavy(const Dictionary::Ptr& configFields);
|
||||
void SendConfigUpdateLight();
|
||||
|
Loading…
x
Reference in New Issue
Block a user