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:
Minh Vu
2026-07-14 09:33:59 +02:00
committed by GitHub
parent b6f30cae9a
commit 6e8475dd60
2 changed files with 32 additions and 3 deletions
+21
View File
@@ -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() {