Skip to content

Commit 6eb36d9

Browse files
authored
vlanmgr changes related to EVPN VxLan warmboot (sonic-net#1460)
vlanmgr changes related to EVPN VxLan warmboot
1 parent 321291a commit 6eb36d9

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

cfgmgr/vlanmgr.cpp

+48-1
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,34 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c
2929
m_stateVlanTable(stateDb, STATE_VLAN_TABLE_NAME),
3030
m_stateVlanMemberTable(stateDb, STATE_VLAN_MEMBER_TABLE_NAME),
3131
m_appVlanTableProducer(appDb, APP_VLAN_TABLE_NAME),
32-
m_appVlanMemberTableProducer(appDb, APP_VLAN_MEMBER_TABLE_NAME)
32+
m_appVlanMemberTableProducer(appDb, APP_VLAN_MEMBER_TABLE_NAME),
33+
replayDone(false)
3334
{
3435
SWSS_LOG_ENTER();
3536

3637
if (WarmStart::isWarmStart())
3738
{
39+
vector<string> vlanKeys, vlanMemberKeys;
40+
41+
/* cache all vlan and vlan member config */
42+
m_cfgVlanTable.getKeys(vlanKeys);
43+
m_cfgVlanMemberTable.getKeys(vlanMemberKeys);
44+
for (auto k : vlanKeys)
45+
{
46+
m_vlanReplay.insert(k);
47+
}
48+
for (auto k : vlanMemberKeys)
49+
{
50+
m_vlanMemberReplay.insert(k);
51+
}
52+
if (m_vlanReplay.empty())
53+
{
54+
replayDone = true;
55+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
56+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
57+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
58+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");
59+
}
3860
const std::string cmds = std::string("")
3961
+ IP_CMD + " link show " + DOT1Q_BRIDGE_NAME + " 2>/dev/null";
4062

@@ -298,6 +320,7 @@ void VlanMgr::doVlanTask(Consumer &consumer)
298320
if (isVlanStateOk(key) && m_vlans.find(key) == m_vlans.end())
299321
{
300322
m_vlans.insert(key);
323+
m_vlanReplay.erase(kfvKey(t));
301324
it = consumer.m_toSync.erase(it);
302325
SWSS_LOG_DEBUG("%s already created", kfvKey(t).c_str());
303326
continue;
@@ -308,6 +331,7 @@ void VlanMgr::doVlanTask(Consumer &consumer)
308331
{
309332
addHostVlan(vlan_id);
310333
}
334+
m_vlanReplay.erase(kfvKey(t));
311335

312336
/* set up host env .... */
313337
for (auto i : kfvFieldsValues(t))
@@ -394,6 +418,16 @@ void VlanMgr::doVlanTask(Consumer &consumer)
394418
it = consumer.m_toSync.erase(it);
395419
}
396420
}
421+
if (!replayDone && m_vlanReplay.empty() &&
422+
m_vlanMemberReplay.empty() &&
423+
WarmStart::isWarmStart())
424+
{
425+
replayDone = true;
426+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
427+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
428+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
429+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");
430+
}
397431
}
398432

399433
bool VlanMgr::isMemberStateOk(const string &alias)
@@ -536,6 +570,7 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
536570
if (isVlanMemberStateOk(kfvKey(t)))
537571
{
538572
SWSS_LOG_DEBUG("%s already set", kfvKey(t).c_str());
573+
m_vlanMemberReplay.erase(kfvKey(t));
539574
it = consumer.m_toSync.erase(it);
540575
continue;
541576
}
@@ -577,6 +612,8 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
577612
FieldValueTuple s("state", "ok");
578613
fvVector.push_back(s);
579614
m_stateVlanMemberTable.set(kfvKey(t), fvVector);
615+
616+
m_vlanMemberReplay.erase(kfvKey(t));
580617
}
581618
}
582619
else if (op == DEL_COMMAND)
@@ -603,6 +640,16 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
603640
/* Other than the case of member port/lag is not ready, no retry will be performed */
604641
it = consumer.m_toSync.erase(it);
605642
}
643+
if (!replayDone && m_vlanMemberReplay.empty() &&
644+
WarmStart::isWarmStart())
645+
{
646+
replayDone = true;
647+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
648+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
649+
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
650+
SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");
651+
652+
}
606653
}
607654

608655
void VlanMgr::doTask(Consumer &consumer)

cfgmgr/vlanmgr.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ class VlanMgr : public Orch
2323
Table m_statePortTable, m_stateLagTable;
2424
Table m_stateVlanTable, m_stateVlanMemberTable;
2525
std::set<std::string> m_vlans;
26-
26+
std::set<std::string> m_vlanReplay;
27+
std::set<std::string> m_vlanMemberReplay;
28+
bool replayDone;
29+
2730
void doTask(Consumer &consumer);
2831
void doVlanTask(Consumer &consumer);
2932
void doVlanMemberTask(Consumer &consumer);

0 commit comments

Comments
 (0)