From a224b684cd967fb275b7b16abc7f1f89e6a14ebb Mon Sep 17 00:00:00 2001 From: Laurence Tratt Date: Thu, 24 Sep 2026 11:44:48 +0100 Subject: [PATCH] Ensure that the oldest job is popped first. Oops. --- src/queue.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/queue.rs b/src/queue.rs index 6812dfd..bec2ddf 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -86,7 +86,7 @@ impl Queue { for (k, v) in self.q.iter() { if let Some(qj) = v.front() { if let Some(et) = earliest_time { - if et > qj.req_time { + if et < qj.req_time { continue; } } @@ -107,3 +107,36 @@ impl Queue { earliest_key.map(|k| self.q.get_mut(&k).unwrap().pop_front().unwrap()) } } + +#[cfg(test)] +mod tests { + use super::*; + use std::{thread::sleep, time::Duration}; + + fn job(repo_id: &str, req_time: Instant) -> QueueJob { + QueueJob::new( + repo_id.to_owned(), + "owner".to_owned(), + repo_id.to_owned(), + req_time, + "push".to_owned(), + "{}".to_owned(), + RepoConfig { + cmd: None, + errorcmd: None, + queuekind: QueueKind::Sequential, + timeout: 1, + }, + ) + } + + #[test] + fn pop_returns_oldest_runnable_job() { + let mut queue = Queue::new(); + queue.push_back(job("j1", Instant::now())); + sleep(Duration::from_millis(1)); + queue.push_back(job("j2", Instant::now())); + + assert_eq!(queue.pop(|_| false).unwrap().repo_id, "j1"); + } +}