Skip to content
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

vlanmgr changes related to EVPN VxLan warmboot #1460

Merged
merged 9 commits into from
Dec 27, 2020
49 changes: 48 additions & 1 deletion cfgmgr/vlanmgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,34 @@ 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");
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");
}
const std::string cmds = std::string("")
+ IP_CMD + " link show " + DOT1Q_BRIDGE_NAME + " 2>/dev/null";

Expand Down Expand Up @@ -298,6 +320,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 +331,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 +418,16 @@ 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");
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");
}
}

bool VlanMgr::isMemberStateOk(const string &alias)
Expand Down Expand Up @@ -536,6 +570,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 +612,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 +640,16 @@ 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");
WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED);
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why this change from REPLAYED?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@prsunny test_VlanMgrdWarmRestart was failing as it expected the state to be RECONCILED. I understand now that as per HLD it is supposed to be REPLAYED. I will discuss with team members and check on how to handle this.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@prsunny I will change the existing pytest script to match the EVPN HLD

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@prsunny I will change the existing pytest to expect REPLAYED instead of RECONCILED to match the EVPN HLD

SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED");

}
}

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