@@ -2535,8 +2535,59 @@ sai_status_t processEvent(
25352535 return status;
25362536}
25372537
2538+ void processFlexCounterGeneralFields (
2539+ _In_ swss::KeyOpFieldsValuesTuple kco,
2540+ _In_ std::string tableName)
2541+ {
2542+ SWSS_LOG_ENTER ();
2543+
2544+ const auto &op = kfvOp (kco);
2545+ const auto values = kfvFieldsValues (kco);
2546+
2547+ if (op == DEL_COMMAND)
2548+ {
2549+ FlexCounter::removeCounterPlugin (tableName);
2550+ return ;
2551+ }
2552+
2553+ for (const auto & valuePair : values)
2554+ {
2555+ const auto field = fvField (valuePair);
2556+ const auto value = fvValue (valuePair);
2557+
2558+ if (op == SET_COMMAND)
2559+ {
2560+ if (field == POLL_INTERVAL_FIELD)
2561+ {
2562+ FlexCounter::setPollInterval (stoi (value), tableName);
2563+ }
2564+ else if (field == QUEUE_PLUGIN_FIELD)
2565+ {
2566+ auto shaStrings = swss::tokenize (value, ' ,' );
2567+ for (const auto &sha : shaStrings)
2568+ {
2569+ FlexCounter::addQueueCounterPlugin (sha, tableName);
2570+ }
2571+ }
2572+ else if (field == PORT_PLUGIN_FIELD)
2573+ {
2574+ auto shaStrings = swss::tokenize (value, ' ,' );
2575+ for (const auto &sha : shaStrings)
2576+ {
2577+ FlexCounter::addPortCounterPlugin (sha, tableName);
2578+ }
2579+ }
2580+ else
2581+ {
2582+ SWSS_LOG_ERROR (" Object type not supported" );
2583+ }
2584+ }
2585+ }
2586+ }
2587+
25382588void processFlexCounterEvent (
2539- _In_ swss::ConsumerStateTable &consumer)
2589+ _In_ swss::ConsumerTable &consumer,
2590+ _In_ std::string tableName)
25402591{
25412592 SWSS_LOG_ENTER ();
25422593
@@ -2548,42 +2599,26 @@ void processFlexCounterEvent(
25482599 const auto &key = kfvKey (kco);
25492600 const auto &op = kfvOp (kco);
25502601
2551- std::size_t delimiter = key.find_last_of (" :" );
2552-
2553- if (delimiter == std::string::npos)
2602+ if (key == GENERAL)
25542603 {
2555- SWSS_LOG_ERROR (" Failed to parse the key %s" , key.c_str ());
2556- return ;
2557- }
2558-
2559- const auto intervalStr = key.substr (delimiter + 1 );
2560- const auto vidStr = key.substr (0 , delimiter);
2561- int pollInterval;
2562-
2563- try
2564- {
2565- pollInterval = std::stoi (intervalStr);
2566- }
2567- catch (const std::invalid_argument)
2568- {
2569- SWSS_LOG_ERROR (" Failed to convert the poll intervall, key = %s" , key.c_str ());
2604+ processFlexCounterGeneralFields (kco, tableName);
25702605 return ;
25712606 }
25722607
25732608 sai_object_id_t vid = SAI_NULL_OBJECT_ID;
2574- sai_deserialize_object_id (vidStr , vid);
2609+ sai_deserialize_object_id (key , vid);
25752610 sai_object_id_t rid = translate_vid_to_rid (vid);
25762611 sai_object_type_t objectType = sai_object_type_query (rid);
25772612
25782613 if (op == DEL_COMMAND)
25792614 {
25802615 if (objectType == SAI_OBJECT_TYPE_PORT)
25812616 {
2582- FlexCounter::removePort (vid, pollInterval );
2617+ FlexCounter::removePort (vid, tableName );
25832618 }
25842619 else if (objectType == SAI_OBJECT_TYPE_QUEUE)
25852620 {
2586- FlexCounter::removeQueue (vid, pollInterval );
2621+ FlexCounter::removeQueue (vid, tableName );
25872622 }
25882623 else
25892624 {
@@ -2601,7 +2636,7 @@ void processFlexCounterEvent(
26012636 {
26022637 auto idStrings = swss::tokenize (value, ' ,' );
26032638
2604- if (objectType == SAI_OBJECT_TYPE_PORT && field == PFC_WD_PORT_COUNTER_ID_LIST )
2639+ if (objectType == SAI_OBJECT_TYPE_PORT && field == PORT_COUNTER_ID_LIST )
26052640 {
26062641 std::vector<sai_port_stat_t > portCounterIds;
26072642 for (const auto &str : idStrings)
@@ -2610,9 +2645,9 @@ void processFlexCounterEvent(
26102645 sai_deserialize_port_stat (str, stat);
26112646 portCounterIds.push_back (stat);
26122647 }
2613- FlexCounter::setPortCounterList (vid, rid, pollInterval , portCounterIds);
2648+ FlexCounter::setPortCounterList (vid, rid, tableName , portCounterIds);
26142649 }
2615- else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == PFC_WD_QUEUE_COUNTER_ID_LIST )
2650+ else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == QUEUE_COUNTER_ID_LIST )
26162651 {
26172652 std::vector<sai_queue_stat_t > queueCounterIds;
26182653 for (const auto &str : idStrings)
@@ -2621,9 +2656,9 @@ void processFlexCounterEvent(
26212656 sai_deserialize_queue_stat (str, stat);
26222657 queueCounterIds.push_back (stat);
26232658 }
2624- FlexCounter::setQueueCounterList (vid, rid, pollInterval , queueCounterIds);
2659+ FlexCounter::setQueueCounterList (vid, rid, tableName , queueCounterIds);
26252660 }
2626- else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == PFC_WD_QUEUE_ATTR_ID_LIST )
2661+ else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == QUEUE_ATTR_ID_LIST )
26272662 {
26282663 std::vector<sai_queue_attr_t > queueAttrIds;
26292664 for (const auto &str : idStrings)
@@ -2633,7 +2668,7 @@ void processFlexCounterEvent(
26332668 queueAttrIds.push_back (attr);
26342669 }
26352670
2636- FlexCounter::setQueueAttrList (vid, rid, pollInterval , queueAttrIds);
2671+ FlexCounter::setQueueAttrList (vid, rid, tableName , queueAttrIds);
26372672 }
26382673 else
26392674 {
@@ -2643,73 +2678,6 @@ void processFlexCounterEvent(
26432678 }
26442679}
26452680
2646- void processFlexCounterPluginEvent (
2647- _In_ swss::ConsumerStateTable &consumer)
2648- {
2649- SWSS_LOG_ENTER ();
2650-
2651- std::lock_guard<std::mutex> lock (g_mutex);
2652-
2653- swss::KeyOpFieldsValuesTuple kco;
2654- consumer.pop (kco);
2655-
2656- const auto &key = kfvKey (kco);
2657- const auto &op = kfvOp (kco);
2658-
2659- std::size_t delimiter = key.find_last_of (" :" );
2660-
2661- if (delimiter == std::string::npos)
2662- {
2663- SWSS_LOG_ERROR (" Failed to parse the key %s" , key.c_str ());
2664- return ;
2665- }
2666-
2667- const auto intervalStr = key.substr (delimiter + 1 );
2668- const auto sha = key.substr (0 , delimiter);
2669- int pollInterval;
2670-
2671- try
2672- {
2673- pollInterval = std::stoi (intervalStr);
2674- }
2675- catch (const std::invalid_argument)
2676- {
2677- SWSS_LOG_ERROR (" Failed to convert the poll intervall, key = %s" , key.c_str ());
2678- return ;
2679- }
2680-
2681- if (op == DEL_COMMAND)
2682- {
2683- FlexCounter::removeCounterPlugin (sha, pollInterval);
2684- return ;
2685- }
2686-
2687- const auto values = kfvFieldsValues (kco);
2688- for (const auto & valuePair : values)
2689- {
2690- const auto field = fvField (valuePair);
2691- const auto value = fvValue (valuePair);
2692-
2693- if (field != SAI_OBJECT_TYPE)
2694- {
2695- continue ;
2696- }
2697-
2698- if (value == sai_serialize_object_type (SAI_OBJECT_TYPE_PORT))
2699- {
2700- FlexCounter::addPortCounterPlugin (sha, pollInterval);
2701- }
2702- else if (value == sai_serialize_object_type (SAI_OBJECT_TYPE_QUEUE))
2703- {
2704- FlexCounter::addQueueCounterPlugin (sha, pollInterval);
2705- }
2706- else
2707- {
2708- SWSS_LOG_ERROR (" Plugin for %s is not supported" , value.c_str ());
2709- }
2710- }
2711- }
2712-
27132681void printUsage ()
27142682{
27152683 SWSS_LOG_ENTER ();
@@ -3292,14 +3260,14 @@ int syncd_main(int argc, char **argv)
32923260
32933261 std::shared_ptr<swss::DBConnector> dbAsic = std::make_shared<swss::DBConnector>(ASIC_DB, swss::DBConnector::DEFAULT_UNIXSOCKET, 0 );
32943262 std::shared_ptr<swss::DBConnector> dbNtf = std::make_shared<swss::DBConnector>(ASIC_DB, swss::DBConnector::DEFAULT_UNIXSOCKET, 0 );
3295- std::shared_ptr<swss::DBConnector> dbFlexCounter = std::make_shared<swss::DBConnector>(PFC_WD_DB , swss::DBConnector::DEFAULT_UNIXSOCKET, 0 );
3263+ std::shared_ptr<swss::DBConnector> dbFlexCounter = std::make_shared<swss::DBConnector>(FLEX_COUNTER_DB , swss::DBConnector::DEFAULT_UNIXSOCKET, 0 );
32963264
32973265 g_redisClient = std::make_shared<swss::RedisClient>(dbAsic.get ());
32983266
32993267 std::shared_ptr<swss::ConsumerTable> asicState = std::make_shared<swss::ConsumerTable>(dbAsic.get (), ASIC_STATE_TABLE);
33003268 std::shared_ptr<swss::NotificationConsumer> restartQuery = std::make_shared<swss::NotificationConsumer>(dbAsic.get (), " RESTARTQUERY" );
3301- std::shared_ptr<swss::ConsumerStateTable> flexCounterState = std::make_shared<swss::ConsumerStateTable >(dbFlexCounter.get (), PFC_WD_STATE_TABLE );
3302- std::shared_ptr<swss::ConsumerStateTable> flexCounterPlugin = std::make_shared<swss::ConsumerStateTable >(dbFlexCounter.get (), PLUGIN_TABLE );
3269+ std::shared_ptr<swss::ConsumerTable> pfcWdFlexCounter = std::make_shared<swss::ConsumerTable >(dbFlexCounter.get (), FLEX_PFC_WD_TABLE );
3270+ std::shared_ptr<swss::ConsumerTable> statFlexCounter = std::make_shared<swss::ConsumerTable >(dbFlexCounter.get (), FLEX_STAT_COUNTER_TABLE );
33033271
33043272 /*
33053273 * At the end we cant use producer consumer concept since if one proces
@@ -3388,8 +3356,8 @@ int syncd_main(int argc, char **argv)
33883356
33893357 s.addSelectable (asicState.get ());
33903358 s.addSelectable (restartQuery.get ());
3391- s.addSelectable (flexCounterState .get ());
3392- s.addSelectable (flexCounterPlugin .get ());
3359+ s.addSelectable (pfcWdFlexCounter .get ());
3360+ s.addSelectable (statFlexCounter .get ());
33933361
33943362 SWSS_LOG_NOTICE (" starting main loop" );
33953363
@@ -3414,13 +3382,13 @@ int syncd_main(int argc, char **argv)
34143382 warmRestartHint = handleRestartQuery (*restartQuery);
34153383 break ;
34163384 }
3417- else if (sel == flexCounterState .get ())
3385+ else if (sel == pfcWdFlexCounter .get ())
34183386 {
3419- processFlexCounterEvent (*(swss::ConsumerStateTable *)sel);
3387+ processFlexCounterEvent (*(swss::ConsumerTable *)sel, FLEX_PFC_WD_TABLE );
34203388 }
3421- else if (sel == flexCounterPlugin .get ())
3389+ else if (sel == statFlexCounter .get ())
34223390 {
3423- processFlexCounterPluginEvent (*(swss::ConsumerStateTable *)sel);
3391+ processFlexCounterEvent (*(swss::ConsumerTable *)sel, FLEX_STAT_COUNTER_TABLE );
34243392 }
34253393 else if (result == swss::Select::OBJECT)
34263394 {
0 commit comments