Skip to content

Commit 710df0c

Browse files
authored
Add SAI_INGRESS_PRIORITY_GROUP_STAT_DROPPED_PACKETS counter, create new FlexCounter group (#1600)
Signed-off-by: Andriy Yurkiv <[email protected]> depends on : sonic-net/sonic-utilities#1355 sonic-net/sonic-buildimage#6444 What I did Added new option for "counterpoll" util Why I did it Add appropriate code to counterpoll/main.py How I verified it admin@arc-switch1041:~$ counterpoll pg-drop enable --> enable new counter admin@arc-switch1041:~$ counterpoll show --> check new PG_DROP_STAT counter status check counters admin@arc-switch1041:~$ redis-cli -n 2 127.0.0.1:6379[2]> HGETALL COUNTERS:oid:0x1a000000000062 1) "SAI_INGRESS_PRIORITY_GROUP_STAT_XOFF_ROOM_WATERMARK_BYTES" 2) "0" 3) "SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES" 4) "0" 5) "SAI_INGRESS_PRIORITY_GROUP_STAT_DROPPED_PACKETS" 6) "0"
1 parent de03dd7 commit 710df0c

File tree

4 files changed

+128
-1
lines changed

4 files changed

+128
-1
lines changed

orchagent/flexcounterorch.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ unordered_map<string, string> flexCounterGroupMap =
2626
{"PFCWD", PFC_WD_FLEX_COUNTER_GROUP},
2727
{"QUEUE_WATERMARK", QUEUE_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP},
2828
{"PG_WATERMARK", PG_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP},
29+
{"PG_DROP", PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP},
2930
{BUFFER_POOL_WATERMARK_KEY, BUFFER_POOL_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP},
3031
{"RIF", RIF_STAT_COUNTER_FLEX_COUNTER_GROUP},
3132
{"RIF_RATES", RIF_RATE_COUNTER_FLEX_COUNTER_GROUP},

orchagent/portsorch.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extern sai_system_port_api_t *sai_system_port_api;
5656
#define QUEUE_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
5757
#define QUEUE_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS "10000"
5858
#define PG_WATERMARK_FLEX_STAT_COUNTER_POLL_MSECS "10000"
59+
#define PG_DROP_FLEX_STAT_COUNTER_POLL_MSECS "10000"
5960
#define PORT_RATE_FLEX_COUNTER_POLLING_INTERVAL_MS "1000"
6061

6162

@@ -199,6 +200,11 @@ static const vector<sai_ingress_priority_group_stat_t> ingressPriorityGroupWater
199200
SAI_INGRESS_PRIORITY_GROUP_STAT_SHARED_WATERMARK_BYTES,
200201
};
201202

203+
static const vector<sai_ingress_priority_group_stat_t> ingressPriorityGroupDropStatIds =
204+
{
205+
SAI_INGRESS_PRIORITY_GROUP_STAT_DROPPED_PACKETS
206+
};
207+
202208
static char* hostif_vlan_tag[] = {
203209
[SAI_HOSTIF_VLAN_TAG_STRIP] = "SAI_HOSTIF_VLAN_TAG_STRIP",
204210
[SAI_HOSTIF_VLAN_TAG_KEEP] = "SAI_HOSTIF_VLAN_TAG_KEEP",
@@ -295,6 +301,11 @@ PortsOrch::PortsOrch(DBConnector *db, vector<table_name_with_pri_t> &tableNames)
295301
fieldValues.emplace_back(POLL_INTERVAL_FIELD, PORT_RATE_FLEX_COUNTER_POLLING_INTERVAL_MS);
296302
fieldValues.emplace_back(STATS_MODE_FIELD, STATS_MODE_READ);
297303
m_flexCounterGroupTable->set(PORT_STAT_COUNTER_FLEX_COUNTER_GROUP, fieldValues);
304+
305+
fieldValues.clear();
306+
fieldValues.emplace_back(POLL_INTERVAL_FIELD, PG_DROP_FLEX_STAT_COUNTER_POLL_MSECS);
307+
fieldValues.emplace_back(STATS_MODE_FIELD, STATS_MODE_READ);
308+
m_flexCounterGroupTable->set(PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP, fieldValues);
298309
}
299310
catch (const runtime_error &e)
300311
{
@@ -1899,6 +1910,11 @@ string PortsOrch::getPriorityGroupWatermarkFlexCounterTableKey(string key)
18991910
return string(PG_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP) + ":" + key;
19001911
}
19011912

1913+
string PortsOrch::getPriorityGroupDropPacketsFlexCounterTableKey(string key)
1914+
{
1915+
return string(PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP) + ":" + key;
1916+
}
1917+
19021918
bool PortsOrch::initPort(const string &alias, const int index, const set<int> &lane_set)
19031919
{
19041920
SWSS_LOG_ENTER();
@@ -4241,7 +4257,22 @@ void PortsOrch::generatePriorityGroupMapPerPort(const Port& port)
42414257

42424258
vector<FieldValueTuple> fieldValues;
42434259
fieldValues.emplace_back(PG_COUNTER_ID_LIST, counters_stream.str());
4260+
m_flexCounterTable->set(key, fieldValues);
42444261

4262+
delimiter = "";
4263+
std::ostringstream ingress_pg_drop_packets_counters_stream;
4264+
key = getPriorityGroupDropPacketsFlexCounterTableKey(id);
4265+
/* Add dropped packets counters to flex_counter */
4266+
for (const auto& it: ingressPriorityGroupDropStatIds)
4267+
{
4268+
ingress_pg_drop_packets_counters_stream << delimiter << sai_serialize_ingress_priority_group_stat(it);
4269+
if (delimiter.empty())
4270+
{
4271+
delimiter = comma;
4272+
}
4273+
}
4274+
fieldValues.clear();
4275+
fieldValues.emplace_back(PG_COUNTER_ID_LIST, ingress_pg_drop_packets_counters_stream.str());
42454276
m_flexCounterTable->set(key, fieldValues);
42464277
}
42474278

