Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/RedisRemoteSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions lib/sairedis.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
121 changes: 80 additions & 41 deletions syncd/FlexCounter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ void BaseCounterContext::addPlugins(
}
}

void BaseCounterContext::setBulkSize(uint32_t bulkSize)
{
SWSS_LOG_ENTER();
default_bulk_size = bulkSize;
}

template <typename StatType,
typename Enable = void>
struct CounterIds
Expand Down Expand Up @@ -559,6 +565,9 @@ class CounterContext : public BaseCounterContext
{
return;
}

SWSS_LOG_INFO("Before running plugin %s", m_name.c_str());

std::vector<std::string> idStrings;
idStrings.reserve(m_objectIdsMap.size());
std::transform(m_objectIdsMap.begin(),
Expand All @@ -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
Expand Down Expand Up @@ -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<uint32_t>(ctx.object_keys.size()),
ctx.object_keys.data(),
static_cast<uint32_t>(ctx.counter_ids.size()),
reinterpret_cast<const sai_stat_id_t *>(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<uint32_t>(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<uint32_t>(ctx.counter_ids.size()),
reinterpret_cast<const sai_stat_id_t *>(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<swss::FieldValueTuple> values;
Expand All @@ -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(
Expand Down Expand Up @@ -1115,6 +1149,7 @@ void FlexCounter::addCounterPlugin(
SWSS_LOG_ENTER();

m_isDiscarded = false;
uint32_t bulkSize = 0;

for (auto& fvt: values)
{
Expand All @@ -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);
Expand All @@ -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<std::string, std::string> 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());
}
}
}

Expand Down
3 changes: 3 additions & 0 deletions syncd/FlexCounter.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ namespace syncd
void addPlugins(
_In_ const std::vector<std::string>& shaStrings);

void setBulkSize(uint32_t bulkSize);

bool hasPlugin() const {return !m_plugins.empty();}

void removePlugins() {m_plugins.clear();}
Expand Down Expand Up @@ -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
{
Expand Down