Skip to content

Commit 91e7a27

Browse files
[buffers] Add handler for the 'create_only_config_db_buffers' configuration knob (#2883)
* [buffers] Add handler for "create_only_config_db_buffers" configuration knob If the "create_only_config_db_buffers" is equal to "true" - buffers will be created according to the config_db configuration (for example BUFFER_QUEUE|* table). If the "create_only_config_db_buffers" is equal to "false" or does not exist - the maximum available buffers (which are read from SAI) will be created, regardless of the config_db buffer config.
1 parent 7f7bc33 commit 91e7a27

File tree

5 files changed

+169
-6
lines changed

5 files changed

+169
-6
lines changed

orchagent/flexcounterorch.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ FlexCounterOrch::FlexCounterOrch(DBConnector *db, vector<string> &tableNames):
6767
m_flexCounterConfigTable(db, CFG_FLEX_COUNTER_TABLE_NAME),
6868
m_bufferQueueConfigTable(db, CFG_BUFFER_QUEUE_TABLE_NAME),
6969
m_bufferPgConfigTable(db, CFG_BUFFER_PG_TABLE_NAME),
70+
m_deviceMetadataConfigTable(db, CFG_DEVICE_METADATA_TABLE_NAME),
7071
m_flexCounterDb(new DBConnector("FLEX_COUNTER_DB", 0)),
7172
m_flexCounterGroupTable(new ProducerTable(m_flexCounterDb.get(), FLEX_COUNTER_GROUP_TABLE)),
7273
m_gbflexCounterDb(new DBConnector("GB_FLEX_COUNTER_DB", 0)),
@@ -328,11 +329,41 @@ bool FlexCounterOrch::bake()
328329
return consumer->addToSync(entries);
329330
}
330331

