diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 46474bdb..b7be9401 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -1705,6 +1705,7 @@ class DashMeterCounterContext : public BaseCounterContext if (m_switchId == 0UL) { m_switchId = m_vendorSai->switchIdQuery(rid); + m_switchVid = VidManager::switchIdQuery(vid); } if (m_meterBucketsPerEni == 0) @@ -1766,7 +1767,9 @@ class DashMeterCounterContext : public BaseCounterContext swss::RedisPipeline pipeline(&db); swss::Table countersTable(&pipeline, COUNTERS_TABLE, true); for (const auto& object_key: it->second.object_keys) { - countersTable.del(sai_serialize_meter_bucket_entry(object_key.key.meter_bucket_entry)); + auto meter_bucket_entry = + meterBucketRidToVid(object_key.key.meter_bucket_entry, vid); + countersTable.del(sai_serialize_meter_bucket_entry(meter_bucket_entry)); } // remove from flex counter poll m_bulkMeterContexts.erase(it); @@ -1799,7 +1802,10 @@ class DashMeterCounterContext : public BaseCounterContext idStrings.reserve(m_meterBucketsPerEni); for (uint32_t i = 0; i < m_meterBucketsPerEni; ++i) { - idStrings.push_back(sai_serialize_meter_bucket_entry(ctx.object_keys[i].key.meter_bucket_entry)); + auto meter_bucket_entry = + meterBucketRidToVid(ctx.object_keys[i].key.meter_bucket_entry, + ctx.eni_vid); + idStrings.push_back(sai_serialize_meter_bucket_entry(meter_bucket_entry)); } std::for_each(m_plugins.begin(), m_plugins.end(), @@ -1893,7 +1899,10 @@ class DashMeterCounterContext : public BaseCounterContext { values.emplace_back(serializeStat(ctx.counter_ids[j]), std::to_string(ctx.counters[i * ctx.counter_ids.size() + j])); } - countersTable.set(sai_serialize_meter_bucket_entry(ctx.object_keys[i].key.meter_bucket_entry), values, ""); + auto meter_bucket_entry = + meterBucketRidToVid(ctx.object_keys[i].key.meter_bucket_entry, + ctx.eni_vid); + countersTable.set(sai_serialize_meter_bucket_entry(meter_bucket_entry), values, ""); values.clear(); } return true; @@ -2035,6 +2044,16 @@ class DashMeterCounterContext : public BaseCounterContext m_bulkMeterContexts.emplace(vid, makeBulkMeterContext(vid, rid)); } + sai_meter_bucket_entry_t meterBucketRidToVid( + const sai_meter_bucket_entry_t& in_entry, sai_object_id_t eniVid) + { + SWSS_LOG_ENTER(); + auto out_entry = in_entry; + out_entry.eni_id = eniVid; + out_entry.switch_id = m_switchVid; + return out_entry; + } + std::map m_bulkMeterContexts; std::vector m_supportedMeterCounters; sai_object_type_t m_objectType = (sai_object_type_t) SAI_OBJECT_TYPE_METER_BUCKET_ENTRY; @@ -2042,6 +2061,7 @@ class DashMeterCounterContext : public BaseCounterContext sairedis::SaiInterface *m_vendorSai; sai_stats_mode_t m_groupStatsMode = SAI_STATS_MODE_READ; sai_object_id_t m_switchId = 0UL; + sai_object_id_t m_switchVid = 0UL; uint32_t m_meterBucketsPerEni = 0; bool m_initalized = false; }; diff --git a/unittest/syncd/TestFlexCounter.cpp b/unittest/syncd/TestFlexCounter.cpp index 1a2ffd04..e6ec9c0f 100644 --- a/unittest/syncd/TestFlexCounter.cpp +++ b/unittest/syncd/TestFlexCounter.cpp @@ -3,6 +3,7 @@ #include "MockableSaiInterface.h" #include "MockHelper.h" #include "VirtualObjectIdManager.h" +#include "VidManager.h" #include "NumberOidIndexGenerator.h" #include #include @@ -1840,9 +1841,10 @@ TEST(FlexCounter, addRemoveDashMeterCounter) auto counterVerifyFunc = [] (swss::Table &countersTable, sai_object_id_t eni_id, const std::vector& counterIdNames, const dash_meter_expected_val_t& expectedValues) { std::string value; + auto switchVid = VidManager::switchIdQuery(eni_id); for (uint32_t i = 0; i < (expectedValues.size()/counterIdNames.size()); i++) { - auto entry_key = sai_meter_bucket_entry_t {.switch_id = 0, .eni_id = eni_id, + auto entry_key = sai_meter_bucket_entry_t {.switch_id = switchVid, .eni_id = eni_id, .meter_class = (i*100) + 1}; auto key = sai_serialize_meter_bucket_entry(entry_key); for (size_t j = 0; j < 2; ++j) {