@@ -39,12 +39,15 @@ use zenoh_util::Timed;
39
39
40
40
use super :: {
41
41
face:: FaceState ,
42
- resource:: { QueryRoute , QueryRoutes , QueryTargetQablSet , Resource } ,
42
+ resource:: { QueryRoute , QueryTargetQablSet , Resource } ,
43
43
tables:: { NodeId , RoutingExpr , Tables , TablesLock } ,
44
44
} ;
45
45
#[ cfg( feature = "unstable" ) ]
46
46
use crate :: key_expr:: KeyExpr ;
47
- use crate :: net:: routing:: hat:: { HatTrait , SendDeclare } ;
47
+ use crate :: net:: routing:: {
48
+ hat:: { HatTrait , SendDeclare } ,
49
+ router:: get_or_set_route,
50
+ } ;
48
51
49
52
pub ( crate ) struct Query {
50
53
src_face : Arc < FaceState > ,
@@ -120,18 +123,6 @@ pub(crate) fn declare_queryable(
120
123
121
124
disable_matches_query_routes ( & mut wtables, & mut res) ;
122
125
drop ( wtables) ;
123
-
124
- let rtables = zread ! ( tables. tables) ;
125
- let matches_query_routes = compute_matches_query_routes ( & rtables, & res) ;
126
- drop ( rtables) ;
127
-
128
- let wtables = zwrite ! ( tables. tables) ;
129
- for ( mut res, query_routes) in matches_query_routes {
130
- get_mut_unchecked ( & mut res)
131
- . context_mut ( )
132
- . update_query_routes ( query_routes) ;
133
- }
134
- drop ( wtables) ;
135
126
}
136
127
None => tracing:: error!(
137
128
"{} Declare queryable {} for unknown scope {}!" ,
@@ -184,18 +175,6 @@ pub(crate) fn undeclare_queryable(
184
175
{
185
176
tracing:: debug!( "{} Undeclare queryable {} ({})" , face, id, res. expr( ) ) ;
186
177
disable_matches_query_routes ( & mut wtables, & mut res) ;
187
- drop ( wtables) ;
188
-
189
- let rtables = zread ! ( tables. tables) ;
190
- let matches_query_routes = compute_matches_query_routes ( & rtables, & res) ;
191
- drop ( rtables) ;
192
-
193
- let wtables = zwrite ! ( tables. tables) ;
194
- for ( mut res, query_routes) in matches_query_routes {
195
- get_mut_unchecked ( & mut res)
196
- . context_mut ( )
197
- . update_query_routes ( query_routes) ;
198
- }
199
178
Resource :: clean ( & mut res) ;
200
179
drop ( wtables) ;
201
180
} else {
@@ -204,67 +183,6 @@ pub(crate) fn undeclare_queryable(
204
183
}
205
184
}
206
185
207
- pub ( crate ) fn compute_query_routes ( tables : & Tables , res : & Arc < Resource > ) -> QueryRoutes {
208
- let mut routes = QueryRoutes :: default ( ) ;
209
- tables
210
- . hat_code
211
- . compute_query_routes ( tables, & mut routes, & mut RoutingExpr :: new ( res, "" ) ) ;
212
- routes
213
- }
214
-
215
- pub ( crate ) fn update_query_routes ( tables : & Tables , res : & Arc < Resource > ) {
216
- if res. context . is_some ( ) && !res. expr ( ) . contains ( '*' ) && res. has_qabls ( ) {
217
- let mut res_mut = res. clone ( ) ;
218
- let res_mut = get_mut_unchecked ( & mut res_mut) ;
219
- tables. hat_code . compute_query_routes (
220
- tables,
221
- & mut res_mut. context_mut ( ) . query_routes ,
222
- & mut RoutingExpr :: new ( res, "" ) ,
223
- ) ;
224
- res_mut. context_mut ( ) . valid_query_routes = true ;
225
- }
226
- }
227
-
228
- pub ( crate ) fn update_query_routes_from ( tables : & mut Tables , res : & mut Arc < Resource > ) {
229
- update_query_routes ( tables, res) ;
230
- let res = get_mut_unchecked ( res) ;
231
- for child in res. children . values_mut ( ) {
232
- update_query_routes_from ( tables, child) ;
233
- }
234
- }
235
-
236
- pub ( crate ) fn compute_matches_query_routes (
237
- tables : & Tables ,
238
- res : & Arc < Resource > ,
239
- ) -> Vec < ( Arc < Resource > , QueryRoutes ) > {
240
- let mut routes = vec ! [ ] ;
241
- if res. context . is_some ( ) {
242
- if !res. expr ( ) . contains ( '*' ) && res. has_qabls ( ) {
243
- routes. push ( ( res. clone ( ) , compute_query_routes ( tables, res) ) ) ;
244
- }
245
- for match_ in & res. context ( ) . matches {
246
- let match_ = match_. upgrade ( ) . unwrap ( ) ;
247
- if !Arc :: ptr_eq ( & match_, res) && !match_. expr ( ) . contains ( '*' ) && match_. has_qabls ( ) {
248
- let match_routes = compute_query_routes ( tables, & match_) ;
249
- routes. push ( ( match_, match_routes) ) ;
250
- }
251
- }
252
- }
253
- routes
254
- }
255
-
256
- pub ( crate ) fn update_matches_query_routes ( tables : & Tables , res : & Arc < Resource > ) {
257
- if res. context . is_some ( ) {
258
- update_query_routes ( tables, res) ;
259
- for match_ in & res. context ( ) . matches {
260
- let match_ = match_. upgrade ( ) . unwrap ( ) ;
261
- if !Arc :: ptr_eq ( & match_, res) {
262
- update_query_routes ( tables, & match_) ;
263
- }
264
- }
265
- }
266
- }
267
-
268
186
#[ inline]
269
187
fn insert_pending_query ( outface : & mut Arc < FaceState > , query : Arc < Query > ) -> RequestId {
270
188
let outface_mut = get_mut_unchecked ( outface) ;
@@ -417,6 +335,19 @@ impl Timed for QueryCleanup {
417
335
}
418
336
}
419
337
338
+ pub ( crate ) fn disable_all_query_routes ( tables : & mut Tables ) {
339
+ pub ( crate ) fn disable_all_query_routes_rec ( res : & mut Arc < Resource > ) {
340
+ let res = get_mut_unchecked ( res) ;
341
+ if let Some ( ctx) = & mut res. context {
342
+ ctx. disable_query_routes ( ) ;
343
+ }
344
+ for child in res. children . values_mut ( ) {
345
+ disable_all_query_routes_rec ( child) ;
346
+ }
347
+ }
348
+ disable_all_query_routes_rec ( & mut tables. root_res )
349
+ }
350
+
420
351
pub ( crate ) fn disable_matches_query_routes ( _tables : & mut Tables , res : & mut Arc < Resource > ) {
421
352
if res. context . is_some ( ) {
422
353
get_mut_unchecked ( res) . context_mut ( ) . disable_query_routes ( ) ;
@@ -439,16 +370,17 @@ fn get_query_route(
439
370
expr : & mut RoutingExpr ,
440
371
routing_context : NodeId ,
441
372
) -> Arc < QueryTargetQablSet > {
442
- let local_context = tables
443
- . hat_code
444
- . map_routing_context ( tables, face, routing_context) ;
445
- res. as_ref ( )
446
- . and_then ( |res| res. query_route ( face. whatami , local_context) )
447
- . unwrap_or_else ( || {
448
- tables
449
- . hat_code
450
- . compute_query_route ( tables, expr, local_context, face. whatami )
451
- } )
373
+ let hat = & tables. hat_code ;
374
+ let local_context = hat. map_routing_context ( tables, face, routing_context) ;
375
+ let mut compute_route = || hat. compute_query_route ( tables, expr, local_context, face. whatami ) ;
376
+ if let Some ( query_routes) = res
377
+ . as_ref ( )
378
+ . and_then ( |res| res. context . as_ref ( ) )
379
+ . map ( |ctx| & ctx. query_routes )
380
+ {
381
+ return get_or_set_route ( query_routes, face. whatami , local_context, compute_route) ;
382
+ }
383
+ compute_route ( )
452
384
}
453
385
454
386
#[ cfg( feature = "stats" ) ]
0 commit comments