332+
static bool isCreateOnlyConfigDbBuffers(Table& deviceMetadataConfigTable)
333+
{
334+
std::string createOnlyConfigDbBuffersValue;
335+
336+
try
337+
{
338+
if (deviceMetadataConfigTable.hget("localhost", "create_only_config_db_buffers", createOnlyConfigDbBuffersValue))
339+
{
340+
if (createOnlyConfigDbBuffersValue == "true")
341+
{
342+
return true;
343+
}
344+
}
345+
}
346+
catch(const std::system_error& e)
347+
{
348+
SWSS_LOG_ERROR("System error: %s", e.what());
349+
}
350+
351+
return false;
352+
}
353+
331354
map<string, FlexCounterQueueStates> FlexCounterOrch::getQueueConfigurations()
332355
{
333356
SWSS_LOG_ENTER();
334357

335358
map<string, FlexCounterQueueStates> queuesStateVector;
359+
360+
if (!isCreateOnlyConfigDbBuffers(m_deviceMetadataConfigTable))
361+
{
362+
FlexCounterQueueStates flexCounterQueueState(0);
363+
queuesStateVector.insert(make_pair(createAllAvailableBuffersStr, flexCounterQueueState));
364+
return queuesStateVector;
365+
}
366+
336367
std::vector<std::string> portQueueKeys;
337368
m_bufferQueueConfigTable.getKeys(portQueueKeys);
338369

@@ -387,6 +418,14 @@ map<string, FlexCounterPgStates> FlexCounterOrch::getPgConfigurations()
387418
SWSS_LOG_ENTER();
388419

389420
map<string, FlexCounterPgStates> pgsStateVector;
421+
422+
if (!isCreateOnlyConfigDbBuffers(m_deviceMetadataConfigTable))
423+
{
424+
FlexCounterPgStates flexCounterPgState(0);
425+
pgsStateVector.insert(make_pair(createAllAvailableBuffersStr, flexCounterPgState));
426+
return pgsStateVector;
427+
}
428+
390429
std::vector<std::string> portPgKeys;
391430
m_bufferPgConfigTable.getKeys(portPgKeys);
392431

orchagent/flexcounterorch.h

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ extern "C" {
1010
#include "sai.h"
1111
}
1212

13+
const std::string createAllAvailableBuffersStr = "create_all_available_buffers";
14+
1315
class FlexCounterQueueStates
1416
{
1517
public:
@@ -68,6 +70,7 @@ class FlexCounterOrch: public Orch
6870
Table m_flexCounterConfigTable;
6971
Table m_bufferQueueConfigTable;
7072
Table m_bufferPgConfigTable;
73+
Table m_deviceMetadataConfigTable;
7174
};
7275

7376
#endif

orchagent/p4orch/tests/fake_flexcounterorch.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ FlexCounterOrch::FlexCounterOrch(swss::DBConnector *db, std::vector<std::string>
55
Orch(db, tableNames),
66
m_flexCounterConfigTable(db, CFG_FLEX_COUNTER_TABLE_NAME),
77
m_bufferQueueConfigTable(db, CFG_BUFFER_QUEUE_TABLE_NAME),
8-
m_bufferPgConfigTable(db, CFG_BUFFER_PG_TABLE_NAME)
8+
m_bufferPgConfigTable(db, CFG_BUFFER_PG_TABLE_NAME),
9+
m_deviceMetadataConfigTable(db, CFG_DEVICE_METADATA_TABLE_NAME)
910
{
1011
}
1112

orchagent/portsorch.cpp

+72
Original file line numberDiff line numberDiff line change
@@ -6333,6 +6333,14 @@ void PortsOrch::generateQueueMap(map<string, FlexCounterQueueStates> queuesState
63336333
return;
63346334
}
63356335

6336+
bool isCreateAllQueues = false;
6337+
6338+
if (queuesStateVector.count(createAllAvailableBuffersStr))
6339+
{
6340+
isCreateAllQueues = true;
6341+
queuesStateVector.clear();
6342+
}
6343+
63366344
for (const auto& it: m_portList)
63376345
{
63386346
if (it.second.m_type == Port::PHY)
@@ -6341,6 +6349,10 @@ void PortsOrch::generateQueueMap(map<string, FlexCounterQueueStates> queuesState
63416349
{
63426350
auto maxQueueNumber = getNumberOfPortSupportedQueueCounters(it.second.m_alias);
63436351
FlexCounterQueueStates flexCounterQueueState(maxQueueNumber);
6352+
if (isCreateAllQueues)
6353+
{
6354+
flexCounterQueueState.enableQueueCounters(0, maxQueueNumber - 1);
6355+
}
63446356
queuesStateVector.insert(make_pair(it.second.m_alias, flexCounterQueueState));
63456357
}
63466358
generateQueueMapPerPort(it.second, queuesStateVector.at(it.second.m_alias), false);
@@ -6459,6 +6471,14 @@ void PortsOrch::addQueueFlexCounters(map<string, FlexCounterQueueStates> queuesS
64596471
return;
64606472
}
64616473

6474+
bool isCreateAllQueues = false;
6475+
6476+
if (queuesStateVector.count(createAllAvailableBuffersStr))
6477+
{
6478+
isCreateAllQueues = true;
6479+
queuesStateVector.clear();
6480+
}
6481+
64626482
for (const auto& it: m_portList)
64636483
{
64646484
if (it.second.m_type == Port::PHY)
@@ -6467,6 +6487,10 @@ void PortsOrch::addQueueFlexCounters(map<string, FlexCounterQueueStates> queuesS
64676487
{
64686488
auto maxQueueNumber = getNumberOfPortSupportedQueueCounters(it.second.m_alias);
64696489
FlexCounterQueueStates flexCounterQueueState(maxQueueNumber);
6490+
if (isCreateAllQueues)
6491+
{
6492+
flexCounterQueueState.enableQueueCounters(0, maxQueueNumber - 1);
6493+
}
64706494
queuesStateVector.insert(make_pair(it.second.m_alias, flexCounterQueueState));
64716495
}
64726496
addQueueFlexCountersPerPort(it.second, queuesStateVector.at(it.second.m_alias));
@@ -6524,6 +6548,14 @@ void PortsOrch::addQueueWatermarkFlexCounters(map<string, FlexCounterQueueStates
65246548
return;
65256549
}
65266550

6551+
bool isCreateAllQueues = false;
6552+
6553+
if (queuesStateVector.count(createAllAvailableBuffersStr))
6554+
{
6555+
isCreateAllQueues = true;
6556+
queuesStateVector.clear();
6557+
}
6558+
65276559
for (const auto& it: m_portList)
65286560
{
65296561
if (it.second.m_type == Port::PHY)
@@ -6532,6 +6564,10 @@ void PortsOrch::addQueueWatermarkFlexCounters(map<string, FlexCounterQueueStates
65326564
{
65336565
auto maxQueueNumber = getNumberOfPortSupportedQueueCounters(it.second.m_alias);
65346566
FlexCounterQueueStates flexCounterQueueState(maxQueueNumber);
6567+
if (isCreateAllQueues)
6568+
{
6569+
flexCounterQueueState.enableQueueCounters(0, maxQueueNumber - 1);
6570+
}
65356571
queuesStateVector.insert(make_pair(it.second.m_alias, flexCounterQueueState));
65366572
}
65376573
addQueueWatermarkFlexCountersPerPort(it.second, queuesStateVector.at(it.second.m_alias));
@@ -6695,6 +6731,14 @@ void PortsOrch::generatePriorityGroupMap(map<string, FlexCounterPgStates> pgsSta
66956731
return;
66966732
}
66976733

6734+
bool isCreateAllPgs = false;
6735+
6736+
if (pgsStateVector.count(createAllAvailableBuffersStr))
6737+
{
6738+
isCreateAllPgs = true;
6739+
pgsStateVector.clear();
6740+
}
6741+
66986742
for (const auto& it: m_portList)
66996743
{
67006744
if (it.second.m_type == Port::PHY)
@@ -6703,6 +6747,10 @@ void PortsOrch::generatePriorityGroupMap(map<string, FlexCounterPgStates> pgsSta
67036747
{
67046748
auto maxPgNumber = getNumberOfPortSupportedPgCounters(it.second.m_alias);
67056749
FlexCounterPgStates flexCounterPgState(maxPgNumber);
6750+
if (isCreateAllPgs)
6751+
{
6752+
flexCounterPgState.enablePgCounters(0, maxPgNumber - 1);
6753+
}
67066754
pgsStateVector.insert(make_pair(it.second.m_alias, flexCounterPgState));
67076755
}
67086756
generatePriorityGroupMapPerPort(it.second, pgsStateVector.at(it.second.m_alias));
@@ -6799,6 +6847,14 @@ void PortsOrch::addPriorityGroupFlexCounters(map<string, FlexCounterPgStates> pg
67996847
return;
68006848
}
68016849

6850+
bool isCreateAllPgs = false;
6851+
6852+
if (pgsStateVector.count(createAllAvailableBuffersStr))
6853+
{
6854+
isCreateAllPgs = true;
6855+
pgsStateVector.clear();
6856+
}
6857+
68026858
for (const auto& it: m_portList)
68036859
{
68046860
if (it.second.m_type == Port::PHY)
@@ -6807,6 +6863,10 @@ void PortsOrch::addPriorityGroupFlexCounters(map<string, FlexCounterPgStates> pg
68076863
{
68086864
auto maxPgNumber = getNumberOfPortSupportedPgCounters(it.second.m_alias);
68096865
FlexCounterPgStates flexCounterPgState(maxPgNumber);
6866+
if (isCreateAllPgs)
6867+
{
6868+
flexCounterPgState.enablePgCounters(0, maxPgNumber - 1);
6869+
}
68106870
pgsStateVector.insert(make_pair(it.second.m_alias, flexCounterPgState));
68116871
}
68126872
addPriorityGroupFlexCountersPerPort(it.second, pgsStateVector.at(it.second.m_alias));
@@ -6856,6 +6916,14 @@ void PortsOrch::addPriorityGroupWatermarkFlexCounters(map<string, FlexCounterPgS
68566916
return;
68576917
}
68586918

6919+
bool isCreateAllPgs = false;
6920+
6921+
if (pgsStateVector.count(createAllAvailableBuffersStr))
6922+
{
6923+
isCreateAllPgs = true;
6924+
pgsStateVector.clear();
6925+
}
6926+
68596927
for (const auto& it: m_portList)
68606928
{
68616929
if (it.second.m_type == Port::PHY)
@@ -6864,6 +6932,10 @@ void PortsOrch::addPriorityGroupWatermarkFlexCounters(map<string, FlexCounterPgS
68646932
{
68656933
auto maxPgNumber = getNumberOfPortSupportedPgCounters(it.second.m_alias);
68666934
FlexCounterPgStates flexCounterPgState(maxPgNumber);
6935+
if (isCreateAllPgs)
6936+
{
6937+
flexCounterPgState.enablePgCounters(0, maxPgNumber - 1);
6938+
}
68676939
pgsStateVector.insert(make_pair(it.second.m_alias, flexCounterPgState));
68686940
}
68696941
addPriorityGroupWatermarkFlexCountersPerPort(it.second, pgsStateVector.at(it.second.m_alias));

tests/test_flex_counters.py

+53-5
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ def set_flex_counter_group_interval(self, key, group, interval):
200200
self.config_db.create_entry("FLEX_COUNTER_TABLE", key, group_stats_entry)
201201
self.wait_for_interval_set(group, interval)
202202

203+
def set_only_config_db_buffers_field(self, value):
204+
fvs = {'create_only_config_db_buffers' : value}
205+
self.config_db.update_entry("DEVICE_METADATA", "localhost", fvs)
206+
203207
@pytest.mark.parametrize("counter_type", counter_group_meta.keys())
204208
def test_flex_counters(self, dvs, counter_type):
205209
"""
@@ -712,19 +716,43 @@ def remove_ip_address(self, interface, ip):
712716
def set_admin_status(self, interface, status):
713717
self.config_db.update_entry("PORT", interface, {"admin_status": status})
714718

719+
@pytest.mark.parametrize('counter_type', [('queue_counter'), ('pg_drop_counter')])
720+
def test_create_only_config_db_buffers_false(self, dvs, counter_type):
721+
"""
722+
Test steps:
723+
1. By default the configuration knob 'create_only_config_db_value' is missing.
724+
2. Get the counter OID for the interface 'Ethernet0:7' from the counters database.
725+
3. Perform assertions based on the 'create_only_config_db_value':
726+
- If 'create_only_config_db_value' is 'false' or does not exist, assert that the counter OID has a valid OID value.
727+
728+
Args:
729+
dvs (object): virtual switch object
730+
counter_type (str): The type of counter being tested
731+
"""
732+
self.setup_dbs(dvs)
733+
meta_data = counter_group_meta[counter_type]
734+
self.set_flex_counter_group_status(meta_data['key'], meta_data['name_map'])
735+
736+
counter_oid = self.counters_db.db_connection.hget(meta_data['name_map'], 'Ethernet0:7')
737+
assert counter_oid is not None, "Counter OID should have a valid OID value when create_only_config_db_value is 'false' or does not exist"
738+
715739
def test_create_remove_buffer_pg_watermark_counter(self, dvs):
716740
"""
717741
Test steps:
718-
1. Enable PG flex counters.
719-
2. Configure new buffer prioriy group for a port
720-
3. Verify counter is automatically created
721-
4. Remove the new buffer prioriy group for the port
722-
5. Verify counter is automatically removed
742+
1. Reset config_db
743+
2. Set 'create_only_config_db_buffers' to 'true'
744+
3. Enable PG flex counters.
745+
4. Configure new buffer prioriy group for a port
746+
5. Verify counter is automatically created
747+
6. Remove the new buffer prioriy group for the port
748+
7. Verify counter is automatically removed
723749
724750
Args:
725751
dvs (object): virtual switch object
726752
"""
753+
dvs.restart()
727754
self.setup_dbs(dvs)
755+
self.set_only_config_db_buffers_field('true')
728756
meta_data = counter_group_meta['pg_watermark_counter']
729757

730758
self.set_flex_counter_group_status(meta_data['key'], meta_data['name_map'])
@@ -737,6 +765,26 @@ def test_create_remove_buffer_pg_watermark_counter(self, dvs):
737765
self.wait_for_buffer_pg_queue_counter(meta_data['name_map'], 'Ethernet0', '1', False)
738766
self.wait_for_id_list_remove(meta_data['group_name'], "Ethernet0", counter_oid)
739767

768+
@pytest.mark.parametrize('counter_type', [('queue_counter'), ('pg_drop_counter')])
769+
def test_create_only_config_db_buffers_true(self, dvs, counter_type):
770+
"""
771+
Test steps:
772+
1. The 'create_only_config_db_buffers' was set to 'true' by previous test.
773+
2. Get the counter OID for the interface 'Ethernet0:7' from the counters database.
774+
3. Perform assertions based on the 'create_only_config_db_value':
775+
- If 'create_only_config_db_value' is 'true', assert that the counter OID is None.
776+
777+
Args:
778+
dvs (object): virtual switch object
779+
counter_type (str): The type of counter being tested
780+
"""
781+
self.setup_dbs(dvs)
782+
meta_data = counter_group_meta[counter_type]
783+
self.set_flex_counter_group_status(meta_data['key'], meta_data['name_map'])
784+
785+
counter_oid = self.counters_db.db_connection.hget(meta_data['name_map'], 'Ethernet0:7')
786+
assert counter_oid is None, "Counter OID should be None when create_only_config_db_value is 'true'"
787+
740788
def test_create_remove_buffer_queue_counter(self, dvs):
741789
"""
742790
Test steps:

0 commit comments

Comments
 (0)