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

Avoid eviction on entry replacement #204

Merged
merged 1 commit into from
Mar 26, 2024

Conversation

masklinn
Copy link
Contributor

*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

`*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 masklinn enabled auto-merge (rebase) March 26, 2024 19:55
@masklinn masklinn merged commit 854c12f into ua-parser:master Mar 26, 2024
29 checks passed
@masklinn masklinn deleted the avoid-unnecessary-evictions branch March 27, 2024 16:30
masklinn added a commit to masklinn/uap-python that referenced this pull request Mar 28, 2024
Partial results are back-filled (new domains added) by re-setting them
in the cache. With a sufficiently incorrect implementation, the cache
can evict entries on that occasion even though it does not need
to (because we're replacing an existing entry).

Exactly that should have been fixed by ua-parser#204, but was not tested at the
time.

Fixes ua-parser#199
@masklinn masklinn mentioned this pull request Mar 28, 2024
masklinn added a commit to masklinn/uap-python that referenced this pull request Mar 30, 2024
Partial results are back-filled (new domains added) by re-setting them
in the cache. With a sufficiently incorrect implementation, the cache
can evict entries on that occasion even though it does not need
to (because we're replacing an existing entry).

Exactly that should have been fixed by ua-parser#204, but was not tested at the
time.

Fixes ua-parser#199
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.

In S3 and SIEVE, don't evict when updating an entry
1 participant