diff --git a/orchagent/orch.cpp b/orchagent/orch.cpp index 94ba72261f96..f2a27b7ffe24 100644 --- a/orchagent/orch.cpp +++ b/orchagent/orch.cpp @@ -83,54 +83,58 @@ bool Orch::execute(string tableName) } Consumer& consumer = consumer_it->second; - KeyOpFieldsValuesTuple new_data; - consumer.m_consumer->pop(new_data); + std::deque entries; + consumer.m_consumer->pops(entries); - string key = kfvKey(new_data); - string op = kfvOp(new_data); - /* Possible nothing popped, ie. the oparation is already merged with other operations */ - if (op.empty()) + /* Nothing popped */ + if (entries.empty()) { return true; } - /* Record incoming tasks */ - if (gSwssRecord) + for (auto entry: entries) { - recordTuple(consumer, new_data); - } + string key = kfvKey(entry); + string op = kfvOp(entry); - /* If a new task comes or if a DEL task comes, we directly put it into consumer.m_toSync map */ - if (consumer.m_toSync.find(key) == consumer.m_toSync.end() || op == DEL_COMMAND) - { - consumer.m_toSync[key] = new_data; - } - /* If an old task is still there, we combine the old task with new task */ - else - { - KeyOpFieldsValuesTuple existing_data = consumer.m_toSync[key]; + /* Record incoming tasks */ + if (gSwssRecord) + { + recordTuple(consumer, entry); + } - auto new_values = kfvFieldsValues(new_data); - auto existing_values = kfvFieldsValues(existing_data); + /* If a new task comes or if a DEL task comes, we directly put it into consumer.m_toSync map */ + if (consumer.m_toSync.find(key) == consumer.m_toSync.end() || op == DEL_COMMAND) + { + consumer.m_toSync[key] = entry; + } + /* If an old task is still there, we combine the old task with new task */ + else + { + KeyOpFieldsValuesTuple existing_data = consumer.m_toSync[key]; + auto new_values = kfvFieldsValues(entry); + auto existing_values = kfvFieldsValues(existing_data); - for (auto it : new_values) - { - string field = fvField(it); - string value = fvValue(it); - auto iu = existing_values.begin(); - while (iu != existing_values.end()) + for (auto it : new_values) { - string ofield = fvField(*iu); - if (field == ofield) - iu = existing_values.erase(iu); - else - iu++; + string field = fvField(it); + string value = fvValue(it); + + auto iu = existing_values.begin(); + while (iu != existing_values.end()) + { + string ofield = fvField(*iu); + if (field == ofield) + iu = existing_values.erase(iu); + else + iu++; + } + existing_values.push_back(FieldValueTuple(field, value)); } - existing_values.push_back(FieldValueTuple(field, value)); + consumer.m_toSync[key] = KeyOpFieldsValuesTuple(key, op, existing_values); } - consumer.m_toSync[key] = KeyOpFieldsValuesTuple(key, op, existing_values); } if (!consumer.m_toSync.empty())