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

[Reclaiming buffer] Test cases for reclaiming buffer on both traditional and dynamic model #4561

Merged
merged 29 commits into from
Dec 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
9d342ab
Regression test case for traditional buffer manager in 201911
stephenxs Jul 19, 2021
6a16d47
Temporary commit for reclaiming buffer
stephenxs Aug 19, 2021
fc59d01
Adjust test case according to zero profile on queues updated
stephenxs Sep 6, 2021
bbdf9d2
Add ingress_lossy_profile to profile list only if ingress_lossy_pool …
stephenxs Sep 6, 2021
e443b4f
Fix errors during test
stephenxs Sep 15, 2021
97601b7
Update enable-dynamic-buffer
stephenxs Sep 16, 2021
a063eae
Support check all buffer items
stephenxs Sep 16, 2021
3693d6d
Support check queues and lossy PGs
stephenxs Sep 16, 2021
92589f5
Fix errors
stephenxs Sep 16, 2021
056bca3
Works great for all checkings
stephenxs Sep 17, 2021
f45b232
Works great with APPL_DB tables
stephenxs Sep 17, 2021
8434000
Rename
stephenxs Sep 17, 2021
ef23207
Enable buffer_deployment in dynamic buffer model
stephenxs Sep 17, 2021
687b37d
Update tests/qos/test_buffer_deployment.py
stephenxs Sep 17, 2021
7d894b9
Fix review comments
stephenxs Sep 17, 2021
06fb98f
Move deployment test to test_buffer
stephenxs Sep 17, 2021
e78f750
Fix syntax error
stephenxs Sep 17, 2021
b61db56
Skip traditional model for auto negotiation test
stephenxs Sep 17, 2021
555fb29
Remove test_buffer_deployment since it has been moved to test_buffer
stephenxs Sep 17, 2021
4bd9848
Stop BGP before the test and start it after
stephenxs Sep 18, 2021
4882954
Handle the case there is no lossless pg after load_minigraph in enabl…
stephenxs Sep 18, 2021
97a0443
Merge branch 'master' into reclaim-buffer-master-github
stephenxs Sep 28, 2021
827f97b
Adjust test case according to QoS reference format change
stephenxs Sep 28, 2021
20da0a2
Fix syntax error
stephenxs Oct 8, 2021
3959906
Adjust test cases for latest master where there is no table name in t…
stephenxs Oct 26, 2021
8852a69
Merge branch 'master' into reclaim-buffer-master-github
stephenxs Nov 1, 2021
8d8b5b3
Skip legacy releases: 201811, 201911
stephenxs Nov 16, 2021
e6f53fa
Fix LGTM alerts
stephenxs Nov 16, 2021
3176798
Merge branch 'master' into reclaim-buffer-master-github
stephenxs Nov 18, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 82 additions & 5 deletions tests/common/helpers/enable-dynamic-buffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,36 @@
from swsscommon.swsscommon import ConfigDBConnector

lossless_profile_name_pattern = 'pg_lossless_([1-9][0-9]*000)_([1-9][0-9]*m)_profile'
zero_profile_name_pattern = '.*zero_profile'
zero_pool_name_pattern = '.*zero_pool'
zero_profiles_to_normal_profiles = {
'[BUFFER_PROFILE|ingress_lossy_pg_zero_profile]': '[BUFFER_PROFILE|ingress_lossy_profile]',
'[BUFFER_PROFILE|ingress_lossless_zero_profile]': '[BUFFER_PROFILE|ingress_lossless_profile]',
'[BUFFER_PROFILE|ingress_lossy_zero_profile]': '[BUFFER_PROFILE|ingress_lossy_profile]',
'[BUFFER_PROFILE|egress_lossless_zero_profile]': '[BUFFER_PROFILE|egress_lossless_profile]',
'[BUFFER_PROFILE|egress_lossy_zero_profile]': '[BUFFER_PROFILE|egress_lossy_profile]',
'ingress_lossy_pg_zero_profile': 'ingress_lossy_profile',
'ingress_lossless_zero_profile': 'ingress_lossless_profile',
'ingress_lossy_zero_profile': 'ingress_lossy_profile',
'egress_lossless_zero_profile': 'egress_lossless_profile',
'egress_lossy_zero_profile': 'egress_lossy_profile'
}
logger = Logger()

