Skip to content

vlanmgr changes related to EVPN VxLan warmboot #1460

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Dec 27, 2020
Merged
42 changes: 41 additions & 1 deletion cfgmgr/vlanmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,32 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c
m_stateVlanTable(stateDb, STATE_VLAN_TABLE_NAME),
m_stateVlanMemberTable(stateDb, STATE_VLAN_MEMBER_TABLE_NAME),
m_appVlanTableProducer(appDb, APP_VLAN_TABLE_NAME),
m_appVlanMemberTableProducer(appDb, APP_VLAN_MEMBER_TABLE_NAME)
m_appVlanMemberTableProducer(appDb, APP_VLAN_MEMBER_TABLE_NAME),
replayDone(false)
{
SWSS_LOG_ENTER();

if (WarmStart::isWarmStart())
{
vector<string> vlanKeys, vlanMemberKeys;

/* cache all vlan and vlan member config */
m_cfgVlanTable.getKeys(vlanKeys);
m_cfgVlanMemberTable.getKeys(vlanMemberKeys);
for (auto k : vlanKeys)
{
m_vlanReplay.insert(k);
}
for (auto k : vlanMemberKeys)
{
m_vlanMemberReplay.insert(k);
}
if (m_vlanReplay.empty())
{
replayDone = true;
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
}
const std::string cmds = std::string("")
+ IP_CMD + " link show " + DOT1Q_BRIDGE_NAME + " 2>/dev/null";

Expand Down Expand Up @@ -298,6 +318,7 @@ void VlanMgr::doVlanTask(Consumer &consumer)
if (isVlanStateOk(key) && m_vlans.find(key) == m_vlans.end())
{
m_vlans.insert(key);
m_vlanReplay.erase(kfvKey(t));
Copy link
Contributor

@qiluo-msft qiluo-msft Nov 7, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kfvKey(t) [](start = 35, length = 9)

erase it directly? #Closed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qiluo-msft sorry, I didn't understand, here I am erasing the key from the set m_vlanReplay, what do you mean by erase 'it' directly?

it = consumer.m_toSync.erase(it);
SWSS_LOG_DEBUG("%s already created", kfvKey(t).c_str());
continue;
Expand All @@ -308,6 +329,7 @@ void VlanMgr::doVlanTask(Consumer &consumer)
{
addHostVlan(vlan_id);
}
m_vlanReplay.erase(kfvKey(t));
Copy link
Contributor

@qiluo-msft qiluo-msft Nov 7, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kfvKey(t) [](start = 31, length = 9)

The same #Closed


/* set up host env .... */
for (auto i : kfvFieldsValues(t))
Expand Down Expand Up @@ -394,6 +416,14 @@ void VlanMgr::doVlanTask(Consumer &consumer)
it = consumer.m_toSync.erase(it);
}
}
if (!replayDone && m_vlanReplay.empty() &&
m_vlanMemberReplay.empty() &&
WarmStart::isWarmStart())
{
replayDone = true;
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
}
}

bool VlanMgr::isMemberStateOk(const string &alias)
Expand Down Expand Up @@ -536,6 +566,7 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
if (isVlanMemberStateOk(kfvKey(t)))
{
SWSS_LOG_DEBUG("%s already set", kfvKey(t).c_str());
m_vlanMemberReplay.erase(kfvKey(t));
it = consumer.m_toSync.erase(it);
continue;
}
Expand Down Expand Up @@ -577,6 +608,8 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
FieldValueTuple s("state", "ok");
fvVector.push_back(s);
m_stateVlanMemberTable.set(kfvKey(t), fvVector);

m_vlanMemberReplay.erase(kfvKey(t));
}
}
else if (op == DEL_COMMAND)
Expand All @@ -603,6 +636,13 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer)
/* Other than the case of member port/lag is not ready, no retry will be performed */
it = consumer.m_toSync.erase(it);
}
if (!replayDone && m_vlanMemberReplay.empty() &&
WarmStart::isWarmStart())
{
replayDone = true;
WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED);
SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED");
}
}

void VlanMgr::doTask(Consumer &consumer)
Expand Down
5 changes: 4 additions & 1 deletion cfgmgr/vlanmgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ class VlanMgr : public Orch
Table m_statePortTable, m_stateLagTable;
Table m_stateVlanTable, m_stateVlanMemberTable;
std::set<std::string> m_vlans;

std::set<std::string> m_vlanReplay;
std::set<std::string> m_vlanMemberReplay;
bool replayDone;

void doTask(Consumer &consumer);
void doVlanTask(Consumer &consumer);
void doVlanMemberTask(Consumer &consumer);
Expand Down
3 changes: 2 additions & 1 deletion tests/test_warm_reboot.py
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,8 @@ def test_VlanMgrdWarmRestart(self, dvs, testlog):
(status, fvs) = tbl.get("Vlan20:11.0.0.11")
assert status == True

swss_app_check_RestoreCount_single(state_db, restore_count, "vlanmgrd")
swss_check_RestoreCount(dvs, state_db, restore_count)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qiluo-msft , could you review this?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are more dependencies on the Reconciled state in the vs tests, I will check and fix.

swss_app_check_warmstart_state(state_db, "vlanmgrd", "replayed")

intf_tbl._del("Vlan16|11.0.0.1/29")
intf_tbl._del("Vlan20|11.0.0.9/29")
Expand Down