From 2c4f2f9941a57d08d58cbc7e13755f0a2644a340 Mon Sep 17 00:00:00 2001 From: mlok Date: Fri, 27 Sep 2024 21:04:00 -0400 Subject: [PATCH 1/3] [Chassis][LAG_ID] Address the same lagid been used in two different LCs issue. Signed-off-by: mlok --- orchagent/lagids.lua | 52 ++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/orchagent/lagids.lua b/orchagent/lagids.lua index 93a546cad1..124bc96e36 100644 --- a/orchagent/lagids.lua +++ b/orchagent/lagids.lua @@ -37,24 +37,41 @@ if op == "add" then end -- proposed lag id is different than that in database OR -- the portchannel does not exist in the database - -- If proposed lagid is available, return the same proposed lag id - if redis.call("sismember", "SYSTEM_LAG_ID_SET", tostring(plagid)) == 0 then - redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid)) - redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) - redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(plagid)) - return plagid + -- If proposed lagid is not available, lpop the first availabe ID + local index = redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(plagid)) + if index == false then + local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST") + redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid) + redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid) + if dblagid then + redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end + end + return tonumber(lagid) + else + redis.call("lrem", "SYSTEM_LAG_IDS_FREE_LIST", 1, tostring(plagid)) + redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(plagid)) + redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid)) + if dblagid then + redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end + end + return plagid end - end - - local lagid = lagid_start - while lagid <= lagid_end do - if redis.call("sismember", "SYSTEM_LAG_ID_SET", tostring(lagid)) == 0 then - redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(lagid)) - redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) - redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(lagid)) - return lagid + else + local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST") + redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid) + redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid) + if dblagid then + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end end - lagid = lagid + 1 + return tonumber(lagid) end return -1 @@ -67,6 +84,9 @@ if op == "del" then local lagid = redis.call("hget", "SYSTEM_LAG_ID_TABLE", pcname) redis.call("srem", "SYSTEM_LAG_ID_SET", lagid) redis.call("hdel", "SYSTEM_LAG_ID_TABLE", pcname) + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", lagid) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", lagid) + end return tonumber(lagid) end From 509c5d0a35efec448a43f1b2f864cc9bba24eae1 Mon Sep 17 00:00:00 2001 From: mlok Date: Mon, 30 Sep 2024 16:08:27 -0400 Subject: [PATCH 2/3] Fixed test case Signed-off-by: mlok --- tests/test_virtual_chassis.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_virtual_chassis.py b/tests/test_virtual_chassis.py index aee3e09a70..9ea37b0902 100644 --- a/tests/test_virtual_chassis.py +++ b/tests/test_virtual_chassis.py @@ -27,6 +27,8 @@ def set_lag_id_boundaries(self, vct): chassis_app_db = DVSDatabase(swsscommon.CHASSIS_APP_DB, dvs.redis_chassis_sock) chassis_app_db.db_connection.set("SYSTEM_LAG_ID_START", "1") chassis_app_db.db_connection.set("SYSTEM_LAG_ID_END", "2") + chassis_app_db_db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "1") + chassis_app_db_db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "2") break def config_inbandif_port(self, vct, ibport): From e9938d56c1f809b85ffdb6388cc0bca4cc63cc87 Mon Sep 17 00:00:00 2001 From: mlok Date: Tue, 1 Oct 2024 09:45:55 -0400 Subject: [PATCH 3/3] Fixed vs test failure Signed-off-by: mlok --- orchagent/lagids.lua | 43 +++++++++++++++++++---------------- tests/test_virtual_chassis.py | 4 ++-- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/orchagent/lagids.lua b/orchagent/lagids.lua index 124bc96e36..47f44d99f6 100644 --- a/orchagent/lagids.lua +++ b/orchagent/lagids.lua @@ -40,42 +40,45 @@ if op == "add" then -- If proposed lagid is not available, lpop the first availabe ID local index = redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(plagid)) if index == false then + if redis.call("llen", "SYSTEM_LAG_IDS_FREE_LIST") <= 0 then + return -1 + end local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST") redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid) redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid) if dblagid then - redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) - if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then - redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) - end + redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end end return tonumber(lagid) else - redis.call("lrem", "SYSTEM_LAG_IDS_FREE_LIST", 1, tostring(plagid)) - redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(plagid)) - redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid)) - if dblagid then - redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) - if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then - redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) - end - end - return plagid + redis.call("lrem", "SYSTEM_LAG_IDS_FREE_LIST", 1, tostring(plagid)) + redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(plagid)) + redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid)) + if dblagid then + redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid)) + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end + end + return plagid end else + if redis.call("llen", "SYSTEM_LAG_IDS_FREE_LIST") <= 0 then + return -1 + end local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST") redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid) redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid) if dblagid then - if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then - redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) - end + if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then + redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) + end end return tonumber(lagid) end - - return -1 - end if op == "del" then diff --git a/tests/test_virtual_chassis.py b/tests/test_virtual_chassis.py index 9ea37b0902..45b45afbd4 100644 --- a/tests/test_virtual_chassis.py +++ b/tests/test_virtual_chassis.py @@ -27,8 +27,8 @@ def set_lag_id_boundaries(self, vct): chassis_app_db = DVSDatabase(swsscommon.CHASSIS_APP_DB, dvs.redis_chassis_sock) chassis_app_db.db_connection.set("SYSTEM_LAG_ID_START", "1") chassis_app_db.db_connection.set("SYSTEM_LAG_ID_END", "2") - chassis_app_db_db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "1") - chassis_app_db_db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "2") + chassis_app_db.db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "1") + chassis_app_db.db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "2") break def config_inbandif_port(self, vct, ibport):