@@ -16,20 +16,17 @@ use tokio_util::sync::CancellationToken;
1616use zeromq:: { Socket , SocketRecv , SubSocket } ;
1717
1818use dynamo_runtime:: metrics:: { MetricsHierarchy , prometheus_names:: kvstats} ;
19- use dynamo_runtime:: traits:: {
20- DistributedRuntimeProvider , events:: EventPublisher , events:: EventSubscriber ,
21- } ;
19+ use dynamo_runtime:: traits:: { DistributedRuntimeProvider , events:: EventPublisher } ;
2220use dynamo_runtime:: {
2321 component:: { Component , Namespace } ,
2422 transports:: nats:: { NatsQueue , Slug } ,
2523} ;
26- use futures:: StreamExt ;
2724
2825use crate :: kv_router:: {
2926 KV_EVENT_SUBJECT , KV_METRICS_SUBJECT , WORKER_KV_INDEXER_BUFFER_SIZE ,
30- WORKER_KV_INDEXER_QUERY_SUBJECT ,
31- indexer:: { KvIndexerMetrics , LocalKvIndexer , RouterEvent , WorkerKvQueryRequest } ,
27+ indexer:: { KvIndexerMetrics , LocalKvIndexer , RouterEvent } ,
3228 protocols:: * ,
29+ worker_query:: start_worker_kv_query_endpoint,
3330} ;
3431use dynamo_runtime:: config:: environment_names:: nats as env_nats;
3532
@@ -173,11 +170,10 @@ impl KvEventPublisher {
173170 . drt ( )
174171 . runtime ( )
175172 . secondary ( )
176- . spawn ( start_worker_kv_query_service (
173+ . spawn ( start_worker_kv_query_endpoint (
177174 component,
178175 worker_id,
179176 local_indexer,
180- cancellation_token. clone ( ) ,
181177 ) )
182178 } ) ;
183179
@@ -311,80 +307,6 @@ async fn start_event_processor<P: EventPublisher + Send + Sync + 'static>(
311307 }
312308}
313309
314- // Processor for Router -> LocalKvIndexer query service
315- async fn start_worker_kv_query_service (
316- component : Component ,
317- worker_id : u64 ,
318- local_indexer : Arc < LocalKvIndexer > ,
319- cancellation_token : CancellationToken ,
320- ) {
321- // Create NATS subscriber on a subject specific to worker's id
322- let subject = format ! ( "{}.{}" , WORKER_KV_INDEXER_QUERY_SUBJECT , worker_id) ;
323- let mut subscriber = match component. subscribe ( & subject) . await {
324- Ok ( sub) => sub,
325- Err ( e) => {
326- tracing:: error!(
327- "Query service failed to subscribe for worker {worker_id} on subject {subject}: {e}"
328- ) ;
329- return ;
330- }
331- } ;
332- tracing:: info!( "Query service listening on NATS for worker {worker_id} on subject {subject}" ) ;
333-
334- // Receive query request from router, retrieve event(s) from LocalKvIndexer, return response
335- loop {
336- tokio:: select! {
337- _ = cancellation_token. cancelled( ) => {
338- tracing:: info!( "Query service received cancellation signal for worker {worker_id}" ) ;
339- break ;
340- }
341-
342- msg = subscriber. next( ) => {
343- let Some ( msg) = msg else {
344- tracing:: warn!( "Query service NATS stream ended for worker {worker_id}" ) ;
345- break ;
346- } ;
347-
348- // deserialize from msg (async_nats::Message)
349- let request: WorkerKvQueryRequest = match serde_json:: from_slice( & msg. payload) {
350- Ok ( request) => request,
351- Err ( e) => {
352- tracing:: error!( "Failed to deserialize WorkerKvQueryRequest for worker {worker_id}: {e}" ) ;
353- continue ;
354- }
355- } ;
356-
357- tracing:: debug!( "Received query request for worker {worker_id}: {request:?}" ) ;
358-
359- // Query events based on optional start/end ids
360- let response = local_indexer
361- . get_events_in_id_range( request. start_event_id, request. end_event_id)
362- . await ;
363-
364- // Send reply back (if reply subject exists)
365- if let Some ( reply_subject) = msg. reply {
366- let payload = match serde_json:: to_vec( & response) {
367- Ok ( p) => p,
368- Err ( e) => {
369- tracing:: error!( "Failed to serialize response for worker {worker_id}: {e}" ) ;
370- continue ;
371- }
372- } ;
373-
374- // Publish through DRT/NATS directly instead of namespace (adds a prefix)
375- if let Err ( e) = component
376- . drt( )
377- . kv_router_nats_publish( reply_subject. to_string( ) , payload. into( ) )
378- . await
379- {
380- tracing:: error!( "Failed to send reply for worker {worker_id}: {e}" ) ;
381- }
382- }
383- }
384- }
385- }
386- }
387-
388310/// Calculate exponential backoff duration based on consecutive error count
389311fn calculate_backoff_ms ( consecutive_errors : u32 ) -> u64 {
390312 std:: cmp:: min (
@@ -1864,6 +1786,9 @@ mod tests_startup_helpers {
18641786 let missed_events = match response {
18651787 crate :: kv_router:: indexer:: WorkerKvQueryResponse :: Events ( e) => e,
18661788 crate :: kv_router:: indexer:: WorkerKvQueryResponse :: TreeDump ( e) => e,
1789+ crate :: kv_router:: indexer:: WorkerKvQueryResponse :: Error ( message) => {
1790+ panic ! ( "Unexpected error response: {message}" )
1791+ }
18671792 other => panic ! ( "Unexpected response: {:?}" , other) ,
18681793 } ;
18691794 assert_eq ! (
0 commit comments