Skip to content

Commit 57a0b41

Browse files
authored
Add show and clear commands for headroom pool watermark (sonic-net#1144)
Depends on sonic-net/sonic-swss#1453 - What I did Added support to query and clear headroom pool watermark counters Added unit test for the headroom pool watermark counters - How I did it Modified watermarkstat script to query/clear headroom pool watermark counters Added show and clear commands - How to verify it Send traffic such that it treks into the headroom pool and check for the headroom pool usage using the show command below Set polling interval to 30s and issue clear commands mentioned below and verify that counters are cleared - New command output (if the output of a command-line utility has changed) Show commands admin@sonic:~$ show headroom-pool watermark Headroom pool maximum occupancy: Pool Bytes --------------------- ------- ingress_lossless_pool 12480 admin@sonic:~$ show headroom-pool persistent-watermark Headroom pool maximum occupancy: Pool Bytes --------------------- ------- ingress_lossless_pool 12480 Clear commands admin@sonic:~$ sudo sonic-clear headroom-pool watermark admin@sonic:~$ sudo sonic-clear headroom-pool persistent-watermark Signed-off-by: Neetha John <[email protected]>
1 parent d414970 commit 57a0b41

File tree

6 files changed

+88
-7
lines changed

6 files changed

+88
-7
lines changed

clear/main.py

+24
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,30 @@ def clear_pwm_q_multi():
277277
command = 'watermarkstat -c -p -t q_shared_multi'
278278
run_command(command)
279279

280+
281+
@cli.group(name='headroom-pool')
282+
def headroom_pool():
283+
"""Clear headroom pool WM"""
284+
pass
285+
286+
@headroom_pool.command('watermark')
287+
def watermark():
288+
"""Clear headroom pool user WM. One does not simply clear WM, root is required"""
289+
if os.geteuid() != 0:
290+
exit("Root privileges are required for this operation")
291+
292+
command = 'watermarkstat -c -t headroom_pool'
293+
run_command(command)
294+
295+
@headroom_pool.command('persistent-watermark')
296+
def persistent_watermark():
297+
"""Clear headroom pool persistent WM. One does not simply clear WM, root is required"""
298+
if os.geteuid() != 0:
299+
exit("Root privileges are required for this operation")
300+
301+
command = 'watermarkstat -c -p -t headroom_pool'
302+
run_command(command)
303+
280304
#
281305
# 'arp' command ####
282306
#

scripts/watermarkstat

+10-4
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ class Watermarkstat(object):
167167
"header_prefix": "MC"},
168168
"buffer_pool" : {"message": "Shared pool maximum occupancy:",
169169
"wm_name": "SAI_BUFFER_POOL_STAT_WATERMARK_BYTES",
170+
"header" : headerBufferPool},
171+
"headroom_pool" : {"message": "Headroom pool maximum occupancy:",
172+
"wm_name": "SAI_BUFFER_POOL_STAT_XOFF_ROOM_WATERMARK_BYTES",
170173
"header" : headerBufferPool}
171174
}
172175

@@ -226,12 +229,15 @@ class Watermarkstat(object):
226229
def print_all_stat(self, table_prefix, key):
227230
table = []
228231
type = self.watermark_types[key]
229-
if key == 'buffer_pool':
232+
if key in ['buffer_pool', 'headroom_pool']:
230233
self.header_list = type['header']
231234
# Get stats for each buffer pool
232235
for buf_pool, bp_oid in natsorted(self.buffer_pool_name_to_oid_map.items()):
233-
key = table_prefix + bp_oid
234-
data = self.counters_db.get(self.counters_db.COUNTERS_DB, key, type["wm_name"])
236+
if key == 'headroom_pool' and 'ingress_lossless' not in buf_pool:
237+
continue
238+
239+
db_key = table_prefix + bp_oid
240+
data = self.counters_db.get(self.counters_db.COUNTERS_DB, db_key, type["wm_name"])
235241
if data is None:
236242
data = STATUS_NA
237243
table.append((buf_pool, data))
@@ -275,7 +281,7 @@ Examples:
275281
parser.add_argument('-c', '--clear', action='store_true', help='Clear watermarks request')
276282
parser.add_argument('-p', '--persistent', action='store_true', help='Do the operations on the persistent watermark')
277283
parser.add_argument('-t', '--type', required=True, action='store',
278-
choices=['pg_headroom', 'pg_shared', 'q_shared_uni', 'q_shared_multi', 'buffer_pool'],
284+
choices=['pg_headroom', 'pg_shared', 'q_shared_uni', 'q_shared_multi', 'buffer_pool', 'headroom_pool'],
279285
help='The type of watermark')
280286
parser.add_argument('-v', '--version', action='version', version='%(prog)s 1.0')
281287
args = parser.parse_args()

