Skip to content

Commit 10aea55

Browse files
Adding new states in WarmState Adapter.
1 parent 188ac36 commit 10aea55

File tree

3 files changed

+81
-22
lines changed

3 files changed

+81
-22
lines changed

common/warm_restart.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,34 @@ const std::string WarmStart::kRegistrationCheckpointKey = "checkpoint";
1414
const std::string WarmStart::kRegistrationReconciliationKey = "reconciliation";
1515
const std::string WarmStart::kRegistrationTimestampKey = "timestamp";
1616

17-
const WarmStart::WarmStartStateNameMap WarmStart::warmStartStateNameMap =
17+
const WarmStart::WarmStartStateNameMap* WarmStart::warmStartStateNameMap()
1818
{
19-
{INITIALIZED, "initialized"},
20-
{RESTORED, "restored"},
21-
{REPLAYED, "replayed"},
22-
{RECONCILED, "reconciled"},
23-
{WSDISABLED, "disabled"},
24-
{WSUNKNOWN, "unknown"}
25-
};
26-
27-
const WarmStart::DataCheckStateNameMap WarmStart::dataCheckStateNameMap =
19+
static const auto* const warmStartStateNameMap =
20+
new WarmStartStateNameMap({
21+
{INITIALIZED, "initialized"},
22+
{RESTORED, "restored"},
23+
{REPLAYED, "replayed"},
24+
{RECONCILED, "reconciled"},
25+
{WSDISABLED, "disabled"},
26+
{WSUNKNOWN, "unknown"},
27+
{FROZEN, "frozen"},
28+
{QUIESCENT, "quiescent"},
29+
{CHECKPOINTED, "checkpointed"},
30+
{FAILED, "failed"}
31+
});
32+
return warmStartStateNameMap;
33+
}
34+
35+
const WarmStart::DataCheckStateNameMap* WarmStart::dataCheckStateNameMap()
2836
{
29-
{CHECK_IGNORED, "ignored"},
30-
{CHECK_PASSED, "passed"},
31-
{CHECK_FAILED, "failed"}
32-
};
37+
static const auto* const dataCheckStateNameMap =
38+
new DataCheckStateNameMap({
39+
{CHECK_IGNORED, "ignored"},
40+
{CHECK_PASSED, "passed"},
41+
{CHECK_FAILED, "failed"}
42+
});
43+
return dataCheckStateNameMap;
44+
}
3345

