Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

In S3 and SIEVE, don't evict when updating an entry #201

Closed
masklinn opened this issue Mar 16, 2024 · 0 comments · Fixed by #204
Closed

In S3 and SIEVE, don't evict when updating an entry #201

masklinn opened this issue Mar 16, 2024 · 0 comments · Fixed by #204
Milestone

Comments

@masklinn
Copy link
Contributor

The caching protocol is such that to update a partial result with more domains it has to be re-set.

While the LRU implementation evicts after insertion, the S3 and SIEVE insertions first make room for an entry, then insert the new entry.

For partial entry this is unnecessary, and can create odd states where there are multiple entries in the fifo with different data but the same key. Instead, since the cache entries are mutable (unlike the results) the value should simply be updated in place. The hit has already been recorded since the __getitem__ which retrieved the partial entry.

Beware: in S3, do not confuse a cache hit with a ghost cache hit, the second should not suppress the insertion.

@masklinn masklinn added this to the 1.0 milestone Mar 26, 2024
masklinn added a commit to masklinn/uap-python that referenced this issue Mar 26, 2024
`*Result` objects are immutable, thus if a `PartialResult` gets filled
further it has to be re-set into the cache.

This does not change the cache size, but because the current S3 and
SIEVE implementations unconditionally check the cache size on
`__setitem__` they may evict an entry unnecessarily.

Fix that: if there is already a valid cache entry for the key, just
update it in place instead of trying to evict then creating a brand
new entry.

Also update the LRU to pre-check for size (and presence as well), this
may make setting a bit more expensive than post-check but it avoids
"wronging" the user by bypassing the limit they set.

Fixes ua-parser#201
masklinn added a commit that referenced this issue Mar 26, 2024
`*Result` objects are immutable, thus if a `PartialResult` gets filled
further it has to be re-set into the cache.

This does not change the cache size, but because the current S3 and
SIEVE implementations unconditionally check the cache size on
`__setitem__` they may evict an entry unnecessarily.

Fix that: if there is already a valid cache entry for the key, just
update it in place instead of trying to evict then creating a brand
new entry.

Also update the LRU to pre-check for size (and presence as well), this
may make setting a bit more expensive than post-check but it avoids
"wronging" the user by bypassing the limit they set.

Fixes #201
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 a pull request may close this issue.

1 participant