From f5a8dc51b1380d102cd03dbf07db7d143c0cb6fd Mon Sep 17 00:00:00 2001 From: Stephen Sun Date: Mon, 13 Jan 2025 01:26:03 +0000 Subject: [PATCH] Avoid erasing an element from a loop iterating the map Signed-off-by: Stephen Sun --- syncd/FlexCounter.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 26d155be9..472c17327 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -1113,6 +1113,7 @@ class CounterContext : public BaseCounterContext _In_ sai_object_id_t vid) { SWSS_LOG_ENTER(); + std::set> bulkContextsToBeRemoved; bool found = false; for (auto iter = m_bulkContexts.begin(); iter != m_bulkContexts.end(); iter++) { @@ -1127,7 +1128,9 @@ class CounterContext : public BaseCounterContext ctx.object_vids.erase(vid_iter); if (ctx.object_vids.empty()) { - m_bulkContexts.erase(iter); + // It can change the order of the map to erase an element in a loop iterating the map + // which can cause some elements to be skipped or iterated for multiple times + bulkContextsToBeRemoved.insert(iter->first); } else { @@ -1148,6 +1151,11 @@ class CounterContext : public BaseCounterContext } } + for (auto iter : bulkContextsToBeRemoved) + { + m_bulkContexts.erase(iter); + } + return found; }