common/restart_waiter.cpp (83 lines of code) (raw):
#include "restart_waiter.h"
#include "redis_table_waiter.h"
#include "redispipeline.h"
#include "schema.h"
#include <boost/algorithm/string.hpp>
#include <string>
using namespace swss;
static const std::string STATE_DB_NAME = "STATE_DB";
static const std::string STATE_DB_SEPARATOR = "|";
static const std::string RESTART_KEY = "system";
static const std::string RESTART_ENABLE_FIELD = "enable";
static const std::string FAST_REBOOT_TABLE_NAME = "FAST_RESTART_ENABLE_TABLE";
// waitAdvancedBootDone
bool RestartWaiter::waitAdvancedBootDone(
unsigned int maxWaitSec,
unsigned int dbTimeout,
bool isTcpConn)
{
DBConnector stateDb(STATE_DB_NAME, dbTimeout, isTcpConn);
return isAdvancedBootInProgress(stateDb) ? doWait(stateDb, maxWaitSec) : true;
}
bool RestartWaiter::waitWarmBootDone(
unsigned int maxWaitSec,
unsigned int dbTimeout,
bool isTcpConn)
{
DBConnector stateDb(STATE_DB_NAME, dbTimeout, isTcpConn);
if (isFastBootInProgress(stateDb))
{
// It is fast boot, just return
return true;
}
return isAdvancedBootInProgress(stateDb) ? doWait(stateDb, maxWaitSec) : true;
}
bool RestartWaiter::waitFastBootDone(
unsigned int maxWaitSec,
unsigned int dbTimeout,
bool isTcpConn)
{
DBConnector stateDb(STATE_DB_NAME, dbTimeout, isTcpConn);
if (!isFastBootInProgress(stateDb))
{
// Fast boot is not in progress
return true;
}
return isAdvancedBootInProgress(stateDb) ? doWait(stateDb, maxWaitSec) : true;
}
bool RestartWaiter::doWait(DBConnector &stateDb,
unsigned int maxWaitSec)
{
RedisTableWaiter::ConditionFunc condFunc = [](const std::string &value) -> bool {
std::string copy = value;
boost::to_lower(copy);
return copy == "false";
};
return RedisTableWaiter::waitUntilFieldSet(stateDb,
STATE_WARM_RESTART_ENABLE_TABLE_NAME,
RESTART_KEY,
RESTART_ENABLE_FIELD,
maxWaitSec,
condFunc);
}
bool RestartWaiter::isAdvancedBootInProgress(DBConnector &stateDb)
{
return isAdvancedBootInProgressHelper(stateDb);
}
bool RestartWaiter::isAdvancedBootInProgressHelper(DBConnector &stateDb,
bool checkFastBoot)
{
std::string table_name = checkFastBoot ? FAST_REBOOT_TABLE_NAME : STATE_WARM_RESTART_ENABLE_TABLE_NAME;
auto ret = stateDb.hget(table_name + STATE_DB_SEPARATOR + RESTART_KEY, RESTART_ENABLE_FIELD);
if (ret) {
std::string value = *ret.get();
boost::to_lower(value);
return value == "true";
}
return false;
}
bool RestartWaiter::isFastBootInProgress(DBConnector &stateDb)
{
return isAdvancedBootInProgressHelper(stateDb, true);
}
bool RestartWaiter::isWarmBootInProgress(swss::DBConnector &stateDb)
{
return isAdvancedBootInProgress(stateDb) && !isFastBootInProgress(stateDb);
}