@@ -99,7 +99,7 @@ struct RunningQuery {
9999 historical_handles : Vec < thread:: JoinHandle < ( ) > > ,
100100 baseline_handle : Option < thread:: JoinHandle < ( ) > > ,
101101 live_handle : Option < thread:: JoinHandle < ( ) > > ,
102- mqtt_subscriber_handle : Option < thread:: JoinHandle < ( ) > > ,
102+ mqtt_subscriber_handles : Vec < thread:: JoinHandle < ( ) > > ,
103103 // shutdown sender signals used to stop the workers
104104 shutdown_senders : Vec < Sender < ( ) > > ,
105105 // MQTT subscriber instances (for stopping)
@@ -224,13 +224,13 @@ impl JanusApi {
224224 parsed. baseline . as_ref ( ) . map ( |baseline| baseline. window_name . clone ( ) ) ;
225225 let mut historical_handles = Vec :: new ( ) ;
226226 let mut shutdown_senders = Vec :: new ( ) ;
227- let status = Arc :: new ( RwLock :: new (
227+ let initial_status =
228228 if !parsed. live_windows . is_empty ( ) && !parsed. historical_windows . is_empty ( ) {
229229 ExecutionStatus :: WarmingBaseline
230230 } else {
231231 ExecutionStatus :: Running
232- } ,
233- ) ) ;
232+ } ;
233+ let status = Arc :: new ( RwLock :: new ( initial_status . clone ( ) ) ) ;
234234
235235 // 4. Spawn historical worker threads (one per historical window)
236236 for ( i, window) in parsed. historical_windows . iter ( ) . enumerate ( ) {
@@ -308,7 +308,7 @@ impl JanusApi {
308308
309309 // 5. Spawn live worker thread and MQTT subscribers (if there are live windows)
310310 let mut mqtt_subscribers = Vec :: new ( ) ;
311- let mut mqtt_subscriber_handle = None ;
311+ let mut mqtt_subscriber_handles = Vec :: new ( ) ;
312312 let mut baseline_handle = None ;
313313
314314 let live_handle = if !parsed. live_windows . is_empty ( ) && !parsed. rspql_query . is_empty ( ) {
@@ -354,6 +354,8 @@ impl JanusApi {
354354 let parsed_clone = parsed. clone ( ) ;
355355 let processor_for_baseline = Arc :: clone ( & live_processor) ;
356356 let status_for_baseline = Arc :: clone ( & status) ;
357+ let registry_for_baseline = Arc :: clone ( & self . registry ) ;
358+ let query_id_for_baseline = query_id. clone ( ) ;
357359 let baseline_mode = effective_baseline_mode;
358360 let baseline_window = effective_baseline_window. clone ( ) ;
359361 let ( baseline_shutdown_tx, baseline_shutdown_rx) = mpsc:: channel :: < ( ) > ( ) ;
@@ -390,12 +392,18 @@ impl JanusApi {
390392 * state = ExecutionStatus :: Running ;
391393 }
392394 }
395+ let _ =
396+ registry_for_baseline. set_status ( & query_id_for_baseline, "Running" ) ;
393397 }
394398 Err ( err) => {
395399 eprintln ! ( "Async baseline warm-up error: {}" , err) ;
396400 if let Ok ( mut state) = status_for_baseline. write ( ) {
397401 * state = ExecutionStatus :: Failed ( err. to_string ( ) ) ;
398402 }
403+ let _ = registry_for_baseline. set_status (
404+ & query_id_for_baseline,
405+ format ! ( "Failed({err})" ) ,
406+ ) ;
399407 }
400408 }
401409 } ) ) ;
@@ -431,7 +439,7 @@ impl JanusApi {
431439 } ) ;
432440
433441 mqtt_subscribers. push ( subscriber) ;
434- mqtt_subscriber_handle = Some ( sub_handle) ;
442+ mqtt_subscriber_handles . push ( sub_handle) ;
435443 }
436444
437445 // Spawn live worker thread to receive results
@@ -470,6 +478,21 @@ impl JanusApi {
470478 None
471479 } ;
472480
481+ self . registry . increment_execution_count ( query_id) . map_err ( |e| {
482+ JanusApiError :: RegistryError ( format ! (
483+ "Failed to increment execution count for '{}': {}" ,
484+ query_id, e
485+ ) )
486+ } ) ?;
487+ self . registry
488+ . set_status ( query_id, format ! ( "{:?}" , initial_status) )
489+ . map_err ( |e| {
490+ JanusApiError :: RegistryError ( format ! (
491+ "Failed to update query status for '{}': {}" ,
492+ query_id, e
493+ ) )
494+ } ) ?;
495+
473496 // 6. Store running query information
474497 let running = RunningQuery {
475498 metadata,
@@ -479,7 +502,7 @@ impl JanusApi {
479502 historical_handles,
480503 baseline_handle,
481504 live_handle,
482- mqtt_subscriber_handle ,
505+ mqtt_subscriber_handles ,
483506 shutdown_senders,
484507 mqtt_subscribers,
485508 } ;
@@ -506,6 +529,7 @@ impl JanusApi {
506529 let running = running_map. remove ( query_id) . ok_or_else ( || {
507530 JanusApiError :: ExecutionError ( format ! ( "Query '{}' is not running" , query_id) )
508531 } ) ?;
532+ drop ( running_map) ;
509533
510534 // Send shutdown signals
511535 for shutdown_tx in running. shutdown_senders {
@@ -521,6 +545,25 @@ impl JanusApi {
521545 if let Ok ( mut status) = running. status . write ( ) {
522546 * status = ExecutionStatus :: Stopped ;
523547 }
548+ self . registry . set_status ( query_id, "Stopped" ) . map_err ( |e| {
549+ JanusApiError :: RegistryError ( format ! (
550+ "Failed to update query status for '{}': {}" ,
551+ query_id, e
552+ ) )
553+ } ) ?;
554+
555+ for handle in running. historical_handles {
556+ let _ = handle. join ( ) ;
557+ }
558+ if let Some ( handle) = running. baseline_handle {
559+ let _ = handle. join ( ) ;
560+ }
561+ if let Some ( handle) = running. live_handle {
562+ let _ = handle. join ( ) ;
563+ }
564+ for handle in running. mqtt_subscriber_handles {
565+ let _ = handle. join ( ) ;
566+ }
524567
525568 Ok ( ( ) )
526569 }
0 commit comments