diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index efa9477a202..f0af81bdd96 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -360,21 +360,28 @@ Checkable::ProcessingResult Checkable::ProcessCheckResult(const CheckResult::Ptr bool is_flapping = IsFlapping(); - if (cr->GetActive()) { - UpdateNextCheck(origin); - } else { - /* Reschedule the next check for external passive check results. The side effect of - * this is that for as long as we receive results for a service we - * won't execute any active checks. */ - double offset; - double ttl = cr->GetTtl(); - - if (ttl > 0) - offset = ttl; - else - offset = GetCheckInterval(); + // Don't recompute the next check when the current check isn't generated by this endpoint. When the check is + // remotely generated we should've already received the "SetNextCheck" event before the "event::CheckResult" + // cluster event. Otherwise, the next check received before this check will be invalidated and cause the Checkable + // "next_check/next_update" in a HA setup to always be different from the other endpoint as the "m_SchedulingOffset" + // is randomly initialised on each node. + if (!origin) { + if (cr->GetActive()) { + UpdateNextCheck(); + } else { + /* Reschedule the next check for external passive check results. The side effect of + * this is that for as long as we receive results for a service we + * won't execute any active checks. */ + double offset; + double ttl = cr->GetTtl(); + + if (ttl > 0) + offset = ttl; + else + offset = GetCheckInterval(); - SetNextCheck(Utility::GetTime() + offset, false, origin); + SetNextCheck(Utility::GetTime() + offset); + } } olock.Unlock();