Skip to content

Commit 3a9f9e4

Browse files
authored
[Dash] Deprecate traditional Flex Counter support (sonic-net#3954)
What I did Simplify the logic by removing Timers etc associated with Traditional Approach for DASH counters. With sairedis channel, FC creation is always guaranteed to follow Eni Object creation thus removing the need for Timers etc Refactor Dash Meter FC by moving the logic into DashOrch since pre-requisites for creating ENI/Meter counters is the same and is dependent only on ENI object creation/deletion
1 parent f1225cd commit 3a9f9e4

8 files changed

Lines changed: 123 additions & 311 deletions

File tree

orchagent/dash/dashmeterorch.cpp

Lines changed: 2 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,12 @@ extern sai_object_id_t gSwitchId;
2323
extern size_t gMaxBulkSize;
2424
extern CrmOrch *gCrmOrch;
2525
extern Directory<Orch*> gDirectory;
26-
extern bool gTraditionalFlexCounter;
2726

28-
#define METER_FLEX_COUNTER_UPD_INTERVAL 1
29-
30-
DashMeterOrch::DashMeterOrch(DBConnector *db, const vector<string> &tables, DashOrch *dash_orch, DBConnector *app_state_db, ZmqServer *zmqServer) :
31-
m_meter_stat_manager(METER_STAT_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS, false),
27+
DashMeterOrch::DashMeterOrch(DBConnector *db, const vector<string> &tables, DBConnector *app_state_db, ZmqServer *zmqServer) :
3228
meter_rule_bulker_(sai_dash_meter_api, gSwitchId, gMaxBulkSize),
33-
ZmqOrch(db, tables, zmqServer),
34-
m_dash_orch(dash_orch)
29+
ZmqOrch(db, tables, zmqServer)
3530
{
3631
SWSS_LOG_ENTER();
37-
38-
m_counter_db = std::shared_ptr<DBConnector>(new DBConnector("COUNTERS_DB", 0));
39-
m_asic_db = std::shared_ptr<DBConnector>(new DBConnector("ASIC_DB", 0));
40-
41-
if (gTraditionalFlexCounter)
42-
{
43-
m_vid_to_rid_table = std::make_unique<Table>(m_asic_db.get(), "VIDTORID");
44-
}
45-
46-
auto intervT = timespec { .tv_sec = METER_FLEX_COUNTER_UPD_INTERVAL , .tv_nsec = 0 };
47-
m_meter_fc_update_timer = new SelectableTimer(intervT);
48-
auto executorT = new ExecutableTimer(m_meter_fc_update_timer, this, "METER_FLEX_COUNTER_UPD_TIMER");
49-
Orch::addExecutor(executorT);
50-
51-
/* Fetch the meter bucket counter Ids */
52-
m_meter_counter_stats.clear();
53-
auto stat_enum_list = queryAvailableCounterStats((sai_object_type_t)SAI_OBJECT_TYPE_METER_BUCKET_ENTRY);
54-
for (auto &stat_enum: stat_enum_list)
55-
{
56-
auto counter_id = static_cast<sai_meter_bucket_entry_stat_t>(stat_enum);
57-
m_meter_counter_stats.emplace(sai_serialize_meter_bucket_entry_stat(counter_id));
58-
}
5932
}
6033

6134
sai_object_id_t DashMeterOrch::getMeterPolicyOid(const string& meter_policy) const
@@ -619,88 +592,3 @@ void DashMeterOrch::doTask(ConsumerBase& consumer)
619592
SWSS_LOG_ERROR("Unknown table: %s", tn.c_str());
620593
}
621594
}
622-
623-
void DashMeterOrch::addEniToMeterFC(sai_object_id_t oid, const string &name)
624-
{
625-
if (!m_meter_fc_status)
626-
{
627-
return;
628-
}
629-
auto was_empty = m_meter_stat_work_queue.empty();
630-
m_meter_stat_work_queue[oid] = name;
631-
if (was_empty)
632-
{
633-
m_meter_fc_update_timer->start();
634-
}
635-
}
636-
637-
void DashMeterOrch::removeEniFromMeterFC(sai_object_id_t oid, const string &name)
638-
{
639-
SWSS_LOG_ENTER();
640-
641-
if (oid == SAI_NULL_OBJECT_ID)
642-
{
643-
SWSS_LOG_WARN("Cannot remove meter counter on NULL OID for eni %s", name.c_str());
644-
return;
645-
}
646-
if (m_meter_stat_work_queue.find(oid) != m_meter_stat_work_queue.end())
647-
{
648-
m_meter_stat_work_queue.erase(oid);
649-
return;
650-
}
651-
652-
m_meter_stat_manager.clearCounterIdList(oid);
653-
SWSS_LOG_INFO("Unregistering FC for ENI %s, oid %s", name.c_str(), sai_serialize_object_id(oid).c_str());
654-
}
655-
656-
void DashMeterOrch::handleMeterFCStatusUpdate(bool enabled)
657-
{
658-
DashOrch *dash_orch = gDirectory.get<DashOrch*>();
659-
bool prev_enabled = m_meter_fc_status;
660-
m_meter_fc_status = enabled; /* Update the status */
661-
if (!enabled && prev_enabled)
662-
{
663-
m_meter_fc_update_timer->stop();
664-
dash_orch->refreshMeterFCStats(false); /* Clear any existing FC entries */
665-
}
666-
else if (enabled && !prev_enabled)
667-
{
668-
dash_orch->refreshMeterFCStats(true);
669-
m_meter_fc_update_timer->start();
670-
}
671-
}
672-
673-
void DashMeterOrch::doTask(SelectableTimer &timer)
674-
{
675-
SWSS_LOG_ENTER();
676-
677-
if (!m_meter_fc_status)
678-
{
679-
m_meter_fc_update_timer->stop();
680-
return ;
681-
}
682-
683-
for (auto it = m_meter_stat_work_queue.begin(); it != m_meter_stat_work_queue.end(); )
684-
{
685-
string value;
686-
const auto id = sai_serialize_object_id(it->first);
687-
if (!gTraditionalFlexCounter || m_vid_to_rid_table->hget("", id, value))
688-
{
689-
SWSS_LOG_INFO("Registering FC for ENI %s, oid %s", it->second.c_str(), id.c_str());
690-
std::vector<FieldValueTuple> eniNameFvs;
691-
eniNameFvs.emplace_back(it->second, id);
692-
693-
m_meter_stat_manager.setCounterIdList(it->first, CounterType::DASH_METER, m_meter_counter_stats);
694-
it = m_meter_stat_work_queue.erase(it);
695-
}
696-
else
697-
{
698-
++it;
699-
}
700-
}
701-
702-
if (m_meter_stat_work_queue.empty())
703-
{
704-
m_meter_fc_update_timer->stop();
705-
}
706-
}

