mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-06 00:00:10 +02:00
time: wake DelayQueue after resetting to expired (#8274)
Resetting an item into the expired stack bypassed the existing Sleep reset path, leaving a pending consumer asleep until an unrelated deadline.
This commit is contained in:
@@ -202,6 +202,27 @@ async fn reset_entry() {
|
||||
assert!(entry.is_none())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn reset_to_past_wakes_pending_queue() {
|
||||
time::pause();
|
||||
|
||||
let mut queue = task::spawn(DelayQueue::new());
|
||||
let key = queue.insert("foo", ms(10_000));
|
||||
|
||||
assert_pending!(poll!(queue));
|
||||
assert!(!queue.is_woken());
|
||||
|
||||
queue.reset_at(&key, Instant::now() - ms(100));
|
||||
|
||||
assert!(queue.is_woken());
|
||||
|
||||
let entry = assert_ready_some!(poll!(queue));
|
||||
assert_eq!(*entry.get_ref(), "foo");
|
||||
|
||||
let entry = assert_ready!(poll!(queue));
|
||||
assert!(entry.is_none());
|
||||
}
|
||||
|
||||
// Reproduces tokio-rs/tokio#849.
|
||||
#[tokio::test]
|
||||
async fn reset_much_later() {
|
||||
|
||||
Reference in New Issue
Block a user