orchagent/portsorch.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_STAT_COUNTER"
2323
#define QUEUE_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP "QUEUE_WATERMARK_STAT_COUNTER"
2424
#define PG_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP "PG_WATERMARK_STAT_COUNTER"
25-
25+
#define PG_DROP_STAT_COUNTER_FLEX_COUNTER_GROUP "PG_DROP_STAT_COUNTER"
2626

2727
typedef std::vector<sai_uint32_t> PortSupportedSpeeds;
2828

@@ -161,6 +161,7 @@ class PortsOrch : public Orch, public Subject
161161

162162
std::string getQueueWatermarkFlexCounterTableKey(std::string s);
163163
std::string getPriorityGroupWatermarkFlexCounterTableKey(std::string s);
164+
std::string getPriorityGroupDropPacketsFlexCounterTableKey(std::string s);
164165
std::string getPortRateFlexCounterTableKey(std::string s);
165166

166167
shared_ptr<DBConnector> m_counter_db;

tests/test_pg_drop_counter.py

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import os
2+
import re
3+
import time
4+
import json
5+
import pytest
6+
import redis
7+
8+
from swsscommon import swsscommon
9+
10+
pg_drop_attr = "SAI_INGRESS_PRIORITY_GROUP_STAT_DROPPED_PACKETS"
11+
12+
class TestPGDropCounter(object):
13+
DEFAULT_POLL_INTERVAL = 10
14+
pgs = {}
15+
16+
def setup_dbs(self, dvs):
17+
self.asic_db = dvs.get_asic_db()
18+
self.counters_db = dvs.get_counters_db()
19+
self.config_db = dvs.get_config_db()
20+
self.flex_db = dvs.get_flex_db()
21+
22+
def set_counter(self, dvs, obj_type, obj_id, attr, val):
23+
24+
db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
25+
ntf = swsscommon.NotificationProducer(db, "SAI_VS_UNITTEST_CHANNEL")
26+
27+
r = redis.Redis(unix_socket_path=dvs.redis_sock, db=swsscommon.ASIC_DB,
28+
encoding="utf-8", decode_responses=True)
29+
rid = r.hget("VIDTORID", obj_id)
30+
31+
assert rid is not None
32+
33+
fvp = swsscommon.FieldValuePairs([(attr, val)])
34+
key = rid
35+
36+
# explicit convert unicode string to str for python2
37+
ntf.send("set_stats", str(key), fvp)
38+
39+
def populate_asic(self, dvs, val):
40+
for obj_id in self.pgs:
41+
self.set_counter(dvs, "SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP", obj_id, pg_drop_attr, val)
42+
43+
def verify_value(self, dvs, obj_ids, entry_name, expected_value):
44+
counters_db = swsscommon.DBConnector(swsscommon.COUNTERS_DB, dvs.redis_sock, 0)
45+
table = swsscommon.Table(counters_db, "COUNTERS")
46+
47+
for obj_id in obj_ids:
48+
ret = table.get(obj_id)
49+
50+
status = ret[0]
51+
assert status
52+
keyvalues = ret[1]
53+
found = False
54+
for key, value in keyvalues:
55+
if key == entry_name:
56+
assert value == expected_value, "Saved value not the same as expected"
57+
found = True
58+
assert found, "entry name %s not found" % (entry_name)
59+
60+
def set_up_flex_counter(self):
61+
pg_stats_entry = {"PG_COUNTER_ID_LIST": "{}".format(pg_drop_attr)}
62+
for pg in self.pgs:
63+
self.flex_db.create_entry("FLEX_COUNTER_TABLE", "PG_DROP_STAT_COUNTER:{}".format(pg), pg_stats_entry)
64+
65+
fc_status_enable = {"FLEX_COUNTER_STATUS": "enable"}
66+
67+
self.config_db.create_entry("FLEX_COUNTER_TABLE", "PG_DROP", fc_status_enable)
68+
69+
def clear_flex_counter(self):
70+
for pg in self.pgs:
71+
self.flex_db.delete_entry("FLEX_COUNTER_TABLE", "PG_DROP_STAT_COUNTER:{}".format(pg))
72+
73+
self.config_db.delete_entry("FLEX_COUNTER_TABLE", "PG_DROP")
74+
75+
76+
def test_pg_drop_counters(self, dvs):
77+
self.setup_dbs(dvs)
78+
self.pgs = self.asic_db.get_keys("ASIC_STATE:SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP")
79+
try:
80+
self.set_up_flex_counter()
81+
82+
self.populate_asic(dvs, "0")
83+
time.sleep(self.DEFAULT_POLL_INTERVAL)
84+
self.verify_value(dvs, self.pgs, pg_drop_attr, "0")
85+
86+
self.populate_asic(dvs, "100")
87+
time.sleep(self.DEFAULT_POLL_INTERVAL)
88+
self.verify_value(dvs, self.pgs, pg_drop_attr, "100")
89+
90+
self.populate_asic(dvs, "123")
91+
time.sleep(self.DEFAULT_POLL_INTERVAL)
92+
self.verify_value(dvs, self.pgs, pg_drop_attr, "123")
93+
finally:
94+
self.clear_flex_counter()

0 commit comments

Comments
 (0)