Skip to content

Commit

Permalink
Queue stat counters (sonic-net#230)
Browse files Browse the repository at this point in the history
* Update port and queue counters by Flex counter

* [stat counters sonic-net#230] added missing removing of empty instances
  • Loading branch information
AndriiS authored and lguohan committed Nov 15, 2017
1 parent d11f550 commit f1f7f26
Show file tree
Hide file tree
Showing 9 changed files with 294 additions and 277 deletions.
2 changes: 0 additions & 2 deletions syncd/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ syncd_SOURCES = \
syncd_saiswitch.cpp \
syncd_hard_reinit.cpp \
syncd_notifications.cpp \
syncd_counters.cpp \
syncd_applyview.cpp \
syncd_flex_counter.cpp

Expand All @@ -42,7 +41,6 @@ tests_SOURCES = \
syncd_saiswitch.cpp \
syncd_hard_reinit.cpp \
syncd_notifications.cpp \
syncd_counters.cpp \
syncd_applyview.cpp \
syncd_flex_counter.cpp

Expand Down
86 changes: 61 additions & 25 deletions syncd/syncd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2243,10 +2243,10 @@ sai_status_t processBulkEvent(
sai_status_t processEvent(
_In_ swss::ConsumerTable &consumer)
{
std::lock_guard<std::mutex> lock(g_mutex);

SWSS_LOG_ENTER();

std::lock_guard<std::mutex> lock(g_mutex);

swss::KeyOpFieldsValuesTuple kco;

if (isInitViewMode())
Expand Down Expand Up @@ -2472,18 +2472,40 @@ sai_status_t processEvent(
void processFlexCounterEvent(
_In_ swss::ConsumerStateTable &consumer)
{
std::lock_guard<std::mutex> lock(g_mutex);

SWSS_LOG_ENTER();

std::lock_guard<std::mutex> lock(g_mutex);

swss::KeyOpFieldsValuesTuple kco;
consumer.pop(kco);

const auto &key = kfvKey(kco);
const auto &op = kfvOp(kco);

std::size_t delimiter = key.find_last_of(":");

if (delimiter == std::string::npos)
{
SWSS_LOG_ERROR("Failed to parse the key %s", key.c_str());
return;
}

const auto intervalStr = key.substr(delimiter + 1);
const auto vidStr = key.substr(0, delimiter);
int pollInterval;

try
{
pollInterval = std::stoi(intervalStr);
}
catch(const std::invalid_argument)
{
SWSS_LOG_ERROR("Failed to convert the poll intervall, key = %s", key.c_str());
return;
}

sai_object_id_t vid = SAI_NULL_OBJECT_ID;
sai_deserialize_object_id(key, vid);
sai_deserialize_object_id(vidStr, vid);
sai_object_id_t rid = translate_vid_to_rid(vid);
sai_object_type_t objectType = sai_object_type_query(rid);

Expand All @@ -2497,11 +2519,11 @@ void processFlexCounterEvent(
{
if (objectType == SAI_OBJECT_TYPE_PORT)
{
FlexCounter::removePort(vid);
FlexCounter::removePort(vid, pollInterval);
}
else if (objectType == SAI_OBJECT_TYPE_QUEUE)
{
FlexCounter::removeQueue(vid);
FlexCounter::removeQueue(vid, pollInterval);
}
else
{
Expand All @@ -2521,7 +2543,7 @@ void processFlexCounterEvent(
sai_deserialize_port_stat(str, stat);
portCounterIds.push_back(stat);
}
FlexCounter::setPortCounterList(vid, rid, portCounterIds);
FlexCounter::setPortCounterList(vid, rid, pollInterval, portCounterIds);
}
else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == PFC_WD_QUEUE_COUNTER_ID_LIST)
{
Expand All @@ -2532,7 +2554,7 @@ void processFlexCounterEvent(
sai_deserialize_queue_stat(str, stat);
queueCounterIds.push_back(stat);
}
FlexCounter::setQueueCounterList(vid, rid, queueCounterIds);
FlexCounter::setQueueCounterList(vid, rid, pollInterval, queueCounterIds);
}
else if (objectType == SAI_OBJECT_TYPE_QUEUE && field == PFC_WD_QUEUE_ATTR_ID_LIST)
{
Expand All @@ -2544,7 +2566,7 @@ void processFlexCounterEvent(
queueAttrIds.push_back(attr);
}

FlexCounter::setQueueAttrList(vid, rid, queueAttrIds);
FlexCounter::setQueueAttrList(vid, rid, pollInterval, queueAttrIds);
}
else
{
Expand All @@ -2557,19 +2579,41 @@ void processFlexCounterEvent(
void processFlexCounterPluginEvent(
_In_ swss::ConsumerStateTable &consumer)
{
std::lock_guard<std::mutex> lock(g_mutex);

SWSS_LOG_ENTER();

std::lock_guard<std::mutex> lock(g_mutex);

swss::KeyOpFieldsValuesTuple kco;
consumer.pop(kco);

const auto &key = kfvKey(kco);
const auto &op = kfvOp(kco);

std::size_t delimiter = key.find_last_of(":");

if (delimiter == std::string::npos)
{
SWSS_LOG_ERROR("Failed to parse the key %s", key.c_str());
return;
}

const auto intervalStr = key.substr(delimiter + 1);
const auto sha = key.substr(0, delimiter);
int pollInterval;

try
{
pollInterval = std::stoi(intervalStr);
}
catch(const std::invalid_argument)
{
SWSS_LOG_ERROR("Failed to convert the poll intervall, key = %s", key.c_str());
return;
}

if (op == DEL_COMMAND)
{
FlexCounter::removeCounterPlugin(key);
FlexCounter::removeCounterPlugin(sha, pollInterval);
return;
}

Expand All @@ -2586,11 +2630,11 @@ void processFlexCounterPluginEvent(

if (value == sai_serialize_object_type(SAI_OBJECT_TYPE_PORT))
{
FlexCounter::addPortCounterPlugin(key);
FlexCounter::addPortCounterPlugin(sha, pollInterval);
}
else if (value == sai_serialize_object_type(SAI_OBJECT_TYPE_QUEUE))
{
FlexCounter::addQueueCounterPlugin(key);
FlexCounter::addQueueCounterPlugin(sha, pollInterval);
}
else
{
Expand Down Expand Up @@ -3036,6 +3080,7 @@ void performWarmRestart()

void onSyncdStart(bool warmStart)
{
SWSS_LOG_ENTER();
std::lock_guard<std::mutex> lock(g_mutex);

/*
Expand All @@ -3046,7 +3091,7 @@ void onSyncdStart(bool warmStart)
* need to use a lock here to prevent that.
*/

SWSS_LOG_ENTER();


SWSS_LOG_TIMER("on syncd start");

Expand Down Expand Up @@ -3260,13 +3305,6 @@ int syncd_main(int argc, char **argv)
onSyncdStart(options.startType == SAI_WARM_BOOT);
SWSS_LOG_NOTICE("after onSyncdStart");

if (options.disableCountersThread == false)
{
SWSS_LOG_NOTICE("starting counters thread");

startCountersThread(options.countersThreadIntervalInSeconds);
}

startNotificationsProcessingThread();

SWSS_LOG_NOTICE("syncd listening for events");
Expand Down Expand Up @@ -3322,8 +3360,6 @@ int syncd_main(int argc, char **argv)
exit_and_notify(EXIT_FAILURE);
}

endCountersThread();

if (warmRestartHint)
{
const char *warmBootWriteFile = profile_get_value(0, SAI_KEY_WARM_BOOT_WRITE_FILE);
Expand Down
4 changes: 0 additions & 4 deletions syncd/syncd.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,6 @@ void translate_rid_to_vid_list(
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);

void endCountersThread();
void startCountersThread(
_In_ int intervalInSeconds);

sai_status_t syncdApplyView();
void check_notifications_pointers(
_In_ uint32_t attr_count,
Expand Down
86 changes: 0 additions & 86 deletions syncd/syncd_counters.cpp

This file was deleted.

Loading

0 comments on commit f1f7f26

Please sign in to comment.