diff --git a/common/warm_restart.cpp b/common/warm_restart.cpp index 62aa846c1..34da10667 100644 --- a/common/warm_restart.cpp +++ b/common/warm_restart.cpp @@ -10,7 +10,10 @@ const WarmStart::WarmStartStateNameMap WarmStart::warmStartStateNameMap = { {INITIALIZED, "initialized"}, {RESTORED, "restored"}, - {RECONCILED, "reconciled"} + {REPLAYED, "replayed"}, + {RECONCILED, "reconciled"}, + {WSDISABLED, "disabled"}, + {WSUNKNOWN, "unknown"} }; const WarmStart::DataCheckStateNameMap WarmStart::dataCheckStateNameMap = @@ -181,6 +184,41 @@ bool WarmStart::isSystemWarmRebootEnabled(void) return warmStart.m_systemWarmRebootEnabled; } +void WarmStart::getWarmStartState(const std::string &app_name, WarmStartState &state) +{ + std::string statestr; + + auto& warmStart = getInstance(); + + state = RECONCILED; + + if (!isWarmStart()) + { + return; + } + + warmStart.m_stateWarmRestartTable->hget(app_name, "state", statestr); + + /* If warm-start is enabled, state cannot be assumed as Reconciled + * It should be set to unknown + */ + state = WSUNKNOWN; + + for (auto it = warmStartStateNameMap.begin(); it != warmStartStateNameMap.end(); it++) + { + if (it->second == statestr) + { + state = it->first; + break; + } + } + + SWSS_LOG_INFO("%s warm start state get %s(%d)", + app_name.c_str(), statestr.c_str(), state); + + return; +} + // Set the WarmStart FSM state for a particular application. void WarmStart::setWarmStartState(const std::string &app_name, WarmStartState state) { diff --git a/common/warm_restart.h b/common/warm_restart.h index dd6bf7c42..f3facaf4f 100644 --- a/common/warm_restart.h +++ b/common/warm_restart.h @@ -16,7 +16,10 @@ class WarmStart { INITIALIZED, RESTORED, + REPLAYED, RECONCILED, + WSDISABLED, + WSUNKNOWN, }; enum DataCheckState @@ -53,6 +56,9 @@ class WarmStart static bool isSystemWarmRebootEnabled(void); + static void getWarmStartState(const std::string &app_name, + WarmStartState &state); + static void setWarmStartState(const std::string &app_name, WarmStartState state);