Skip to content

Commit 8e87cd9

Browse files
committed
[Buffermgr]Graceful handling of buffer model change
1 parent da49332 commit 8e87cd9

4 files changed

Lines changed: 68 additions & 1 deletion

File tree

cfgmgr/buffermgr.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ BufferMgr::BufferMgr(DBConnector *cfgDb, DBConnector *applDb, string pg_lookup_f
3030
m_applBufferEgressProfileListTable(applDb, APP_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME)
3131
{
3232
readPgProfileLookupFile(pg_lookup_file);
33+
dynamic_buffer_model = false;
3334
}
3435

3536
//# speed, cable, size, xon, xoff, threshold, xon_offset
@@ -273,12 +274,62 @@ void BufferMgr::doBufferTableTask(Consumer &consumer, ProducerStateTable &applTa
273274
}
274275
}
275276

277+
void BufferMgr::doBufferMetaTask(Consumer &consumer)
278+
{
279+
SWSS_LOG_ENTER();
280+
281+
auto it = consumer.m_toSync.begin();
282+
while (it != consumer.m_toSync.end())
283+
{
284+
KeyOpFieldsValuesTuple t = it->second;
285+
string key = kfvKey(t);
286+
287+
string op = kfvOp(t);
288+
if (op == SET_COMMAND)
289+
{
290+
vector<FieldValueTuple> fvVector;
291+
292+
for (auto i : kfvFieldsValues(t))
293+
{
294+
if (fvField(i) == "buffer_model")
295+
{
296+
if (fvValue(i) == "dynamic")
297+
{
298+
dynamic_buffer_model = true;
299+
}
300+
else
301+
{
302+
dynamic_buffer_model = false;
303+
}
304+
break;
305+
}
306+
}
307+
}
308+
else if (op == DEL_COMMAND)
309+
{
310+
dynamic_buffer_model = false;
311+
}
312+
it = consumer.m_toSync.erase(it);
313+
}
314+
}
315+
276316
void BufferMgr::doTask(Consumer &consumer)
277317
{
278318
SWSS_LOG_ENTER();
279319

280320
string table_name = consumer.getTableName();
281321

322+
if (table_name == CFG_DEVICE_METADATA_TABLE_NAME)
323+
{
324+
doBufferMetaTask(consumer);
325+
return;
326+
}
327+
328+
if (dynamic_buffer_model)
329+
{
330+
SWSS_LOG_DEBUG("Dynamic buffer model enabled. Skipping further processing");
331+
return;
332+
}
282333
if (table_name == CFG_BUFFER_POOL_TABLE_NAME)
283334
{
284335
doBufferTableTask(consumer, m_applBufferPoolTable);

cfgmgr/buffermgr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class BufferMgr : public Orch
5050
ProducerStateTable m_applBufferEgressProfileListTable;
5151

5252
bool m_pgfile_processed;
53+
bool dynamic_buffer_model;
5354

5455
pg_profile_lookup_t m_pgProfileLookup;
5556
port_cable_length_t m_cableLenLookup;
@@ -63,6 +64,7 @@ class BufferMgr : public Orch
6364
void transformSeperator(std::string &name);
6465

6566
void doTask(Consumer &consumer);
67+
void doBufferMetaTask(Consumer &consumer);
6668
};
6769

6870
}

cfgmgr/buffermgrd.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ int main(int argc, char **argv)
195195
CFG_BUFFER_PG_TABLE_NAME,
196196
CFG_BUFFER_QUEUE_TABLE_NAME,
197197
CFG_BUFFER_PORT_INGRESS_PROFILE_LIST_NAME,
198-
CFG_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME
198+
CFG_BUFFER_PORT_EGRESS_PROFILE_LIST_NAME,
199+
CFG_DEVICE_METADATA_TABLE_NAME
199200
};
200201
cfgOrchList.emplace_back(new BufferMgr(&cfgDb, &applDb, pg_lookup_file, cfg_buffer_tables));
201202
}

tests/test_buffer_mode.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
import pytest
2+
import time
23

34
class TestBufferModel(object):
45
def test_bufferModel(self, dvs, testlog):
56
config_db = dvs.get_config_db()
67
metadata = config_db.get_entry("DEVICE_METADATA", "localhost")
78
assert metadata["buffer_model"] == "traditional"
9+
10+
def test_update_bufferModel(self, dvs, testlog):
11+
config_db = dvs.get_config_db()
12+
app_db = dvs.get_app_db()
13+
keys = app_db.get_keys("BUFFER_POOL_TABLE")
14+
num_keys = len(keys)
15+
fvs = {'buffer_model' : 'dynamic'}
16+
config_db.update_entry("DEVICE_METADATA", "localhost", fvs)
17+
fvs = {'mode':'dynamic', 'type':'egress'}
18+
config_db.update_entry("BUFFER_POOL", "temp_pool", fvs)
19+
time.sleep(2)
20+
app_db.wait_for_n_keys("BUFFER_POOL_TABLE", num_keys)

0 commit comments

Comments
 (0)