Skip to content

Commit af33327

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 af33327

File tree

1 file changed

+2
-7
lines changed

1 file changed

+2
-7
lines changed

lib/icinga/checkable-dependency.cpp

Lines changed: 2 additions & 7 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)) {
@@ -80,7 +75,7 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
8075
for (const Dependency::Ptr& dep : deps) {
8176
std::string redundancy_group = dep->GetRedundancyGroup();
8277

83-
if (!dep->IsAvailable(dt)) {
78+
if (!dep->GetParent()->IsReachable(dt, failedDependency, rstack + 1) || !dep->IsAvailable(dt)) {
8479
if (redundancy_group.empty()) {
8580
Log(LogDebug, "Checkable")
8681
<< "Non-redundant dependency '" << dep->GetName() << "' failed for checkable '" << GetName() << "': Marking as unreachable.";
@@ -92,7 +87,7 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
9287
}
9388

9489
// 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)
90+
// so it either passed before (don't overwrite) or already failed (so don't care)
9691
// note that std::unordered_map::insert() will not overwrite an existing entry
9792
violated.insert(std::make_pair(redundancy_group, dep));
9893
} else if (!redundancy_group.empty()) {

0 commit comments

Comments
 (0)