From 7a359bb15023e4fe2b8299d219cf0cce670d5760 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 14 Nov 2023 12:20:14 +0100 Subject: [PATCH] Downtime#TriggerDowntime(): ObjectLock(this), except for other Downtimes SetRemovalInfo() and Deactivate() already lock themselves like this. The latter calls Stop() which also runs Icinga DB hooks while being locked. This prevents trigger and remove events from malforming each other. Especially Downtimes don't get cancelled during triggering. --- lib/icinga/downtime.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 1b0781344..6bd81f72f 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -487,6 +487,8 @@ void Downtime::SetupCleanupTimer() void Downtime::TriggerDowntime(double triggerTime) { + ObjectLock oLock (this); + if (!CanBeTriggered()) return; @@ -499,10 +501,9 @@ void Downtime::TriggerDowntime(double triggerTime) SetTriggerTime(triggerTime); } - { - ObjectLock olock (this); - SetupCleanupTimer(); - } + SetupCleanupTimer(); + OnDowntimeTriggered(this); + oLock.Unlock(); Array::Ptr triggers = GetTriggers(); @@ -517,8 +518,6 @@ void Downtime::TriggerDowntime(double triggerTime) downtime->TriggerDowntime(triggerTime); } } - - OnDowntimeTriggered(this); } void Downtime::SetRemovalInfo(const String& removedBy, double removeTime, const MessageOrigin::Ptr& origin) {