Skip to content

Fix timestamp unit mismatch in TokenBucket and LeakyBucket clean/1#176

Merged
epinault merged 3 commits intomasterfrom
fix/clean-timestamp-unit-mismatch
Mar 27, 2026
Merged

Fix timestamp unit mismatch in TokenBucket and LeakyBucket clean/1#176
epinault merged 3 commits intomasterfrom
fix/clean-timestamp-unit-mismatch

Conversation

@epinault
Copy link
Copy Markdown
Contributor

hit/5 stores timestamps in seconds (System.system_time(:second)), but clean/1 was using ETS.now() which returns milliseconds. This caused all entries to appear stale and get deleted every cleanup cycle, silently resetting rate limits.

  • Use System.system_time(:second) in clean/1 to match hit/5
  • Convert key_older_than from ms to seconds with div/2
  • Update tests to set key_older_than: 1000 so entries age out in tests

Fixes #174

hit/5 stores timestamps in seconds (System.system_time(:second)), but
clean/1 was using ETS.now() which returns milliseconds. This caused all
entries to appear stale and get deleted every cleanup cycle, silently
resetting rate limits.

- Use System.system_time(:second) in clean/1 to match hit/5
- Convert key_older_than from ms to seconds with div/2
- Update tests to set key_older_than: 1000 so entries age out in tests

Fixes #174
The Atomic backend's clean/1 had the same bug: hit/5 stores timestamps
in seconds for TokenBucket/LeakyBucket, but clean/1 compared using
now() which returns milliseconds.

Branch clean/1 by algorithm: FixWindow correctly uses milliseconds
throughout, while bucket algorithms now use seconds with key_older_than
converted from ms to seconds via div/2.

Fixes #174
Extract clean_fix_window/1 and clean_bucket/1 to reduce nesting depth.
@epinault epinault merged commit 5016c11 into master Mar 27, 2026
9 checks passed
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.

clean/1 removes all entries every minute in TokenBucket and LeakyBucket due to timestamp unit mismatch

1 participant