diff --git a/lib/RedisRemoteSaiInterface.cpp b/lib/RedisRemoteSaiInterface.cpp index 1c846fe5a7..57c793165a 100644 --- a/lib/RedisRemoteSaiInterface.cpp +++ b/lib/RedisRemoteSaiInterface.cpp @@ -568,6 +568,7 @@ sai_status_t RedisRemoteSaiInterface::notifyCounterGroupOperations( std::string key((const char*)flexCounterGroupParam->counter_group_name.list, flexCounterGroupParam->counter_group_name.count); emplaceStrings(POLL_INTERVAL_FIELD, flexCounterGroupParam->poll_interval, entries); + emplaceStrings(BULK_SIZE_FIELD, flexCounterGroupParam->bulk_size, entries); emplaceStrings(STATS_MODE_FIELD, flexCounterGroupParam->stats_mode, entries); emplaceStrings(flexCounterGroupParam->plugin_name, flexCounterGroupParam->plugins, entries); emplaceStrings(FLEX_COUNTER_STATUS_FIELD, flexCounterGroupParam->operation, entries); diff --git a/lib/sairedis.h b/lib/sairedis.h index 56a21bd4dc..e3b8ab850d 100644 --- a/lib/sairedis.h +++ b/lib/sairedis.h @@ -140,6 +140,13 @@ typedef struct _sai_redis_flex_counter_group_parameter_t */ sai_s8_list_t plugins; + /** + * @brief The bulk size of the counter group + * + * It should be a number representing the bulk size. + */ + sai_s8_list_t bulk_size; + } sai_redis_flex_counter_group_parameter_t; typedef struct _sai_redis_flex_counter_parameter_t diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 4352efded2..f86c117b81 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -56,6 +56,12 @@ void BaseCounterContext::addPlugins( } } +void BaseCounterContext::setBulkSize(uint32_t bulkSize) +{ + SWSS_LOG_ENTER(); + default_bulk_size = bulkSize; +} + template struct CounterIds @@ -559,6 +565,9 @@ class CounterContext : public BaseCounterContext { return; } + + SWSS_LOG_INFO("Before running plugin %s", m_name.c_str()); + std::vector idStrings; idStrings.reserve(m_objectIdsMap.size()); std::transform(m_objectIdsMap.begin(), @@ -577,6 +586,8 @@ class CounterContext : public BaseCounterContext std::for_each(m_plugins.begin(), m_plugins.end(), [&] (auto &sha) { runRedisScript(counters_db, sha, idStrings, argv); }); + + SWSS_LOG_INFO("After running plugin %s", m_name.c_str()); } bool hasObject() const override @@ -679,19 +690,40 @@ class CounterContext : public BaseCounterContext { SWSS_LOG_ENTER(); auto statsMode = m_groupStatsMode == SAI_STATS_MODE_READ ? SAI_STATS_MODE_BULK_READ : SAI_STATS_MODE_BULK_READ_AND_CLEAR; - sai_status_t status = m_vendorSai->bulkGetStats( - SAI_NULL_OBJECT_ID, - m_objectType, - static_cast(ctx.object_keys.size()), - ctx.object_keys.data(), - static_cast(ctx.counter_ids.size()), - reinterpret_cast(ctx.counter_ids.data()), - statsMode, - ctx.object_statuses.data(), - ctx.counters.data()); - if (SAI_STATUS_SUCCESS != status) + uint32_t bulk_size = default_bulk_size; + uint32_t size = static_cast(ctx.object_keys.size()); + if (bulk_size > size || bulk_size == 0) + { + bulk_size = size; + } + uint32_t current = 0; + + SWSS_LOG_INFO("Before getting bulk %s size %u bulk_size %u current %u", m_name.c_str(), size, bulk_size, current); + + while (current < size) { - SWSS_LOG_WARN("Failed to bulk get stats for %s: %u", m_name.c_str(), status); + sai_status_t status = m_vendorSai->bulkGetStats( + SAI_NULL_OBJECT_ID, + m_objectType, + bulk_size, + ctx.object_keys.data() + current, + static_cast(ctx.counter_ids.size()), + reinterpret_cast(ctx.counter_ids.data()), + statsMode, + ctx.object_statuses.data() + current, + ctx.counters.data() + current * ctx.counter_ids.size()); + if (SAI_STATUS_SUCCESS != status) + { + SWSS_LOG_WARN("Failed to bulk get stats for %s: %u", m_name.c_str(), status); + } + current += bulk_size; + + SWSS_LOG_INFO("After getting bulk %s index %u(advanced to %u) bulk_size %u", m_name.c_str(), current - bulk_size, current, bulk_size); + + if (size - current < bulk_size) + { + bulk_size = size - current; + } } std::vector values; @@ -711,6 +743,8 @@ class CounterContext : public BaseCounterContext countersTable.set(sai_serialize_object_id(vid), values, ""); values.clear(); } + + SWSS_LOG_INFO("After pushing db %s", m_name.c_str()); } auto getBulkStatsContext( @@ -1115,6 +1149,7 @@ void FlexCounter::addCounterPlugin( SWSS_LOG_ENTER(); m_isDiscarded = false; + uint32_t bulkSize = 0; for (auto& fvt: values) { @@ -1127,6 +1162,15 @@ void FlexCounter::addCounterPlugin( { setPollInterval(stoi(value)); } + else if (field == BULK_SIZE_FIELD) + { + bulkSize = stoi(value); + for (auto &context : m_counterContext) + { + context.second->setBulkSize(bulkSize); + SWSS_LOG_NOTICE("Set counter context %s %s bulk size %u", m_instanceId.c_str(), COUNTER_TYPE_PORT.c_str(), bulkSize); + } + } else if (field == FLEX_COUNTER_STATUS_FIELD) { setStatus(value); @@ -1135,37 +1179,32 @@ void FlexCounter::addCounterPlugin( { setStatsMode(value); } - else if (field == QUEUE_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_QUEUE)->addPlugins(shaStrings); - } - else if (field == PG_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_PG)->addPlugins(shaStrings); - } - else if (field == PORT_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_PORT)->addPlugins(shaStrings); - } - else if (field == RIF_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_RIF)->addPlugins(shaStrings); - } - else if (field == BUFFER_POOL_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_BUFFER_POOL)->addPlugins(shaStrings); - } - else if (field == TUNNEL_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_TUNNEL)->addPlugins(shaStrings); - } - else if (field == FLOW_COUNTER_PLUGIN_FIELD) - { - getCounterContext(COUNTER_TYPE_FLOW)->addPlugins(shaStrings); - } else { - SWSS_LOG_ERROR("Field is not supported %s", field.c_str()); + std::map plugIn2CounterType = { + {QUEUE_PLUGIN_FIELD, COUNTER_TYPE_QUEUE}, + {PG_PLUGIN_FIELD, COUNTER_TYPE_PG}, + {PORT_PLUGIN_FIELD, COUNTER_TYPE_PORT}, + {RIF_PLUGIN_FIELD, COUNTER_TYPE_RIF}, + {BUFFER_POOL_PLUGIN_FIELD, COUNTER_TYPE_BUFFER_POOL}, + {TUNNEL_PLUGIN_FIELD, COUNTER_TYPE_TUNNEL}, + {FLOW_COUNTER_PLUGIN_FIELD, COUNTER_TYPE_FLOW}}; + + auto counterTypeRef = plugIn2CounterType.find(field); + if (counterTypeRef != plugIn2CounterType.end()) + { + getCounterContext(counterTypeRef->second)->addPlugins(shaStrings); + + if (bulkSize > 0) + { + getCounterContext(counterTypeRef->second)->setBulkSize(bulkSize); + SWSS_LOG_NOTICE("Create counter context %s %s with bulk size %u", m_instanceId.c_str(), counterTypeRef->second.c_str(), bulkSize); + } + } + else + { + SWSS_LOG_ERROR("Field is not supported %s", field.c_str()); + } } } diff --git a/syncd/FlexCounter.h b/syncd/FlexCounter.h index 0ed9c8be3e..c48654c1d1 100644 --- a/syncd/FlexCounter.h +++ b/syncd/FlexCounter.h @@ -24,6 +24,8 @@ namespace syncd void addPlugins( _In_ const std::vector& shaStrings); + void setBulkSize(uint32_t bulkSize); + bool hasPlugin() const {return !m_plugins.empty();} void removePlugins() {m_plugins.clear();} @@ -55,6 +57,7 @@ namespace syncd bool use_sai_stats_capa_query = true; bool use_sai_stats_ext = false; bool double_confirm_supported_counters = false; + uint32_t default_bulk_size = 0; }; class FlexCounter {