@@ -4,24 +4,22 @@ use crate::composable_database::{
44 QueryJobStatusArgs , QueryJobStatusRet , QueryStatus , ScheduleQueryArgs , ScheduleQueryRet ,
55 TaskId ,
66} ;
7- use crate :: intermediate_results:: { get_results, TaskKey } ;
87use crate :: mock_catalog:: load_catalog;
9- use crate :: parser:: ExecutionPlanParser ;
108use crate :: query_graph:: { QueryGraph , StageStatus } ;
119use crate :: queue:: Queue ;
10+ use crate :: queue:: State ;
11+ use crate :: task:: TaskStatus ;
1212use crate :: SchedulerError ;
13- use datafusion:: arrow:: util:: pretty:: print_batches;
1413use datafusion:: execution:: context:: SessionContext ;
15- use datafusion_proto:: bytes:: physical_plan_from_bytes;
14+ use datafusion_proto:: bytes:: { physical_plan_from_bytes, physical_plan_to_bytes } ;
1615use std:: fmt;
1716use std:: sync:: atomic:: { AtomicU64 , Ordering } ;
1817use std:: sync:: Arc ;
1918use tokio:: sync:: { Mutex , Notify } ;
20- use tokio:: time:: { sleep, Duration } ;
21- use tonic:: transport:: Server ;
2219use tonic:: { Request , Response , Status } ;
2320
2421pub struct SchedulerService {
22+ state : Arc < State > ,
2523 queue : Arc < Mutex < Queue > > ,
2624 ctx : Arc < SessionContext > , // If we support changing the catalog at runtime, this should be a RwLock.
2725 query_id_counter : AtomicU64 ,
@@ -30,18 +28,15 @@ pub struct SchedulerService {
3028
3129impl fmt:: Debug for SchedulerService {
3230 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
33- write ! (
34- f,
35- "SchedulerService {{ queue: {:?} }}" ,
36- self . queue,
37- )
31+ write ! ( f, "SchedulerService {{ queue: {:?} }}" , self . queue, )
3832 }
3933}
4034
4135impl SchedulerService {
4236 pub async fn new ( catalog_path : & str ) -> Self {
4337 let avail = Arc :: new ( Notify :: new ( ) ) ;
4438 Self {
39+ state : Arc :: new ( State :: new ( avail. clone ( ) ) ) ,
4540 queue : Arc :: new ( Mutex :: new ( Queue :: new ( Arc :: clone ( & avail) ) ) ) ,
4641 ctx : load_catalog ( catalog_path) . await ,
4742 query_id_counter : AtomicU64 :: new ( 0 ) ,
@@ -59,19 +54,28 @@ impl SchedulerService {
5954 task_id_opt : Option < TaskId > ,
6055 ) -> Result < ( TaskId , Vec < u8 > ) , SchedulerError > {
6156 if let Some ( task_id) = task_id_opt {
62- let mut queue = self . queue . lock ( ) . await ;
63- // Remove the current task from the queue.
64- queue. remove_task ( task_id, StageStatus :: Finished ( 0 ) ) . await ;
57+ // let mut queue = self.queue.lock().await;
58+ // // Remove the current task from the queue.
59+ // queue.remove_task(task_id, StageStatus::Finished(0)).await;
60+ self . state . report_task ( task_id, TaskStatus :: Finished ) . await ;
6561 }
6662 loop {
67- let mut queue = self . queue . lock ( ) . await ;
68- if let Some ( new_task_id) = queue. next_task ( ) . await {
69- let stage = queue
70- . get_plan_bytes ( new_task_id. query_id , new_task_id. stage_id )
71- . await ?;
72- return Ok ( ( new_task_id, stage) ) ;
63+ // let mut queue = self.queue.lock().await;
64+ // if let Some(new_task_id) = queue.next_task().await {
65+ // let stage = queue
66+ // .get_plan_bytes(new_task_id.query_id, new_task_id.stage_id)
67+ // .await?;
68+ // return Ok((new_task_id, stage));
69+ // }
70+ // drop(queue);
71+ if let Some ( ( task_id, plan) ) = self . state . next_task ( ) . await {
72+ let bytes = physical_plan_to_bytes ( plan)
73+ . expect ( "Failed to serialize physical plan" )
74+ . to_vec ( ) ;
75+ println ! ( "SchedulerService: Sending task {:?}" , task_id) ;
76+ return Ok ( ( task_id, bytes) ) ;
7377 }
74- drop ( queue ) ;
78+ println ! ( "SchedulerService: Waiting for new tasks." ) ;
7579 self . avail . notified ( ) . await ;
7680 }
7781 }
@@ -94,13 +98,13 @@ impl SchedulerApi for SchedulerService {
9498
9599 let plan = physical_plan_from_bytes ( bytes. as_slice ( ) , & self . ctx )
96100 . expect ( "Failed to deserialize physical plan" ) ;
97- // println!("schedule_query: received plan {:?}", plan);
98101
99- // Build a query graph, store in query table, enqueue new tasks.
100- let qid = self . next_query_id ( ) ;
101- let query = QueryGraph :: new ( qid, plan) . await ;
102- self . queue . lock ( ) . await . add_query ( qid, Arc :: new ( Mutex :: new ( query) ) ) . await ;
102+ let qid = self . state . add_query ( plan) . await ;
103103
104+ // Build a query graph, store in query table, enqueue new tasks.
105+ // let qid = self.next_query_id();
106+ // let query = QueryGraph::new(qid, plan);
107+ // self.queue.lock().await.add_query(qid, Arc::new(Mutex::new(query))).await;
104108
105109 let response = ScheduleQueryRet { query_id : qid } ;
106110 Ok ( Response :: new ( response) )
@@ -113,8 +117,14 @@ impl SchedulerApi for SchedulerService {
113117 ) -> Result < Response < QueryJobStatusRet > , Status > {
114118 let QueryJobStatusArgs { query_id } = request. into_inner ( ) ;
115119
116- let status = self . queue . lock ( ) . await . get_query_status ( query_id) . await ;
120+ let status = self
121+ . state
122+ . get_query_status ( query_id)
123+ . await
124+ . unwrap_or ( QueryStatus :: NotFound ) ;
125+ // let status = self.queue.lock().await.get_query_status(query_id).await;
117126 if status == QueryStatus :: Done {
127+ println ! ( "SchedulerService: Query {} is done." , query_id) ;
118128 let stage_id = 0 ;
119129 // let final_result = get_results(&TaskKey { stage_id, query_id })
120130 // .await
@@ -127,8 +137,8 @@ impl SchedulerApi for SchedulerService {
127137
128138 return Ok ( Response :: new ( QueryJobStatusRet {
129139 query_status : QueryStatus :: Done . into ( ) ,
130- stage_id : stage_id ,
131- query_id : query_id
140+ stage_id,
141+ query_id,
132142 } ) ) ;
133143 // ****************** END CHANGES FROM INTEGRATION TESTING****************//
134144 }
@@ -145,7 +155,8 @@ impl SchedulerApi for SchedulerService {
145155 ) -> Result < Response < AbortQueryRet > , Status > {
146156 // TODO: Actually call executor API to abort query.
147157 let AbortQueryArgs { query_id } = request. into_inner ( ) ;
148- self . queue . lock ( ) . await . abort_query ( query_id) . await ;
158+ // self.queue.lock().await.abort_query(query_id).await;
159+ self . state . abort_query ( query_id) . await ;
149160 let response = AbortQueryRet { aborted : true } ;
150161 Ok ( Response :: new ( response) )
151162 }
@@ -243,10 +254,10 @@ mod tests {
243254 test_file
244255 ) ;
245256 }
246- println ! (
247- "test_scheduler: queued {} tasks." ,
248- scheduler_service. queue. lock( ) . await . size( )
249- ) ;
257+ // println!(
258+ // "test_scheduler: queued {} tasks.",
259+ // scheduler_service.queue.lock().await.size()
260+ // );
250261
251262 // TODO: add concurrent test eventually
252263 let mut send_task = NotifyTaskStateArgs {
0 commit comments