summaryrefslogtreecommitdiff
path: root/src/mongo/db/process_health/health_observer_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/process_health/health_observer_base.cpp')
-rw-r--r--src/mongo/db/process_health/health_observer_base.cpp47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/mongo/db/process_health/health_observer_base.cpp b/src/mongo/db/process_health/health_observer_base.cpp
index 243a9cf7937..01d90bf3db6 100644
--- a/src/mongo/db/process_health/health_observer_base.cpp
+++ b/src/mongo/db/process_health/health_observer_base.cpp
@@ -56,25 +56,38 @@ SharedSemiFuture<HealthCheckStatus> HealthObserverBase::periodicCheck(
_currentlyRunningHealthCheck = true;
}
+ Future<HealthCheckStatus> healthCheckResult;
+
+ try {
+ healthCheckResult = periodicCheckImpl({token, taskExecutor});
+ } catch (const DBException& e) {
+ LOGV2_DEBUG(6728001,
+ 2,
+ "Health observer failed due to an exception",
+ "observerType"_attr = getType(),
+ "errorCode"_attr = e.code(),
+ "reason"_attr = e.reason());
+
+ healthCheckResult = makeSimpleFailedStatus(Severity::kFailure, {e.toStatus()});
+ }
+
_deadlineFuture = DeadlineFuture<HealthCheckStatus>::create(
taskExecutor,
- periodicCheckImpl({token, taskExecutor})
- .onCompletion([this](StatusWith<HealthCheckStatus> status) {
- const auto now = _svcCtx->getPreciseClockSource()->now();
-
- auto lk = stdx::lock_guard(_mutex);
- ++_completedChecksCount;
- invariant(_currentlyRunningHealthCheck);
- _currentlyRunningHealthCheck = false;
- _lastTimeCheckCompleted = now;
-
- if (!status.isOK() ||
- !HealthCheckStatus::isResolved(status.getValue().getSeverity())) {
- ++_completedChecksWithFaultCount;
- }
-
- return status;
- }),
+ std::move(healthCheckResult).onCompletion([this](StatusWith<HealthCheckStatus> status) {
+ const auto now = _svcCtx->getPreciseClockSource()->now();
+
+ auto lk = stdx::lock_guard(_mutex);
+ ++_completedChecksCount;
+ invariant(_currentlyRunningHealthCheck);
+ _currentlyRunningHealthCheck = false;
+ _lastTimeCheckCompleted = now;
+
+ if (!status.isOK() || !HealthCheckStatus::isResolved(status.getValue().getSeverity())) {
+ ++_completedChecksWithFaultCount;
+ }
+
+ return status;
+ }),
getObserverTimeout());
return _deadlineFuture->get();