From d40b5380cb460d6d233a435caa2f7702fa64b5fb Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Thu, 8 Oct 2020 19:22:32 -0700 Subject: [PATCH 1/9] vlanmgr changes related to EVPN VxLan warmboot --- cfgmgr/vlanmgr.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- cfgmgr/vlanmgr.h | 5 ++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/cfgmgr/vlanmgr.cpp b/cfgmgr/vlanmgr.cpp index 7d7a59abeb..4bcbafb742 100644 --- a/cfgmgr/vlanmgr.cpp +++ b/cfgmgr/vlanmgr.cpp @@ -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 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"; @@ -280,6 +300,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)); it = consumer.m_toSync.erase(it); SWSS_LOG_DEBUG("%s already created", kfvKey(t).c_str()); continue; @@ -290,6 +311,7 @@ void VlanMgr::doVlanTask(Consumer &consumer) { addHostVlan(vlan_id); } + m_vlanReplay.erase(kfvKey(t)); /* set up host env .... */ for (auto i : kfvFieldsValues(t)) @@ -368,6 +390,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) @@ -510,6 +540,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; } @@ -551,6 +582,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) @@ -577,6 +610,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) diff --git a/cfgmgr/vlanmgr.h b/cfgmgr/vlanmgr.h index 469f16ccaf..56749bcf31 100644 --- a/cfgmgr/vlanmgr.h +++ b/cfgmgr/vlanmgr.h @@ -23,7 +23,10 @@ class VlanMgr : public Orch Table m_statePortTable, m_stateLagTable; Table m_stateVlanTable, m_stateVlanMemberTable; std::set m_vlans; - + std::set m_vlanReplay; + std::set m_vlanMemberReplay; + bool replayDone; + void doTask(Consumer &consumer); void doVlanTask(Consumer &consumer); void doVlanMemberTask(Consumer &consumer); From 4d0931a3cc8c44681221d64f02d4cb1dc5f0584f Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Mon, 16 Nov 2020 22:54:45 -0800 Subject: [PATCH 2/9] Update vlanmgr.cpp --- cfgmgr/vlanmgr.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cfgmgr/vlanmgr.cpp b/cfgmgr/vlanmgr.cpp index 86043707ca..577b7195b5 100644 --- a/cfgmgr/vlanmgr.cpp +++ b/cfgmgr/vlanmgr.cpp @@ -52,8 +52,8 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c 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"; @@ -397,8 +397,8 @@ void VlanMgr::doVlanTask(Consumer &consumer) 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"); } } @@ -616,8 +616,8 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer) 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"); } } From 9c9d79788a593b0a4f71b94abbbc80dd803c73b9 Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Tue, 1 Dec 2020 16:01:01 -0800 Subject: [PATCH 3/9] Update vlanmgr.cpp Change back state to REPLAYED --- cfgmgr/vlanmgr.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cfgmgr/vlanmgr.cpp b/cfgmgr/vlanmgr.cpp index 577b7195b5..86043707ca 100644 --- a/cfgmgr/vlanmgr.cpp +++ b/cfgmgr/vlanmgr.cpp @@ -52,8 +52,8 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c if (m_vlanReplay.empty()) { replayDone = true; - WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED); - SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED"); + 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"; @@ -397,8 +397,8 @@ void VlanMgr::doVlanTask(Consumer &consumer) WarmStart::isWarmStart()) { replayDone = true; - WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED); - SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED"); + WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED); + SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED"); } } @@ -616,8 +616,8 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer) WarmStart::isWarmStart()) { replayDone = true; - WarmStart::setWarmStartState("vlanmgrd", WarmStart::RECONCILED); - SWSS_LOG_NOTICE("vlanmgr warmstart state set to RECONCILED"); + WarmStart::setWarmStartState("vlanmgrd", WarmStart::REPLAYED); + SWSS_LOG_NOTICE("vlanmgr warmstart state set to REPLAYED"); } } From 53abc6718d6b06737848a34395783af6634b2c4a Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Mon, 7 Dec 2020 15:45:14 -0800 Subject: [PATCH 4/9] Update test_warm_reboot.py --- tests/test_warm_reboot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_warm_reboot.py b/tests/test_warm_reboot.py index e22104adc3..a9a7510f00 100644 --- a/tests/test_warm_reboot.py +++ b/tests/test_warm_reboot.py @@ -437,7 +437,7 @@ 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_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") From 961827b152e91a166d868eb59a9691ecd46b5103 Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Mon, 7 Dec 2020 16:05:16 -0800 Subject: [PATCH 5/9] Update test_warm_reboot.py --- tests/test_warm_reboot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_warm_reboot.py b/tests/test_warm_reboot.py index a9a7510f00..00ff417c9d 100644 --- a/tests/test_warm_reboot.py +++ b/tests/test_warm_reboot.py @@ -437,6 +437,7 @@ def test_VlanMgrdWarmRestart(self, dvs, testlog): (status, fvs) = tbl.get("Vlan20:11.0.0.11") assert status == True + swss_check_RestoreCount(dvs, state_db, restore_count) swss_app_check_warmstart_state(state_db, "vlanmgrd", "replayed") intf_tbl._del("Vlan16|11.0.0.1/29") From 5569d6612b075a03a112188a586ef1c4f2a834da Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Wed, 16 Dec 2020 23:43:40 -0800 Subject: [PATCH 6/9] Update test_warm_reboot.py --- tests/test_warm_reboot.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/test_warm_reboot.py b/tests/test_warm_reboot.py index 00ff417c9d..c44e8f924b 100644 --- a/tests/test_warm_reboot.py +++ b/tests/test_warm_reboot.py @@ -46,7 +46,7 @@ def swss_check_RestoreCount(dvs, state_db, restore_count): if fv[0] == "restore_count": assert int(fv[1]) == restore_count[key] + 1 elif fv[0] == "state": - assert fv[1] == "reconciled" + assert fv[1] == "reconciled" or fv[1] == "replayed" def check_port_oper_status(appl_db, port_name, state): portTbl = swsscommon.Table(appl_db, swsscommon.APP_PORT_TABLE_NAME) @@ -76,7 +76,7 @@ def swss_app_check_RestoreCount_single(state_db, restore_count, name): if fv[0] == "restore_count": assert int(fv[1]) == restore_count[key] + 1 elif fv[0] == "state": - assert fv[1] == "reconciled" + assert fv[1] == "reconciled" or fv[1] == "replayed" def swss_app_check_warmstart_state(state_db, name, state): warmtbl = swsscommon.Table(state_db, swsscommon.STATE_WARM_RESTART_TABLE_NAME) @@ -437,8 +437,7 @@ def test_VlanMgrdWarmRestart(self, dvs, testlog): (status, fvs) = tbl.get("Vlan20:11.0.0.11") assert status == True - swss_check_RestoreCount(dvs, state_db, restore_count) - swss_app_check_warmstart_state(state_db, "vlanmgrd", "replayed") + swss_app_check_RestoreCount_single(state_db, restore_count, "vlanmgrd") intf_tbl._del("Vlan16|11.0.0.1/29") intf_tbl._del("Vlan20|11.0.0.9/29") From d7141329cc0ae0449d980262267ee4b431ece988 Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Fri, 18 Dec 2020 14:20:33 -0800 Subject: [PATCH 7/9] change state back to reconciled as per latest design --- cfgmgr/vlanmgr.cpp | 7 +++++++ tests/test_warm_reboot.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cfgmgr/vlanmgr.cpp b/cfgmgr/vlanmgr.cpp index 89ae57656e..a79aa844f2 100644 --- a/cfgmgr/vlanmgr.cpp +++ b/cfgmgr/vlanmgr.cpp @@ -54,6 +54,8 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c 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"; @@ -423,6 +425,8 @@ void VlanMgr::doVlanTask(Consumer &consumer) 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"); } } @@ -642,6 +646,9 @@ void VlanMgr::doVlanMemberTask(Consumer &consumer) 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"); + } } diff --git a/tests/test_warm_reboot.py b/tests/test_warm_reboot.py index c44e8f924b..e22104adc3 100644 --- a/tests/test_warm_reboot.py +++ b/tests/test_warm_reboot.py @@ -46,7 +46,7 @@ def swss_check_RestoreCount(dvs, state_db, restore_count): if fv[0] == "restore_count": assert int(fv[1]) == restore_count[key] + 1 elif fv[0] == "state": - assert fv[1] == "reconciled" or fv[1] == "replayed" + assert fv[1] == "reconciled" def check_port_oper_status(appl_db, port_name, state): portTbl = swsscommon.Table(appl_db, swsscommon.APP_PORT_TABLE_NAME) @@ -76,7 +76,7 @@ def swss_app_check_RestoreCount_single(state_db, restore_count, name): if fv[0] == "restore_count": assert int(fv[1]) == restore_count[key] + 1 elif fv[0] == "state": - assert fv[1] == "reconciled" or fv[1] == "replayed" + assert fv[1] == "reconciled" def swss_app_check_warmstart_state(state_db, name, state): warmtbl = swsscommon.Table(state_db, swsscommon.STATE_WARM_RESTART_TABLE_NAME) From ddf970933529036ce525614bf21d538fecc811ef Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:19:52 -0700 Subject: [PATCH 8/9] updated to not flush static mac --- orchagent/fdborch.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/orchagent/fdborch.cpp b/orchagent/fdborch.cpp index d4e0d8ffad..86cf7a8e1a 100644 --- a/orchagent/fdborch.cpp +++ b/orchagent/fdborch.cpp @@ -1056,6 +1056,11 @@ void FdbOrch::flushFDBEntries(sai_object_id_t bridge_port_oid, attr.value.oid = vlan_oid; attrs.push_back(attr); } + + /* do not flush static mac */ + attr.id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; + attr.value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC; + attrs.push_back(attr); SWSS_LOG_INFO("Flushing FDB bridge_port_oid: 0x%" PRIx64 ", and bvid_oid:0x%" PRIx64 ".", bridge_port_oid, vlan_oid); From bf34acfef0ea68ee9adc200ac0d8c15e0a1427af Mon Sep 17 00:00:00 2001 From: anilkpan <47642449+anilkpan@users.noreply.github.com> Date: Wed, 15 Jun 2022 16:29:30 -0700 Subject: [PATCH 9/9] Update fdborch.cpp --- orchagent/fdborch.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/orchagent/fdborch.cpp b/orchagent/fdborch.cpp index 86cf7a8e1a..6788e6fb91 100644 --- a/orchagent/fdborch.cpp +++ b/orchagent/fdborch.cpp @@ -899,7 +899,12 @@ void FdbOrch::doTask(NotificationConsumer& consumer) { if (op == "ALL") { - status = sai_fdb_api->flush_fdb_entries(gSwitchId, 0, NULL); + vector attrs; + sai_attribute_t attr; + attr.id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; + attr.value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC; + attrs.push_back(attr); + status = sai_fdb_api->flush_fdb_entries(gSwitchId, (uint32_t)attrs.size(), attrs.data()); if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Flush fdb failed, return code %x", status);