Skip to content

Commit

Permalink
Optimize orch performance by pops() (#312)
Browse files Browse the repository at this point in the history
* Consumer batch pops

* Rename variables
  • Loading branch information
qiluo-msft authored Sep 19, 2017
1 parent 345f3f1 commit 6334d57
Showing 1 changed file with 38 additions and 34 deletions.
72 changes: 38 additions & 34 deletions orchagent/orch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<KeyOpFieldsValuesTuple> 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())
Expand Down

0 comments on commit 6334d57

Please sign in to comment.