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(); }