Skip to content

Commit cab27fc

Browse files
committed
Checkable: Don't skip redundancy group checks for parent dependencies
Previously, all parent dependencies were recursively checked right at the beginning of `Checkable::IsReachable()` for reachability and immediately returned `false` if one of them fails. However, since the introduction of `redundancy_group`, that failed parent might be within a redundancy group, which shouldn't necessarily cause the dependency to fail completely. This PR changes this insofar as not all parents are checked at the beginning of the method, but only a single parent per a dependency object is evaluated.
1 parent 67175c4 commit cab27fc

File tree

1 file changed

+4
-8
lines changed

1 file changed

+4
-8
lines changed

lib/icinga/checkable-dependency.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
5555
return false;
5656
}
5757

58-
for (const Checkable::Ptr& checkable : GetParents()) {
59-
if (!checkable->IsReachable(dt, failedDependency, rstack + 1))
60-
return false;
61-
}
62-
6358
/* implicit dependency on host if this is a service */
6459
const auto *service = dynamic_cast<const Service *>(this);
6560
if (service && (dt == DependencyState || dt == DependencyNotification)) {
@@ -78,9 +73,10 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
7873
std::unordered_map<std::string, Dependency::Ptr> violated; // key: redundancy group, value: nullptr if satisfied, violating dependency otherwise
7974

8075
for (const Dependency::Ptr& dep : deps) {
81-
std::string redundancy_group = dep->GetRedundancyGroup();
76+
bool parentReachable(dep->GetParent()->IsReachable(dt, failedDependency, rstack + 1));
8277

83-
if (!dep->IsAvailable(dt)) {
78+
std::string redundancy_group = dep->GetRedundancyGroup();
79+
if (!parentReachable || !dep->IsAvailable(dt)) {
8480
if (redundancy_group.empty()) {
8581
Log(LogDebug, "Checkable")
8682
<< "Non-redundant dependency '" << dep->GetName() << "' failed for checkable '" << GetName() << "': Marking as unreachable.";
@@ -92,7 +88,7 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
9288
}
9389

9490
// tentatively mark this dependency group as failed unless it is already marked;
95-
// so it either passed before (don't overwrite) or already failed (so don't care)
91+
// so it either passed before (don't overwrite) or already failed (so don't care)
9692
// note that std::unordered_map::insert() will not overwrite an existing entry
9793
violated.insert(std::make_pair(redundancy_group, dep));
9894
} else if (!redundancy_group.empty()) {

0 commit comments

Comments
 (0)