show/main.py

+21
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,27 @@ def pwm_buffer_pool():
634634
run_command(command)
635635

636636

637+
#
638+
# 'headroom-pool' group ("show headroom-pool ...")
639+
#
640+
641+
@cli.group(name='headroom-pool', cls=clicommon.AliasedGroup)
642+
def headroom_pool():
643+
"""Show details of headroom pool"""
644+
645+
@headroom_pool.command('watermark')
646+
def wm_headroom_pool():
647+
"""Show user WM for headroom pool"""
648+
command = 'watermarkstat -t headroom_pool'
649+
run_command(command)
650+
651+
@headroom_pool.command('persistent-watermark')
652+
def pwm_headroom_pool():
653+
"""Show persistent WM for headroom pool"""
654+
command = 'watermarkstat -p -t headroom_pool'
655+
run_command(command)
656+
657+
637658
#
638659
# 'mac' command ("show mac ...")
639660
#

tests/mock_tables/counters_db.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,8 @@
990990
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "2000"
991991
},
992992
"USER_WATERMARKS:oid:0x18000000000b66": {
993-
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "3000"
993+
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "3000",
994+
"SAI_BUFFER_POOL_STAT_XOFF_ROOM_WATERMARK_BYTES": "432640"
994995
},
995996
"PERSISTENT_WATERMARKS:oid:0x18000000000b64": {
996997
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "2000"
@@ -999,7 +1000,8 @@
9991000
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "3000"
10001001
},
10011002
"PERSISTENT_WATERMARKS:oid:0x18000000000b66": {
1002-
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "4000"
1003+
"SAI_BUFFER_POOL_STAT_WATERMARK_BYTES": "4000",
1004+
"SAI_BUFFER_POOL_STAT_XOFF_ROOM_WATERMARK_BYTES": "863616"
10031005
},
10041006
"CRM:ACL_STATS:INGRESS:VLAN":{
10051007
"crm_stats_acl_table_used":"0",

tests/watermarkstat_test.py

+6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ def test_show_queue_multicast_wm(self):
3636
def test_show_buffer_pool_wm(self):
3737
self.executor(testData['show_buffer_pool_wm'])
3838

39+
def test_show_headroom_pool_wm(self):
40+
self.executor(testData['show_hdrm_pool_wm'])
41+
3942
def test_show_pg_shared_peristent_wm(self):
4043
self.executor(testData['show_pg_pwm_shared'])
4144

@@ -51,6 +54,9 @@ def test_show_queue_multicast_persistent_wm(self):
5154
def test_show_buffer_pool_persistent_wm(self):
5255
self.executor(testData['show_buffer_pool_pwm'])
5356

57+
def test_show_headroom_pool_persistent_wm(self):
58+
self.executor(testData['show_hdrm_pool_pwm'])
59+
5460
def executor(self, testcase):
5561
runner = CliRunner()
5662

tests/wm_input/wm_test_vectors.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@
7979
ingress_lossless_pool 4000
8080
"""
8181

82+
show_hdrm_pool_wm_output="""\
83+
Headroom pool maximum occupancy:
84+
Pool Bytes
85+
--------------------- -------
86+
ingress_lossless_pool 432640
87+
"""
88+
89+
show_hdrm_pool_persistent_wm_output="""\
90+
Headroom pool maximum occupancy:
91+
Pool Bytes
92+
--------------------- -------
93+
ingress_lossless_pool 863616
94+
"""
95+
8296
testData = {
8397
'show_pg_wm_shared' : [ {'cmd' : ['priority-group', 'watermark', 'shared'],
8498
'rc_output': show_pg_wm_shared_output
@@ -119,5 +133,13 @@
119133
'show_buffer_pool_pwm' : [ {'cmd' : ['buffer_pool', 'persistent-watermark'],
120134
'rc_output': show_buffer_pool_persistent_wm_output
121135
}
122-
]
136+
],
137+
'show_hdrm_pool_wm' : [ {'cmd' : ['headroom-pool', 'watermark'],
138+
'rc_output': show_hdrm_pool_wm_output
139+
}
140+
],
141+
'show_hdrm_pool_pwm' : [ {'cmd' : ['headroom-pool', 'persistent-watermark'],
142+
'rc_output': show_hdrm_pool_persistent_wm_output
143+
}
144+
]
123145
}

0 commit comments

Comments
 (0)