@@ -284,9 +284,9 @@ static char* hostif_vlan_tag[] = {
284284PortsOrch::PortsOrch (DBConnector *db, DBConnector *stateDb, vector<table_name_with_pri_t > &tableNames, DBConnector *chassisAppDb) :
285285 Orch(db, tableNames),
286286 m_portStateTable(stateDb, STATE_PORT_TABLE_NAME),
287- port_stat_manager(PORT_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true ),
288- port_buffer_drop_stat_manager(PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_BUFFER_DROP_STAT_POLLING_INTERVAL_MS, true ),
289- queue_stat_manager(QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, QUEUE_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, true )
287+ port_stat_manager(PORT_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false ),
288+ port_buffer_drop_stat_manager(PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP, StatsMode::READ, PORT_BUFFER_DROP_STAT_POLLING_INTERVAL_MS, false ),
289+ queue_stat_manager(QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, QUEUE_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false )
290290{
291291 SWSS_LOG_ENTER ();
292292
@@ -2273,19 +2273,21 @@ bool PortsOrch::initPort(const string &alias, const string &role, const int inde
22732273 vector<FieldValueTuple> fields;
22742274 fields.push_back (tuple);
22752275 m_counterTable->set (" " , fields);
2276+
22762277 // Install a flex counter for this port to track stats
2277- std::unordered_set<std::string> counter_stats;
2278- for (const auto & it: port_stat_ids)
2278+ auto flex_counters_orch = gDirectory .get <FlexCounterOrch*>();
2279+ /* Delay installing the counters if they are yet enabled
2280+ If they are enabled, install the counters immediately */
2281+ if (flex_counters_orch->getPortCountersState ())
22792282 {
2280- counter_stats.emplace (sai_serialize_port_stat (it));
2283+ auto port_counter_stats = generateCounterStats (PORT_STAT_COUNTER_FLEX_COUNTER_GROUP);
2284+ port_stat_manager.setCounterIdList (p.m_port_id , CounterType::PORT, port_counter_stats);
22812285 }
2282- port_stat_manager.setCounterIdList (p.m_port_id , CounterType::PORT, counter_stats);
2283- std::unordered_set<std::string> port_buffer_drop_stats;
2284- for (const auto & it: port_buffer_drop_stat_ids)
2286+ if (flex_counters_orch->getPortBufferDropCountersState ())
22852287 {
2286- port_buffer_drop_stats.emplace (sai_serialize_port_stat (it));
2288+ auto port_buffer_drop_stats = generateCounterStats (PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP);
2289+ port_buffer_drop_stat_manager.setCounterIdList (p.m_port_id , CounterType::PORT, port_buffer_drop_stats);
22872290 }
2288- port_buffer_drop_stat_manager.setCounterIdList (p.m_port_id , CounterType::PORT, port_buffer_drop_stats);
22892291
22902292 PortUpdate update = { p, true };
22912293 notify (SUBJECT_TYPE_PORT_CHANGE, static_cast <void *>(&update));
@@ -2318,8 +2320,11 @@ void PortsOrch::deInitPort(string alias, sai_object_id_t port_id)
23182320 p.m_port_id = port_id;
23192321
23202322 /* remove port from flex_counter_table for updating counters */
2321- port_stat_manager.clearCounterIdList (p.m_port_id );
2322-
2323+ auto flex_counters_orch = gDirectory .get <FlexCounterOrch*>();
2324+ if ((flex_counters_orch->getPortCountersState ()))
2325+ {
2326+ port_stat_manager.clearCounterIdList (p.m_port_id );
2327+ }
23232328 /* remove port name map from counter table */
23242329 m_counter_db->hdel (COUNTERS_PORT_NAME_MAP, alias);
23252330
@@ -5072,6 +5077,42 @@ void PortsOrch::generatePriorityGroupMapPerPort(const Port& port)
50725077 CounterCheckOrch::getInstance ().addPort (port);
50735078}
50745079
5080+ void PortsOrch::generatePortCounterMap ()
5081+ {
5082+ if (m_isPortCounterMapGenerated)
5083+ {
5084+ return ;
5085+ }
5086+
5087+ auto port_counter_stats = generateCounterStats (PORT_STAT_COUNTER_FLEX_COUNTER_GROUP);
5088+ for (const auto & it: m_portList)
5089+ {
5090+ if (it.first == " CPU" )
5091+ {
5092+ continue ;
5093+ }
5094+ port_stat_manager.setCounterIdList (it.second .m_port_id , CounterType::PORT, port_counter_stats);
5095+ }
5096+
5097+ m_isPortCounterMapGenerated = true ;
5098+ }
5099+
5100+ void PortsOrch::generatePortBufferDropCounterMap ()
5101+ {
5102+ if (m_isPortBufferDropCounterMapGenerated)
5103+ {
5104+ return ;
5105+ }
5106+
5107+ auto port_buffer_drop_stats = generateCounterStats (PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP);
5108+ for (const auto & it: m_portList)
5109+ {
5110+ port_buffer_drop_stat_manager.setCounterIdList (it.second .m_port_id , CounterType::PORT, port_buffer_drop_stats);
5111+ }
5112+
5113+ m_isPortBufferDropCounterMapGenerated = true ;
5114+ }
5115+
50755116void PortsOrch::doTask (NotificationConsumer &consumer)
50765117{
50775118 SWSS_LOG_ENTER ();
@@ -6228,3 +6269,23 @@ void PortsOrch::voqSyncDelLagMember(Port &lag, Port &port)
62286269 string key = lag.m_system_lag_info .alias + " :" + port.m_system_port_info .alias ;
62296270 m_tableVoqSystemLagMemberTable->del (key);
62306271}
6272+
6273+ std::unordered_set<std::string> PortsOrch::generateCounterStats (const string& type)
6274+ {
6275+ std::unordered_set<std::string> counter_stats;
6276+ if (type == PORT_STAT_COUNTER_FLEX_COUNTER_GROUP)
6277+ {
6278+ for (const auto & it: port_stat_ids)
6279+ {
6280+ counter_stats.emplace (sai_serialize_port_stat (it));
6281+ }
6282+ }
6283+ else if (type == PORT_BUFFER_DROP_STAT_FLEX_COUNTER_GROUP)
6284+ {
6285+ for (const auto & it: port_buffer_drop_stat_ids)
6286+ {
6287+ counter_stats.emplace (sai_serialize_port_stat (it));
6288+ }
6289+ }
6290+ return counter_stats;
6291+ }
0 commit comments