Fix SlidingTimeWindowReservoir trim operation after overflow #1063
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.
The existing
trim
operation inSlidingTimeWindowReservoir
assumes that values returned bygetTick
are strictly increasing. When the result returned bygetTick
overflows, thetrim
operation will behave improperly -trim
operations just after the overflow event will likely clear values within the current window, andtrim
operations well past the overflow event will likely fail to clear updates outside the current window (updates added before the overflow event).To illustrate this behavior consider a reservoir with an 8-bit value returned by
getTick
, a window size of 2, and ignore thetrim
operations effect on the tick count:The proposed fix properly clears any values in the reservoir outside of the sliding time window. For the purposes of that operation, the start of the time window is defined as
now-window
, and the end of the time window is defined asnow+CLEAR_BUFFER
, wherenow
is the value returned bygetTick
at the start of thetrim
operation. This preventstrim
from improperly clearing updates added concurrently while the operation is underway.