From fdedcbf6efdb3b5f4a3df025ddba10a86a025667 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Wed, 17 Nov 2021 13:25:46 +0200 Subject: [PATCH] [fdbshow]: Handle FDB cleanup gracefully. (#1926) The race condition is caused by a blocking Redis call which gets the contents of the FDB entry from ASIC DB. Since it has been implemented as a simple loop, there is no guarantee that entry will be present in DB when the contents are being read. - What I did Fixed: [fdb] 'show mac' command failed with t0-56-po2vlan topology #1866 - How I did it Removed blocking calls from fdbshow - How to verify it Run FDB test - Previous command output (if the output of a command-line utility has changed) root@sonic:/home/admin# show mac Key 'ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{"bvid":"oid:0x260000000009cc","mac":"02:11:22:33:20:00","switch_id":"oid:0x21000000000000"}' unavailable in database '1' - New command output (if the output of a command-line utility has changed) root@sonic:/home/admin# show mac No. Vlan MacAddress Port Type ----- ------ ------------ ------ ------ Total number of entries 0 Signed-off-by: Nazarii Hnydyn --- scripts/fdbshow | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/fdbshow b/scripts/fdbshow index 9b83b0719119..80fd908de662 100755 --- a/scripts/fdbshow +++ b/scripts/fdbshow @@ -83,7 +83,7 @@ class FdbShow(object): if not self.if_br_oid_map: return - fdb_str = self.db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:*") + fdb_str = self.db.keys(self.db.ASIC_DB, "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:*") if not fdb_str: return @@ -95,7 +95,10 @@ class FdbShow(object): if not fdb: continue - ent = self.db.get_all('ASIC_DB', s, blocking=True) + ent = self.db.get_all(self.db.ASIC_DB, s) + if not ent: + continue + br_port_id = ent["SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"][oid_pfx:] ent_type = ent["SAI_FDB_ENTRY_ATTR_TYPE"] fdb_type = ['Dynamic','Static'][ent_type == "SAI_FDB_ENTRY_TYPE_STATIC"]