@@ -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,16 @@ impl JanusApi {
390392 * state = ExecutionStatus :: Running ;
391393 }
392394 }
395+ let _ = registry_for_baseline
396+ . 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
404+ . set_status ( & query_id_for_baseline, format ! ( "Failed({err})" ) ) ;
399405 }
400406 }
401407 } ) ) ;
@@ -431,7 +437,7 @@ impl JanusApi {
431437 } ) ;
432438
433439 mqtt_subscribers. push ( subscriber) ;
434- mqtt_subscriber_handle = Some ( sub_handle) ;
440+ mqtt_subscriber_handles . push ( sub_handle) ;
435441 }
436442
437443 // Spawn live worker thread to receive results
@@ -470,6 +476,21 @@ impl JanusApi {
470476 None
471477 } ;
472478
479+ self . registry . increment_execution_count ( query_id) . map_err ( |e| {
480+ JanusApiError :: RegistryError ( format ! (
481+ "Failed to increment execution count for '{}': {}" ,
482+ query_id, e
483+ ) )
484+ } ) ?;
485+ self . registry
486+ . set_status ( query_id, format ! ( "{:?}" , initial_status) )
487+ . map_err ( |e| {
488+ JanusApiError :: RegistryError ( format ! (
489+ "Failed to update query status for '{}': {}" ,
490+ query_id, e
491+ ) )
492+ } ) ?;
493+
473494 // 6. Store running query information
474495 let running = RunningQuery {
475496 metadata,
@@ -479,7 +500,7 @@ impl JanusApi {
479500 historical_handles,
480501 baseline_handle,
481502 live_handle,
482- mqtt_subscriber_handle ,
503+ mqtt_subscriber_handles ,
483504 shutdown_senders,
484505 mqtt_subscribers,
485506 } ;
@@ -506,6 +527,7 @@ impl JanusApi {
506527 let running = running_map. remove ( query_id) . ok_or_else ( || {
507528 JanusApiError :: ExecutionError ( format ! ( "Query '{}' is not running" , query_id) )
508529 } ) ?;
530+ drop ( running_map) ;
509531
510532 // Send shutdown signals
511533 for shutdown_tx in running. shutdown_senders {
@@ -521,6 +543,25 @@ impl JanusApi {
521543 if let Ok ( mut status) = running. status . write ( ) {
522544 * status = ExecutionStatus :: Stopped ;
523545 }
546+ self . registry . set_status ( query_id, "Stopped" ) . map_err ( |e| {
547+ JanusApiError :: RegistryError ( format ! (
548+ "Failed to update query status for '{}': {}" ,
549+ query_id, e
550+ ) )
551+ } ) ?;
552+
553+ for handle in running. historical_handles {
554+ let _ = handle. join ( ) ;
555+ }
556+ if let Some ( handle) = running. baseline_handle {
557+ let _ = handle. join ( ) ;
558+ }
559+ if let Some ( handle) = running. live_handle {
560+ let _ = handle. join ( ) ;
561+ }
562+ for handle in running. mqtt_subscriber_handles {
563+ let _ = handle. join ( ) ;
564+ }
524565
525566 Ok ( ( ) )
526567 }
0 commit comments