Skip to content

Fix the issue of ignoring callback calls for removed keys.#811

Merged
qiluo-msft merged 5 commits intosonic-net:masterfrom
oleksandrivantsiv:py-swsscommon
Aug 29, 2023
Merged

Fix the issue of ignoring callback calls for removed keys.#811
qiluo-msft merged 5 commits intosonic-net:masterfrom
oleksandrivantsiv:py-swsscommon

Conversation

@oleksandrivantsiv
Copy link
Collaborator

What I did
Fix the issue of ignoring callback calls for removed keys.

Why I did it
ConfigDBConnector.listen method has a caching mechanism (added in #587 PR) that preloads the DB state before starting. When the notification about the changed key is received the listen method gets key data from the DB (in all cases when the key was added, updated, or removed) and compares the data with the cache. It fires the callback only if data differ from the cache. Otherwise, the callback is ignored.

If the client.hgetall(key) is called for the removed key it returns an empty dictionary ({}). This can be confused with the data of the key with no attributes. For example: {"TABLE": {"KEY": {}}}.

So if preloaded data contains a key with no attributes and the listener method receives a notification about the removal of such key the callback is not called. The listener will simply remove the key from the cache without calling the callback. This leads to the situation when the removal of the key is not handled.

The solution is to get data for the added or updated keys, and for the removed keys use None instead. This will ensure that the comparison with the cache will work as expected.

How I verified it
Compile the package and run the unit test. Unit tests are extended to cover the expected behavior.

Details if related

@oleksandrivantsiv oleksandrivantsiv marked this pull request as ready for review August 9, 2023 23:02
@oleksandrivantsiv
Copy link
Collaborator Author

This PR is a follow-up of #789

if table in self.handlers:
client = self.get_redis_client(self.db_name)
data = self.raw_to_typed(client.hgetall(key))
if item['data'] == 'del':
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

del

Could you add some test cases for hdel?

  1. hdel one field, but there are still remaining fields
  2. hdel the last field, so the whole key disappears.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@qiluo-msft done. Please review

@oleksandrivantsiv
Copy link
Collaborator Author

/azpw run

@mssonicbld
Copy link
Collaborator

/AzurePipelines run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@liat-grozovik
Copy link
Collaborator

/azp run Azure.sonic-swss-common

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@oleksandrivantsiv
Copy link
Collaborator Author

/azpw run

@mssonicbld
Copy link
Collaborator

/AzurePipelines run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@oleksandrivantsiv
Copy link
Collaborator Author

@qiluo-msft kindly reminder. Please review the changes.

@qiluo-msft qiluo-msft merged commit dc14d36 into sonic-net:master Aug 29, 2023
SviatoslavBoichuk pushed a commit to SviatoslavBoichuk/sonic-swss-common that referenced this pull request Sep 7, 2023
…#811)

**What I did**
Fix the issue of ignoring callback calls for removed keys.

**Why I did it**
ConfigDBConnector.listen method has a caching mechanism (added in sonic-net#587 PR) that preloads the DB state before starting. When the notification about the changed key is received the listen method gets key data from the DB (in all cases when the key was added, updated, or removed) and compares the data with the cache. It fires the callback only if data differ from the cache. Otherwise, the callback is ignored. 

If the `client.hgetall(key)` is called for the removed key it returns an empty dictionary (`{}`). This can be confused with the data of the key with no attributes. For example: `{"TABLE": {"KEY": {}}}`. 

So if preloaded data contains a key with no attributes and the listener method receives a notification about the removal of such key the callback is not called. The listener will simply remove the key from the cache without calling the callback. This leads to the situation when the removal of the key is not handled.

The solution is to get data for the added or updated keys, and for the removed keys use `None` instead. This will ensure that the comparison with the cache will work as expected.

**How I verified it**
Compile the package and run the unit test. Unit tests are extended to cover the expected behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants