Skip to content

Commit 22f8330

Browse files
mlok-nokiastepanblyschak
authored andcommitted
[Chassis][LAG_ID] Address the same lagid been used in two different LCs issue (sonic-net#3303)
What I did Create SYSTEM_LAG_IDS_FREE_LIST for assign lagId for all portchannel creation. Portchannel creation a) If Portchannel is created with a valid plagid * check if plagid is in free list, use plagid and remove it from SYSTEM_LAG_IDS_FREE_LIST. Add this lagid to the SYSTEM_LAG_ID_SET for debug info * If plagid is not in the FREE_LIST, lpop and use the first lagid from the SYSTEM_LAG_IDS_FREE_LIST. Add this lagid to the SYSTEM_LAG_ID_SET for debug info b) If Portchannel is created with invalid plagid or without any lagid lpop and use the first lagid from the SYSTEM_LAG_IDS_FREE_LIST. Add this lagid to the SYSTEM_LAG_ID_SET for debug info Portchannel delection Append the lagid to the end of SYSTEM_LAG_IDS_FREE_LIST. Also remove it from SYSTEM_LAG_ID_SET.
1 parent c796215 commit 22f8330

2 files changed

Lines changed: 42 additions & 17 deletions

File tree

orchagent/lagids.lua

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,28 +37,48 @@ if op == "add" then
3737
end
3838
-- proposed lag id is different than that in database OR
3939
-- the portchannel does not exist in the database
40-
-- If proposed lagid is available, return the same proposed lag id
41-
if redis.call("sismember", "SYSTEM_LAG_ID_SET", tostring(plagid)) == 0 then
42-
redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid))
43-
redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid))
40+
-- If proposed lagid is not available, lpop the first availabe ID
41+
local index = redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(plagid))
42+
if index == false then
43+
if redis.call("llen", "SYSTEM_LAG_IDS_FREE_LIST") <= 0 then
44+
return -1
45+
end
46+
local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST")
47+
redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid)
48+
redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid)
49+
if dblagid then
50+
redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid))
51+
if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then
52+
redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid))
53+
end
54+
end
55+
return tonumber(lagid)
56+
else
57+
redis.call("lrem", "SYSTEM_LAG_IDS_FREE_LIST", 1, tostring(plagid))
4458
redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(plagid))
59+
redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(plagid))
60+
if dblagid then
61+
redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid))
62+
if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then
63+
redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid))
64+
end
65+
end
4566
return plagid
4667
end
47-
end
48-
49-
local lagid = lagid_start
50-
while lagid <= lagid_end do
51-
if redis.call("sismember", "SYSTEM_LAG_ID_SET", tostring(lagid)) == 0 then
52-
redis.call("sadd", "SYSTEM_LAG_ID_SET", tostring(lagid))
53-
redis.call("srem", "SYSTEM_LAG_ID_SET", tostring(dblagid))
54-
redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, tostring(lagid))
55-
return lagid
68+
else
69+
if redis.call("llen", "SYSTEM_LAG_IDS_FREE_LIST") <= 0 then
70+
return -1
5671
end
57-
lagid = lagid + 1
72+
local lagid = redis.call("lpop", "SYSTEM_LAG_IDS_FREE_LIST")
73+
redis.call("hset", "SYSTEM_LAG_ID_TABLE", pcname, lagid)
74+
redis.call("sadd", "SYSTEM_LAG_ID_SET", lagid)
75+
if dblagid then
76+
if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid)) == false then
77+
redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", tostring(dblagid))
78+
end
79+
end
80+
return tonumber(lagid)
5881
end
59-
60-
return -1
61-
6282
end
6383

6484
if op == "del" then
@@ -67,6 +87,9 @@ if op == "del" then
6787
local lagid = redis.call("hget", "SYSTEM_LAG_ID_TABLE", pcname)
6888
redis.call("srem", "SYSTEM_LAG_ID_SET", lagid)
6989
redis.call("hdel", "SYSTEM_LAG_ID_TABLE", pcname)
90+
if redis.call("lpos", "SYSTEM_LAG_IDS_FREE_LIST", lagid) == false then
91+
redis.call("rpush", "SYSTEM_LAG_IDS_FREE_LIST", lagid)
92+
end
7093
return tonumber(lagid)
7194
end
7295

tests/test_virtual_chassis.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def set_lag_id_boundaries(self, vct):
2727
chassis_app_db = DVSDatabase(swsscommon.CHASSIS_APP_DB, dvs.redis_chassis_sock)
2828
chassis_app_db.db_connection.set("SYSTEM_LAG_ID_START", "1")
2929
chassis_app_db.db_connection.set("SYSTEM_LAG_ID_END", "2")
30+
chassis_app_db.db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "1")
31+
chassis_app_db.db_connection.rpush("SYSTEM_LAG_IDS_FREE_LIST", "2")
3032
break
3133

3234
def config_inbandif_port(self, vct, ibport):

0 commit comments

Comments
 (0)