From 7ddb0ab481f7463a22eeec9c02d387b8dfea64cf Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Thu, 21 Oct 2021 04:25:40 +0000 Subject: [PATCH] Addressing code review comments --- orchagent/vxlanorch.cpp | 69 ++++++++++++++++++++++++++++------------- orchagent/vxlanorch.h | 6 ++++ 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/orchagent/vxlanorch.cpp b/orchagent/vxlanorch.cpp index 3a47fcd15e..6888f61df3 100644 --- a/orchagent/vxlanorch.cpp +++ b/orchagent/vxlanorch.cpp @@ -29,6 +29,8 @@ extern PortsOrch* gPortsOrch; extern sai_object_id_t gUnderlayIfId; extern FlexManagerDirectory g_FlexManagerDirectory; +#define FLEX_COUNTER_UPD_INTERVAL 1 + const map vxlanTunnelMap = { { MAP_T::VNI_TO_VLAN_ID, SAI_TUNNEL_MAP_TYPE_VNI_TO_VLAN_ID }, @@ -1190,6 +1192,7 @@ VxlanTunnelOrch::VxlanTunnelOrch(DBConnector *statedb, DBConnector *db, const st FieldValueTuple fv; string tunnel_rate_plugin = "tunnel_rates.lua"; m_counter_db = shared_ptr(new DBConnector("COUNTERS_DB", 0)); + m_asic_db = shared_ptr(new DBConnector("ASIC_DB", 0)); try { string tunnel_rate_script = swss::loadLuaScript(tunnel_rate_plugin); @@ -1207,28 +1210,53 @@ VxlanTunnelOrch::VxlanTunnelOrch(DBConnector *statedb, DBConnector *db, const st m_tunnelNameTable = unique_ptr(new Table(m_counter_db.get(), COUNTERS_TUNNEL_NAME_MAP)); m_tunnelTypeTable = unique_ptr
(new Table(m_counter_db.get(), COUNTERS_TUNNEL_TYPE_MAP)); + m_vidToRidTable = unique_ptr
(new Table(m_asic_db.get(), "VIDTORID")); + + 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); } -void VxlanTunnelOrch::addTunnelToFlexCounter(sai_object_id_t oid, const string &name) +void VxlanTunnelOrch::doTask(SelectableTimer &timer) { SWSS_LOG_ENTER(); - string type = "SAI_TUNNEL_TYPE_VXLAN"; - string sai_oid = sai_serialize_object_id(oid); - vector tunnelNameFvs; - vector tunnelTypeFvs; + SWSS_LOG_DEBUG("Registering %" PRId64 " new tunnels", m_pendingAddToFlexCntr.size()); + for (auto it = m_pendingAddToFlexCntr.begin(); it != m_pendingAddToFlexCntr.end(); ) + { + string value; + 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()); + vector tunnelNameFvs; + vector tunnelTypeFvs; + string type = "SAI_TUNNEL_TYPE_VXLAN"; + + tunnelNameFvs.emplace_back(it->second, id); + tunnelTypeFvs.emplace_back(id, type); - tunnelNameFvs.emplace_back(name, sai_oid); - tunnelTypeFvs.emplace_back(sai_oid, type); + m_tunnelNameTable->set("", tunnelNameFvs); + m_tunnelTypeTable->set("", tunnelTypeFvs); + auto tunnel_stats = generateTunnelCounterStats(); - m_tunnelNameTable->set("", tunnelNameFvs); - m_tunnelTypeTable->set("", tunnelTypeFvs); + tunnel_stat_manager->setCounterIdList(it->first, CounterType::TUNNEL, + tunnel_stats); + it = m_pendingAddToFlexCntr.erase(it); + } + else + { + ++it; + } + } +} - auto tunnel_stats = generateTunnelCounterStats(); - tunnel_stat_manager->setCounterIdList(oid, CounterType::TUNNEL, - tunnel_stats); - SWSS_LOG_DEBUG("Registered tunnel %s to Flex counter", name.c_str()); +void VxlanTunnelOrch::addTunnelToFlexCounter(sai_object_id_t oid, const string &name) +{ + m_pendingAddToFlexCntr[oid] = name; } void VxlanTunnelOrch::removeTunnelFromFlexCounter(sai_object_id_t oid, const string &name) @@ -1241,6 +1269,12 @@ void VxlanTunnelOrch::removeTunnelFromFlexCounter(sai_object_id_t oid, const str return; } + if (m_pendingAddToFlexCntr.find(oid) != m_pendingAddToFlexCntr.end()) + { + m_pendingAddToFlexCntr.erase(oid); + return; + } + string sai_oid = sai_serialize_object_id(oid); m_tunnelNameTable->hdel("", name); @@ -1267,14 +1301,7 @@ void VxlanTunnelOrch::generateTunnelCounterMap() return; } - for (const auto& it: vxlan_tunnel_table_) - { - auto tunnel_id = it.second.get()->getTunnelId(); - if (tunnel_id != SAI_NULL_OBJECT_ID) - { - addTunnelToFlexCounter(it.second.get()->getTunnelId(), it.second.get()->getTunnelName()); - } - } + m_FlexCounterUpdTimer->start(); m_isTunnelCounterMapGenerated = true; } diff --git a/orchagent/vxlanorch.h b/orchagent/vxlanorch.h index d6b9eece8d..6082d4e4b7 100644 --- a/orchagent/vxlanorch.h +++ b/orchagent/vxlanorch.h @@ -7,6 +7,7 @@ #include "request_parser.h" #include "portsorch.h" #include "vrforch.h" +#include "timer.h" enum class MAP_T { @@ -345,18 +346,23 @@ class VxlanTunnelOrch : public Orch2 private: virtual bool addOperation(const Request& request); virtual bool delOperation(const Request& request); + void doTask(swss::SelectableTimer&); VxlanTunnelTable vxlan_tunnel_table_; VxlanTunnelRequest request_; VxlanVniVlanMapTable vxlan_vni_vlan_map_table_; VTEPTable vtep_table_; Table m_stateVxlanTable; + std::map m_pendingAddToFlexCntr; FlexCounterManager vxlan_tunnel_stat_manager; bool m_isTunnelCounterMapGenerated = false; FlexCounterManager *tunnel_stat_manager; unique_ptr
m_tunnelNameTable; unique_ptr
m_tunnelTypeTable; + unique_ptr
m_vidToRidTable; shared_ptr m_counter_db; + shared_ptr m_asic_db; + SelectableTimer* m_FlexCounterUpdTimer = nullptr; }; const request_description_t vxlan_tunnel_map_request_description = {