Skip to content

Commit

Permalink
Fix review comment
Browse files Browse the repository at this point in the history
  • Loading branch information
Junchao-Mellanox committed Nov 2, 2021
1 parent 98d66be commit 43c6e3c
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 11 deletions.
71 changes: 61 additions & 10 deletions orchagent/copporch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "schema.h"
#include "directory.h"
#include "flow_counter_handler.h"
#include "timer.h"

#include <inttypes.h>
#include <sstream>
Expand All @@ -26,6 +27,8 @@ extern PortsOrch* gPortsOrch;
extern Directory<Orch*> gDirectory;
extern bool gIsNatSupported;

#define FLEX_COUNTER_UPD_INTERVAL 1

static map<string, sai_meter_type_t> policer_meter_map = {
{"packets", SAI_METER_TYPE_PACKETS},
{"bytes", SAI_METER_TYPE_BYTES}
Expand Down Expand Up @@ -124,11 +127,18 @@ CoppOrch::CoppOrch(DBConnector* db, string tableName) :
Orch(db, tableName),
m_counter_db(std::shared_ptr<DBConnector>(new DBConnector("COUNTERS_DB", 0))),
m_flex_db(std::shared_ptr<DBConnector>(new DBConnector("FLEX_COUNTER_DB", 0))),
m_asic_db(std::shared_ptr<DBConnector>(new DBConnector("ASIC_DB", 0))),
m_counter_table(std::unique_ptr<Table>(new Table(m_counter_db.get(), COUNTERS_TRAP_NAME_MAP))),
m_vidToRidTable(std::unique_ptr<Table>(new Table(m_asic_db.get(), "VIDTORID"))),
m_flex_counter_group_table(std::unique_ptr<ProducerTable>(new ProducerTable(m_flex_db.get(), FLEX_COUNTER_GROUP_TABLE))),
m_trap_counter_manager(HOSTIF_TRAP_COUNTER_FLEX_COUNTER_GROUP, StatsMode::READ, HOSTIF_TRAP_COUNTER_POLLING_INTERVAL_MS, false)
{
SWSS_LOG_ENTER();
auto intervT = timespec { .tv_sec = FLEX_COUNTER_UPD_INTERVAL , .tv_nsec = 0 };
m_FlexCounterUpdTimer = new SelectableTimer(intervT);
auto executorT = new ExecutableTimer(m_FlexCounterUpdTimer, this, "FLEX_COUNTER_UPD_TIMER");
Orch::addExecutor(executorT);

initDefaultHostIntfTable();
initDefaultTrapGroup();
initDefaultTrapIds();
Expand Down Expand Up @@ -734,6 +744,36 @@ void CoppOrch::doTask(Consumer &consumer)
}
}

void CoppOrch::doTask(SelectableTimer &timer)
{
SWSS_LOG_ENTER();
SWSS_LOG_DEBUG("Registering %" PRId64 " new trap counters", m_pendingAddToFlexCntr.size());

string value;
for (auto it = m_pendingAddToFlexCntr.begin(); it != m_pendingAddToFlexCntr.end(); )
{
const auto id = sai_serialize_object_id(it->first);
if (m_vidToRidTable->hget("", id, value))
{
SWSS_LOG_INFO("Registering %s, id %s", it->second.c_str(), id.c_str());

std::unordered_set<std::string> counter_stats;
FlowCounterHandler::getGenericCounterIdList(counter_stats);
m_trap_counter_manager.setCounterIdList(it->first, CounterType::HOSTIF_TRAP, counter_stats);
it = m_pendingAddToFlexCntr.erase(it);
}
else
{
++it;
}
}

if (m_pendingAddToFlexCntr.empty())
{
m_FlexCounterUpdTimer->stop();
}
}

