Skip to content

Commit 4eabca4

Browse files
Do not try to get data for deleted keys.
1 parent be425ed commit 4eabca4

File tree

2 files changed

+39
-13
lines changed

2 files changed

+39
-13
lines changed

common/configdb.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,11 @@ class ConfigDBConnector_Native : public SonicV2Connector_Native
105105
try:
106106
(table, row) = key.split(self.TABLE_NAME_SEPARATOR, 1)
107107
if table in self.handlers:
108-
client = self.get_redis_client(self.db_name)
109-
data = self.raw_to_typed(client.hgetall(key))
108+
if item['data'] == 'del':
109+
data = None
110+
else:
111+
client = self.get_redis_client(self.db_name)
112+
data = self.raw_to_typed(client.hgetall(key))
110113
if table in init_data and row in init_data[table]:
111114
cache_hit = init_data[table][row] == data
112115
del init_data[table][row]

tests/test_redis_ut.py

+34-11
Original file line numberDiff line numberDiff line change
@@ -634,29 +634,40 @@ def thread_coming_entry():
634634
def test_ConfigDBInit():
635635
table_name_1 = 'TEST_TABLE_1'
636636
table_name_2 = 'TEST_TABLE_2'
637+
table_name_3 = 'TEST_TABLE_3'
637638
test_key = 'key1'
638639
test_data = {'field1': 'value1'}
639-
test_data_update = {'field1': 'value2'}
640+
641+
queue = multiprocessing.Queue()
640642

641643
manager = multiprocessing.Manager()
642644
ret_data = manager.dict()
643645

644-
def test_handler(table, key, data, ret):
645-
ret[table] = {key: data}
646+
def test_handler(table, key, data, ret, q=None):
647+
if data is None:
648+
ret[table] = {k: v for k, v in ret[table].items() if k != key}
649+
else:
650+
ret[table] = {key: data}
651+
652+
if q:
653+
q.put(ret[table])
646654

647-
def test_init_handler(data, ret):
655+
def test_init_handler(data, ret, queue):
648656
ret.update(data)
657+
queue.put(ret)
649658

650-
def thread_listen(ret):
659+
def thread_listen(ret, queue):
651660
config_db = ConfigDBConnector()
652661
config_db.connect(wait_for_init=False)
653662

654663
config_db.subscribe(table_name_1, lambda table, key, data: test_handler(table, key, data, ret),
655664
fire_init_data=False)
656665
config_db.subscribe(table_name_2, lambda table, key, data: test_handler(table, key, data, ret),
657666
fire_init_data=True)
667+
config_db.subscribe(table_name_3, lambda table, key, data: test_handler(table, key, data, ret, queue),
668+
fire_init_data=False)
658669

659-
config_db.listen(init_data_handler=lambda data: test_init_handler(data, ret))
670+
config_db.listen(init_data_handler=lambda data: test_init_handler(data, ret, queue))
660671

661672
config_db = ConfigDBConnector()
662673
config_db.connect(wait_for_init=False)
@@ -666,14 +677,26 @@ def thread_listen(ret):
666677
# Init table data
667678
config_db.set_entry(table_name_1, test_key, test_data)
668679
config_db.set_entry(table_name_2, test_key, test_data)
680+
config_db.set_entry(table_name_3, test_key, {})
669681

670-
thread = multiprocessing.Process(target=thread_listen, args=(ret_data,))
682+
thread = multiprocessing.Process(target=thread_listen, args=(ret_data, queue))
671683
thread.start()
672-
time.sleep(5)
673-
thread.terminate()
674684

675-
assert ret_data[table_name_1] == {test_key: test_data}
676-
assert ret_data[table_name_2] == {test_key: test_data}
685+
init_data = queue.get(5)
686+
687+
# Verify that all tables initialized correctly
688+
assert init_data[table_name_1] == {test_key: test_data}
689+
assert init_data[table_name_2] == {test_key: test_data}
690+
assert init_data[table_name_3] == {test_key: {}}
691+
692+
# Remove the entry (with no attributes) from the table.
693+
# Verify that the update is received and a callback is called
694+
config_db.set_entry(table_name_3, test_key, None)
695+
696+
table_3_data = queue.get(5)
697+
assert test_key not in table_3_data
698+
699+
thread.terminate()
677700

678701

679702
def test_DBConnectFailure():

0 commit comments

Comments
 (0)