diff options
author | Kshitij Gupta <kshitij.gupta@mongodb.com> | 2021-08-24 20:04:44 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-12-28 21:25:35 +0000 |
commit | a4641b61478d2801508caf586a6637adb4ece96a (patch) | |
tree | 1ad1ff419834966069ac2eb585a04df28a1a0720 /src/mongo/db/process_health/fault_manager.cpp | |
parent | f1186c309dbe23151c07cf3cd4040e8347cda2ff (diff) | |
download | mongo-a4641b61478d2801508caf586a6637adb4ece96a.tar.gz |
SERVER-59362 Setup Fault Manager State Machine
Diffstat (limited to 'src/mongo/db/process_health/fault_manager.cpp')
-rw-r--r-- | src/mongo/db/process_health/fault_manager.cpp | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/mongo/db/process_health/fault_manager.cpp b/src/mongo/db/process_health/fault_manager.cpp index b7400c373e8..f5107b42cc4 100644 --- a/src/mongo/db/process_health/fault_manager.cpp +++ b/src/mongo/db/process_health/fault_manager.cpp @@ -63,7 +63,8 @@ void FaultManager::set(ServiceContext* svcCtx, std::unique_ptr<FaultManager> new FaultManager::~FaultManager() {} FaultState FaultManager::getFaultState() const { - return FaultState::kOk; + stdx::lock_guard<Latch> lk(_stateMutex); + return _currentState; } boost::optional<FaultConstPtr> FaultManager::activeFault() const { @@ -72,5 +73,64 @@ boost::optional<FaultConstPtr> FaultManager::activeFault() const { void FaultManager::healthCheck() {} +Status FaultManager::transitionToState(FaultState newState) { + Status status = Status::OK(); + switch (newState) { + case FaultState::kOk: + status = _transitionToKOk(); + break; + case FaultState::kTransientFault: + status = _transitionToKTransientFault(); + break; + case FaultState::kActiveFault: + status = _transitionToKActiveFault(); + break; + default: + return Status(ErrorCodes::BadValue, + fmt::format("Illegal transition from {} to {}", _currentState, newState)); + break; + } + + if (status.isOK()) + LOGV2_DEBUG(5936201, 1, "Transitioned fault manager state", "newState"_attr = newState); + + return status; +} + +Status FaultManager::_transitionToKOk() { + stdx::lock_guard<Latch> lk(_stateMutex); + if (_currentState != FaultState::kStartupCheck && _currentState != FaultState::kTransientFault) + return Status( + ErrorCodes::BadValue, + fmt::format("Illegal transition from {} to {}", _currentState, FaultState::kOk)); + + _currentState = FaultState::kOk; + return Status::OK(); +} + +Status FaultManager::_transitionToKTransientFault() { + stdx::lock_guard<Latch> lk(_stateMutex); + if (_currentState != FaultState::kStartupCheck && _currentState != FaultState::kOk) + return Status(ErrorCodes::BadValue, + fmt::format("Illegal transition from {} to {}", + _currentState, + FaultState::kTransientFault)); + + _currentState = FaultState::kTransientFault; + return Status::OK(); +} + +Status FaultManager::_transitionToKActiveFault() { + stdx::lock_guard<Latch> lk(_stateMutex); + if (_currentState != FaultState::kTransientFault) + return Status(ErrorCodes::BadValue, + fmt::format("Illegal transition from {} to {}", + _currentState, + FaultState::kActiveFault)); + + _currentState = FaultState::kActiveFault; + return Status::OK(); +} + } // namespace process_health } // namespace mongo |