orchagent/dash/dashmeterorch.h

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@
2020
#include "dash_api/meter_policy.pb.h"
2121
#include "dash_api/meter_rule.pb.h"
2222

23-
#define METER_STAT_COUNTER_FLEX_COUNTER_GROUP "METER_STAT_COUNTER"
24-
#define METER_STAT_FLEX_COUNTER_POLLING_INTERVAL_MS 10000
25-
2623
struct MeterPolicyContext
2724
{
2825
std::string meter_policy;
@@ -69,18 +66,14 @@ class DashMeterOrch : public ZmqOrch
6966
public:
7067
using TaskArgs = std::vector<swss::FieldValueTuple>;
7168

72-
DashMeterOrch(swss::DBConnector *db, const std::vector<std::string> &tables, DashOrch *dash_orch, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer);
69+
DashMeterOrch(swss::DBConnector *db, const std::vector<std::string> &tables, swss::DBConnector *app_state_db, swss::ZmqServer *zmqServer);
7370
sai_object_id_t getMeterPolicyOid(const std::string& meter_policy) const;
7471
int32_t getMeterPolicyEniBindCount(const std::string& meter_policy) const;
7572
void incrMeterPolicyEniBindCount(const std::string& meter_policy);
7673
void decrMeterPolicyEniBindCount(const std::string& meter_policy);
77-
void addEniToMeterFC(sai_object_id_t oid, const std::string& name);
78-
void removeEniFromMeterFC(sai_object_id_t oid, const std::string& name);
79-
void handleMeterFCStatusUpdate(bool is_enabled);
8074

8175
private:
8276

83-
void doTask(swss::SelectableTimer&);
8477
void doTask(ConsumerBase &consumer);
8578
void doTaskMeterPolicyTable(ConsumerBase &consumer);
8679
void doTaskMeterRuleTable(ConsumerBase &consumer);
@@ -101,16 +94,7 @@ class DashMeterOrch : public ZmqOrch
10194
void incrMeterPolicyRuleCount(const std::string& meter_policy);
10295
void decrMeterPolicyRuleCount(const std::string& meter_policy);
10396

104-
DashOrch *m_dash_orch;
10597
MeterPolicyTable meter_policy_entries_;
10698
MeterRuleTable meter_rule_entries_;
10799
ObjectBulker<sai_dash_meter_api_t> meter_rule_bulker_;
108-
bool m_meter_fc_status = false;
109-
FlexCounterManager m_meter_stat_manager;
110-
std::unordered_set<std::string> m_meter_counter_stats;
111-
std::map<sai_object_id_t, std::string> m_meter_stat_work_queue;
112-
std::unique_ptr<swss::Table> m_vid_to_rid_table;
113-
std::shared_ptr<swss::DBConnector> m_counter_db;
114-
std::shared_ptr<swss::DBConnector> m_asic_db;
115-
swss::SelectableTimer* m_meter_fc_update_timer = nullptr;
116100
};

0 commit comments

Comments
 (0)