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.
Motivation
When implementing a cache with item expirations (example from mini-redis), it's not possible to use
DelayQueue
as a more efficient backing store for the expirations. The reason is, when inserting/removing/modifying a cache entry there needs to be a way to determine whether the "next expiring time" has changed as a result of the operation. Basically, you'd need an api similar toDelayQueue::peek
but for the next deadline in the queue. However, currentlyDelayQueue
does not expose such an api, so you are left with having to store an independent mapping ofKey
s to expirationInstant
s and keep it in sync with all operations on theDelayQueue
. It would be nice to not have to maintain this bookkeeping whenDelayQueue
already knows this information.Solution
Originally, my first thought was to simply make
DelayQueue::next_deadline
public. However looking closer at the internals, it doesn't consider deadlines in theexpired
queue. So a user who inserts an already expired item into the queue and callsnext_deadline
might be surprised when they getNone
back. This function is used a lot internally as well, so I thought it would be best to not modify its behavior.Instead we could expose a
deadline
function that takes aKey
and returns its expiration time. This way, we could still get the next deadline viadelay_queue.peek().map(|key| delay_queue.deadline(&key))
.