summaryrefslogtreecommitdiff
path: root/src/mongo/db/process_health/fault_manager.cpp
diff options
context:
space:
mode:
authorKshitij Gupta <kshitij.gupta@mongodb.com>2021-08-24 20:04:44 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-12-28 21:25:35 +0000
commita4641b61478d2801508caf586a6637adb4ece96a (patch)
tree1ad1ff419834966069ac2eb585a04df28a1a0720 /src/mongo/db/process_health/fault_manager.cpp
parentf1186c309dbe23151c07cf3cd4040e8347cda2ff (diff)
downloadmongo-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.cpp62
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