Fix the issue of ignoring callback calls for removed keys.#811
Merged
qiluo-msft merged 5 commits intosonic-net:masterfrom Aug 29, 2023
Merged
Fix the issue of ignoring callback calls for removed keys.#811qiluo-msft merged 5 commits intosonic-net:masterfrom
qiluo-msft merged 5 commits intosonic-net:masterfrom
Conversation
315f8be to
c709e3a
Compare
c709e3a to
4eabca4
Compare
Collaborator
Author
|
This PR is a follow-up of #789 |
Yakiv-Huryk
approved these changes
Aug 10, 2023
qiluo-msft
reviewed
Aug 11, 2023
| 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': |
Contributor
dgsudharsan
approved these changes
Aug 11, 2023
Collaborator
Author
|
/azpw run |
Collaborator
|
/AzurePipelines run |
|
Azure Pipelines successfully started running 1 pipeline(s). |
Collaborator
|
/azp run Azure.sonic-swss-common |
|
Azure Pipelines successfully started running 1 pipeline(s). |
Collaborator
Author
|
/azpw run |
Collaborator
|
/AzurePipelines run |
|
Azure Pipelines successfully started running 1 pipeline(s). |
Collaborator
Author
|
@qiluo-msft kindly reminder. Please review the changes. |
qiluo-msft
approved these changes
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Noneinstead. 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