Files
core/test/rust/runtime/job/cleanup.rs
T
2026-11-03 03:32:07 +00:00

42 lines
3.1 KiB
Rust

use super::*;
#[test]
fn claim_orders_pending_and_unrecovered_expired_jobs_together() {
let directory = Directory::new();
Runtime::new(Limits::default()).unwrap().run(async |scope| {
let database = Database::open(&directory.0, options(), scope).await.unwrap();
let mut executor = database.executor().await.unwrap();
executor.schema(scope, job::schema::TABLE, job::schema::SQL).await.unwrap();
executor.initialize(scope, "WITH RECURSIVE rows(number) AS (SELECT 0 UNION ALL SELECT number+1 FROM rows WHERE number<299) INSERT INTO _dever_job(id,target,payload,schema,execution,task_key,state,attempt,retries,timeout_ms,available_at,created_at,token,lease_until,execution_tenant) SELECT printf('%06d',number),'demo.account.publish','null','zero','{\"kind\":\"System\",\"tenant\":null}',CAST(number AS TEXT),'running',1,2,50,CASE WHEN number=299 THEN 0 ELSE 100 END,0,'old',0,0 FROM rows").await.unwrap();
let mut request = submission("pending");
request.at = 50;
let pending = job::enqueue(&mut executor, scope, request, 1000).await.unwrap().into_text();
let first = job::claim(&mut executor, scope, 1000, 1000).await.unwrap().unwrap();
// 首轮只恢复 256 项;仍为 running 的过期任务也必须参与最早时间排序。
assert_eq!(first.id, "000299");
assert_eq!(first.attempt, 2);
assert_ne!(first.token, "old");
let second = job::claim(&mut executor, scope, 1000, 1000).await.unwrap().unwrap();
assert_eq!(second.id, pending);
let third = job::claim(&mut executor, scope, 1000, 1000).await.unwrap().unwrap();
assert_eq!(third.id, "000000");
}).unwrap();
}
#[test]
fn expired_cleanup_is_bounded_without_hiding_eligible_work() {
let directory = Directory::new();
Runtime::new(Limits::default()).unwrap().run(async |scope| {
let database = Database::open(&directory.0, options(), scope).await.unwrap();
let mut executor = database.executor().await.unwrap();
executor.schema(scope, job::schema::TABLE, job::schema::SQL).await.unwrap();
executor.initialize(scope, "WITH RECURSIVE rows(number) AS (SELECT 0 UNION ALL SELECT number+1 FROM rows WHERE number<300) INSERT INTO _dever_job(id,target,payload,schema,execution,task_key,state,attempt,retries,timeout_ms,available_at,created_at,token,lease_until,execution_tenant) SELECT printf('%06d',number),'demo.account.publish','null','zero','{\"kind\":\"System\",\"tenant\":null}',CAST(number AS TEXT),'running',1,CASE WHEN number=300 THEN 2 ELSE 1 END,50,0,0,'old',0,0 FROM rows").await.unwrap();
let claim = job::claim(&mut executor, scope, 1000, 1000).await.unwrap().unwrap();
assert_eq!(claim.id, "000300");
assert_eq!(claim.attempt, 2);
let counts = executor.query(scope, "SELECT (SELECT COUNT(*) FROM _dever_job WHERE state='dead'),(SELECT COUNT(*) FROM _dever_job WHERE state='running' AND token='old')", vec![], 1, |row| Ok((row.get::<_, i64>(0)?, row.get::<_, i64>(1)?))).await.unwrap();
assert_eq!(counts, vec![(256,44)]);
job::complete(&mut executor, scope, &claim, 1001).await.unwrap();
}).unwrap();
}