void CoppOrch::getTrapAddandRemoveList(string trap_group_name,
vector<sai_hostif_trap_type_t> &trap_ids,
vector<sai_hostif_trap_type_t> &add_trap_ids,
Expand Down Expand Up @@ -1183,15 +1223,18 @@ bool CoppOrch::bindTrapCounter(sai_object_id_t hostif_trap_id, sai_hostif_trap_t

// Update COUNTERS_TRAP_NAME_MAP
auto trap_name = get_trap_name_by_type(trap_type);
FieldValueTuple tuple(trap_name, sai_serialize_object_id(counter_id));
vector<FieldValueTuple> fields;
fields.push_back(tuple);
m_counter_table->set("", fields);

// Update FLEX_COUNTER table
std::unordered_set<std::string> counter_stats;
FlowCounterHandler::getGenericCounterStatIdList(counter_stats);
m_trap_counter_manager.setCounterIdList(counter_id, CounterType::HOSTIF_TRAP, counter_stats);
vector<FieldValueTuple> nameMapFvs;
nameMapFvs.emplace_back(trap_name, sai_serialize_object_id(counter_id));
m_counter_table->set("", nameMapFvs);

auto was_empty = m_pendingAddToFlexCntr.empty();
m_pendingAddToFlexCntr[counter_id] = trap_name;

if (was_empty)
{
m_FlexCounterUpdTimer->start();
}

m_trap_obj_name_map.emplace(hostif_trap_id, trap_name);
return true;
}
Expand All @@ -1210,7 +1253,15 @@ void CoppOrch::unbindTrapCounter(sai_object_id_t hostif_trap_id)
// Clear FLEX_COUNTER table
sai_object_id_t counter_id;
sai_deserialize_object_id(counter_oid_str, counter_id);
m_trap_counter_manager.clearCounterIdList(counter_id);
auto update_iter = m_pendingAddToFlexCntr.find(counter_id);
if (update_iter == m_pendingAddToFlexCntr.end())
{
m_trap_counter_manager.clearCounterIdList(counter_id);
}
else
{
m_pendingAddToFlexCntr.erase(update_iter);
}

// Remove trap from COUNTERS_TRAP_NAME_MAP
m_counter_table->hdel("", iter->second);
Expand Down
9 changes: 8 additions & 1 deletion orchagent/copporch.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "flex_counter_manager.h"
#include "producertable.h"
#include "table.h"
#include "selectabletimer.h"

using namespace swss;

Expand Down Expand Up @@ -74,16 +75,21 @@ class CoppOrch : public Orch
TrapIdHostIfTableMap m_trapid_hostif_table_map;
TrapGroupTrapIdAttribs m_trap_group_trap_id_attrs;
TrapObjectTrapNameMap m_trap_obj_name_map;
std::map<sai_object_id_t, std::string> m_pendingAddToFlexCntr;

std::shared_ptr<DBConnector> m_counter_db;
std::shared_ptr<DBConnector> m_flex_db;
std::shared_ptr<DBConnector> m_asic_db;
std::unique_ptr<Table> m_counter_table;
std::unique_ptr<Table> m_vidToRidTable;
std::unique_ptr<ProducerTable> m_flex_counter_group_table;

FlexCounterManager m_trap_counter_manager;

bool m_trap_rate_plugin_loaded = false;

SelectableTimer* m_FlexCounterUpdTimer = nullptr;

void initDefaultHostIntfTable();
void initDefaultTrapGroup();
void initDefaultTrapIds();
Expand All @@ -107,7 +113,7 @@ class CoppOrch : public Orch
std::vector<sai_hostif_trap_type_t> &add_trap_ids,
std::vector<sai_hostif_trap_type_t> &rem_trap_ids);

void getTrapIdsFromTrapGroup (sai_object_id_t trap_group_obj,
void getTrapIdsFromTrapGroup (sai_object_id_t trap_group_obj,
std::vector<sai_hostif_trap_type_t> &trap_ids);

bool trapGroupProcessTrapIdChange (std::string trap_group_name,
Expand All @@ -130,6 +136,7 @@ class CoppOrch : public Orch
void unbindTrapCounter(sai_object_id_t hostif_trap_id);

virtual void doTask(Consumer& consumer);
void doTask(swss::SelectableTimer&) override;
};
#endif /* SWSS_COPPORCH_H */

0 comments on commit 43c6e3c

Please sign in to comment.