def _replace_buffer_profile_lists(config_db, table):
ingress_profile_lists = config_db.get_table(table)
for key, profile_list in ingress_profile_lists.items():
if re.search(zero_profile_name_pattern, profile_list['profile_list']):
zero_profiles = profile_list['profile_list'].split(',')
normal_profiles = ''
for profile in zero_profiles:
normal_profile = zero_profiles_to_normal_profiles.get(profile)
if normal_profile:
normal_profiles += normal_profile + ','
profile_list['profile_list'] = normal_profiles[:-1]
config_db.set_entry(table, key, profile_list)


def stop_traditional_buffer_model(config_db):
"""
Stop the traditional buffer model
Expand All @@ -27,24 +55,62 @@ def stop_traditional_buffer_model(config_db):
# Remove lossless PGs from BUFFER_PG table
# A PG whose profile matches pg_lossless_<speed>_<cable-length>_profile is treated as a lossless PG
pgs = config_db.get_table('BUFFER_PG')
lossless_pgs = {};
lossless_pgs = {}
zero_pgs = []
for key, pg in pgs.items():
if re.search(lossless_profile_name_pattern, pg['profile']):
config_db.set_entry('BUFFER_PG', key, None)
pg['profile'] = 'NULL'
lossless_pgs[key] = pg
# We can not apply profile as NULL for now. The traditional buffer manager can not handle them

if re.search(zero_profile_name_pattern, pg['profile']):
normal_profile = zero_profiles_to_normal_profiles.get(pg['profile'])
if normal_profile:
pg['profile'] = normal_profile
config_db.set_entry('BUFFER_PG', key, pg)
zero_pgs.append(key)

logger.log_notice("Lossless PGs have been removed from BUFFER_PG and will be applied after dynamic buffer manager starts {}".format(lossless_pgs))
logger.log_notice("Zero PGs have been replaced by normal profile {}".format(zero_pgs))

logger.log_notice("Lossless PGs have been removed from BUFFER_PG: {}".format(lossless_pgs.keys()))
queues = config_db.get_table('BUFFER_QUEUE')
zero_queues = []
for key, queue in queues.items():
if re.search(zero_profile_name_pattern, queue['profile']):
normal_profile = zero_profiles_to_normal_profiles.get(queue['profile'])
if normal_profile:
queue['profile'] = normal_profile
config_db.set_entry('BUFFER_QUEUE', key, queue)
zero_queues.append(key)

logger.log_notice("Queues referencing zero profiles have been removed from BUFFER_QUEUE and will be replaced by normal profile: {}".format(zero_queues))

_replace_buffer_profile_lists(config_db, 'BUFFER_PORT_INGRESS_PROFILE_LIST')
_replace_buffer_profile_lists(config_db, 'BUFFER_PORT_EGRESS_PROFILE_LIST')

# Remove dynamically generated profiles
profiles = config_db.get_table('BUFFER_PROFILE')
dynamic_profile = []
zero_profile = []
for key, profile in profiles.items():
if re.search(lossless_profile_name_pattern, key):
config_db.set_entry('BUFFER_PROFILE', key, None)
dynamic_profile.append(key)
elif re.search(zero_profile_name_pattern, key):
config_db.set_entry('BUFFER_PROFILE', key, None)
zero_profile.append(key)

logger.log_notice("Dynamically generated profiles have been removed from BUFFER_PROFILE: {}".format(dynamic_profile))
logger.log_notice("Dynamically generated profiles and zero profiles have been removed from BUFFER_PROFILE: {} {}".format(dynamic_profile, zero_profile))

pools = config_db.get_table('BUFFER_POOL')
zero_pool = []
for key, pool in pools.items():
if re.search(zero_pool_name_pattern, key):
config_db.set_entry('BUFFER_POOL', key, None)
zero_pool.append(key)

logger.log_notice("Zero pools have been removed from BUFFER_TABLE: {}".format(zero_pool))

# Stop the buffermgrd
# We don't stop the buffermgrd at the beginning
Expand Down Expand Up @@ -85,29 +151,36 @@ def start_dynamic_buffer_model(config_db, lossless_pgs, metadata):
# By default, all pools except egress_lossless_pool are dynamic size pools
dynamic_size_pools = ['ingress_lossless_pool', 'ingress_lossy_pool', 'egress_lossy_pool']
pools = config_db.get_table('BUFFER_POOL')
shared_headroom_pool = False;
for key, pool in pools.items():
if key in dynamic_size_pools:
config_db.set_entry('BUFFER_POOL', key, None)
if 'size' in pool.keys():
pool.pop('size')
if 'xoff' in pool.keys():
pool.pop('xoff')
shared_headroom_pool = True
config_db.set_entry('BUFFER_POOL', key, pool)

logger.log_notice("Sizes have been removed from {}".format(dynamic_size_pools))

# Create lossless PGs
if lossless_pgs:
for key, pg in lossless_pgs.items():
pg['profile'] = 'NULL'
config_db.set_entry('BUFFER_PG', key, pg)
logger.log_notice("Lossless PGs have been created for {}".format(lossless_pgs.keys()))
else:
# The lossless_pgs can be None if this script is called immediately after reloading minigraph
# because the lossless PGs hasn't been inserted into CONFIG_DB by traditional buffer manager
ports = config_db.get_keys('PORT')
for port in ports:
config_db.set_entry('BUFFER_PG', '{}|3-4'.format(port), {'profile': 'NULL'})
logger.log_notice("No lossless PG in CONFIG_DB, lossless PGs have been created for all ports {}".format(ports))
logger.log_notice("No lossless PG in CONFIG_DB, lossless PGs have been created for all ports {}".format(ports))

# Add necessary tables to run dynamic model
default_lossless_param = {'default_dynamic_th': '0'}
if shared_headroom_pool:
default_lossless_param['over_subscribe_ratio'] = '2'
config_db.set_entry('DEFAULT_LOSSLESS_BUFFER_PARAMETER', 'AZURE', default_lossless_param)

logger.log_notice("DEFAULT_LOSSLESS_BUFFER_PARAMETER|AZURE has been created")
Expand Down Expand Up @@ -145,6 +218,10 @@ def start_dynamic_buffer_model(config_db, lossless_pgs, metadata):
print("Don't enable dynamic buffer calculation for non-default SKUs")
exit(0)

if 'dynamic' == metadata.get('buffer_model'):
print("The current model is already dynamic model")
exit(0)

lossless_pgs = stop_traditional_buffer_model(config_db)

start_dynamic_buffer_model(config_db, lossless_pgs, metadata)
19 changes: 16 additions & 3 deletions tests/qos/files/dynamic_buffer_param.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,26 @@
"dynamic_th": "2"
}
},
"lossy_pg": {
"8": "37888",
"default": "19456"
"extra_overhead": {
"400000": "95232",
"default": "58368"
},
"shared-headroom-pool": {
"size": "1024000",
"private_pg_headroom": "10240"
},
"admin-down": {
"BUFFER_PG_TABLE": {
"0": "[BUFFER_PROFILE_TABLE:ingress_lossy_pg_zero_profile]"
},
"BUFFER_QUEUE_TABLE": {
"0-2": "[BUFFER_PROFILE_TABLE:egress_lossy_zero_profile]",
"3-4": "[BUFFER_PROFILE_TABLE:egress_lossless_zero_profile]",
"5-6": "[BUFFER_PROFILE_TABLE:egress_lossy_zero_profile]",
"7-15": "[BUFFER_PROFILE_TABLE:egress_lossy_zero_profile]"
},
"BUFFER_PORT_INGRESS_PROFILE_LIST_TABLE": ["[BUFFER_PROFILE_TABLE:ingress_lossless_zero_profile]"],
"BUFFER_PORT_EGRESS_PROFILE_LIST_TABLE": ["[BUFFER_PROFILE_TABLE:egress_lossless_zero_profile]", "[BUFFER_PROFILE_TABLE:egress_lossy_zero_profile]"]
}
}
}
Loading