summaryrefslogtreecommitdiff
path: root/src/mongo/db/process_health/fault_manager.cpp
diff options
context:
space:
mode:
authorAndrew Shuvalov <andrew.shuvalov@mongodb.com>2021-09-01 20:53:41 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-12-28 21:25:35 +0000
commit69314a077ceddc902a3c04c19daad8397ce8c473 (patch)
tree8e41b536b359edbaaab0df7c386228799c85dfa4 /src/mongo/db/process_health/fault_manager.cpp
parentfe0548ba39450977cdd3ff432bebb4fa0914b07c (diff)
downloadmongo-69314a077ceddc902a3c04c19daad8397ce8c473.tar.gz
SERVER-59567 Health observers are invoked periodically and create a Fault Facet on failure
Diffstat (limited to 'src/mongo/db/process_health/fault_manager.cpp')
-rw-r--r--src/mongo/db/process_health/fault_manager.cpp35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/mongo/db/process_health/fault_manager.cpp b/src/mongo/db/process_health/fault_manager.cpp
index d37edc75350..cfb88a488fd 100644
--- a/src/mongo/db/process_health/fault_manager.cpp
+++ b/src/mongo/db/process_health/fault_manager.cpp
@@ -71,15 +71,13 @@ FaultState FaultManager::getFaultState() const {
return _currentState;
}
-boost::optional<FaultConstPtr> FaultManager::activeFault() const {
- return {};
+FaultConstPtr FaultManager::activeFault() const {
+ auto lk = stdx::lock_guard(_mutex);
+ return std::static_pointer_cast<const Fault>(_fault);
}
-boost::optional<FaultFacetsContainerPtr> FaultManager::getFaultFacetsContainer() {
+FaultFacetsContainerPtr FaultManager::getFaultFacetsContainer() {
auto lk = stdx::lock_guard(_mutex);
- if (!_fault) {
- return {};
- }
return std::static_pointer_cast<FaultFacetsContainer>(_fault);
}
@@ -87,7 +85,7 @@ FaultFacetsContainerPtr FaultManager::getOrCreateFaultFacetsContainer() {
auto lk = stdx::lock_guard(_mutex);
if (!_fault) {
// Create a new one.
- _fault = std::make_shared<FaultImpl>(_svcCtx);
+ _fault = std::make_shared<FaultImpl>(_svcCtx->getFastClockSource());
}
return std::static_pointer_cast<FaultFacetsContainer>(_fault);
}
@@ -95,6 +93,29 @@ FaultFacetsContainerPtr FaultManager::getOrCreateFaultFacetsContainer() {
void FaultManager::healthCheck() {
// One time init.
_initHealthObserversIfNeeded();
+
+ std::vector<HealthObserver*> observers = FaultManager::getHealthObservers();
+
+ // Start checks outside of lock.
+ for (auto observer : observers) {
+ observer->periodicCheck(*this);
+ }
+
+ // Garbage collect all resolved fault facets.
+ auto optionalActiveFault = getFaultFacetsContainer();
+ if (optionalActiveFault) {
+ optionalActiveFault->garbageCollectResolvedFacets();
+ }
+
+ // If the whole fault becomes resolved, garbage collect it
+ // with proper locking.
+ std::shared_ptr<FaultInternal> faultToDelete;
+ {
+ auto lk = stdx::lock_guard(_mutex);
+ if (_fault && _fault->getFacets().empty()) {
+ faultToDelete.swap(_fault);
+ }
+ }
}
Status FaultManager::transitionToState(FaultState newState) {