3446
const WarmStart::WarmBootNotificationNameMap* WarmStart::warmBootNotificationNameMap()
3547
{
@@ -309,7 +321,7 @@ void WarmStart::getWarmStartState(const std::string &app_name, WarmStartState &s
309321
*/
310322
state = WSUNKNOWN;
311323

312-
for (auto it = warmStartStateNameMap.begin(); it != warmStartStateNameMap.end(); it++)
324+
for (auto it = warmStartStateNameMap()->begin(); it != warmStartStateNameMap()->end(); it++)
313325
{
314326
if (it->second == statestr)
315327
{
@@ -336,7 +348,7 @@ void WarmStart::setWarmStartState(const std::string &app_name, WarmStartState st
336348

337349
warmStart.m_stateWarmRestartTable->hset(app_name,
338350
"state",
339-
warmStartStateNameMap.at(state).c_str());
351+
warmStartStateNameMap()->at(state).c_str());
340352

341353
if (app_name == warmStart.m_appName)
342354
{
@@ -346,7 +358,7 @@ void WarmStart::setWarmStartState(const std::string &app_name, WarmStartState st
346358

347359
SWSS_LOG_NOTICE("%s warm start state changed to %s",
348360
app_name.c_str(),
349-
warmStartStateNameMap.at(state).c_str());
361+
warmStartStateNameMap()->at(state).c_str());
350362
}
351363

352364
// Set the WarmStart data check state for a particular application.
@@ -362,12 +374,12 @@ void WarmStart::setDataCheckState(const std::string &app_name, DataCheckStage st
362374
}
363375
warmStart.m_stateWarmRestartTable->hset(app_name,
364376
stageField,
365-
dataCheckStateNameMap.at(state).c_str());
377+
dataCheckStateNameMap()->at(state).c_str());
366378

367379
SWSS_LOG_NOTICE("%s %s result %s",
368380
app_name.c_str(),
369381
stageField.c_str(),
370-
dataCheckStateNameMap.at(state).c_str());
382+
dataCheckStateNameMap()->at(state).c_str());
371383
}
372384

373385
WarmStart::DataCheckState WarmStart::getDataCheckState(const std::string &app_name, DataCheckStage stage)
@@ -387,7 +399,7 @@ WarmStart::DataCheckState WarmStart::getDataCheckState(const std::string &app_na
387399

388400
DataCheckState state = CHECK_IGNORED;
389401

390-
for (auto it = dataCheckStateNameMap.begin(); it != dataCheckStateNameMap.end(); it++)
402+
for (auto it = dataCheckStateNameMap()->begin(); it != dataCheckStateNameMap()->end(); it++)
391403
{
392404
if (it->second == stateStr)
393405
{

common/warm_restart.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class WarmStart
2727
RECONCILED,
2828
WSDISABLED,
2929
WSUNKNOWN,
30+
FROZEN,
31+
QUIESCENT,
32+
CHECKPOINTED,
33+
FAILED,
3034
};
3135

3236
enum DataCheckState
@@ -49,10 +53,10 @@ class WarmStart
4953
};
5054

5155
typedef std::map<WarmStartState, std::string> WarmStartStateNameMap;
52-
static const WarmStartStateNameMap warmStartStateNameMap;
56+
static const WarmStartStateNameMap* warmStartStateNameMap();
5357

5458
typedef std::map<DataCheckState, std::string> DataCheckStateNameMap;
55-
static const DataCheckStateNameMap dataCheckStateNameMap;
59+
static const DataCheckStateNameMap* dataCheckStateNameMap();
5660

5761
typedef std::map<WarmBootNotification, std::string> WarmBootNotificationNameMap;
5862
static const WarmBootNotificationNameMap* warmBootNotificationNameMap();

tests/warm_restart_ut.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,49 @@ TEST(WarmRestart, getWarmStartTimer)
168168
EXPECT_EQ(timer, 5000u);
169169
}
170170

171+
TEST(WarmRestart, set_get_WarmStartState)
172+
{
173+
DBConnector stateDb("STATE_DB", 0, true);
174+
Table stateWarmRestartTable(&stateDb, STATE_WARM_RESTART_TABLE_NAME);
175+
Table stateWarmRestartEnableTable(&stateDb, STATE_WARM_RESTART_ENABLE_TABLE_NAME);
176+
177+
DBConnector configDb("CONFIG_DB", 0, true);
178+
Table cfgWarmRestartTable(&configDb, CFG_WARM_RESTART_TABLE_NAME);
179+
180+
//Clean up warm restart state for testAppName and warm restart config for testDockerName
181+
stateWarmRestartTable.del(testAppName);
182+
cfgWarmRestartTable.del(testDockerName);
183+
184+
//Initialize WarmStart class for TestApp
185+
WarmStart::initialize(testAppName, testDockerName, 0, true);
186+
187+
WarmStart::WarmStartState warmStartStates[] =
188+
{
189+
WarmStart::INITIALIZED,
190+
WarmStart::RESTORED,
191+
WarmStart::REPLAYED,
192+
WarmStart::RECONCILED,
193+
WarmStart::WSDISABLED,
194+
WarmStart::WSUNKNOWN,
195+
WarmStart::FROZEN,
196+
WarmStart::QUIESCENT,
197+
WarmStart::CHECKPOINTED,
198+
WarmStart::FAILED,
199+
};
200+
201+
for (const auto &currState : warmStartStates) {
202+
WarmStart::setWarmStartState(testAppName, currState);
203+
204+
string state;
205+
stateWarmRestartTable.hget(testAppName, "state", state);
206+
EXPECT_EQ(state, WarmStart::warmStartStateNameMap()->at(currState).c_str());
207+
208+
WarmStart::WarmStartState ret_state;
209+
WarmStart::getWarmStartState(testAppName, ret_state);
210+
EXPECT_EQ(ret_state, currState);
211+
}
212+
}
213+
171214
TEST(WarmRestart, set_get_DataCheckState)
172215
{
173216
DBConnector stateDb("STATE_DB", 0, true);

0 commit comments

Comments
 (0)