@@ -61,6 +61,7 @@ fn merge_qabl_infos(mut this: QueryableInfoType, info: &QueryableInfoType) -> Qu
61
61
this
62
62
}
63
63
64
+ #[ inline]
64
65
fn local_peer_qabl_info ( _tables : & Tables , res : & Arc < Resource > ) -> QueryableInfoType {
65
66
res. session_ctxs
66
67
. values ( )
@@ -77,6 +78,7 @@ fn local_peer_qabl_info(_tables: &Tables, res: &Arc<Resource>) -> QueryableInfoT
77
78
. unwrap_or ( QueryableInfoType :: DEFAULT )
78
79
}
79
80
81
+ #[ inline]
80
82
fn local_qabl_info (
81
83
tables : & Tables ,
82
84
res : & Arc < Resource > ,
@@ -166,6 +168,37 @@ fn send_sourced_queryable_to_net_children(
166
168
}
167
169
}
168
170
171
+ #[ inline]
172
+ fn send_declare_queryable (
173
+ dst_face : & mut Arc < FaceState > ,
174
+ res : & Arc < Resource > ,
175
+ id : u32 ,
176
+ info : QueryableInfoType ,
177
+ send_declare : & mut SendDeclare ,
178
+ ) {
179
+ face_hat_mut ! ( dst_face)
180
+ . local_qabls
181
+ . insert ( res. clone ( ) , ( id, info) ) ;
182
+ let key_expr = Resource :: decl_key ( res, dst_face, super :: push_declaration_profile ( dst_face) ) ;
183
+ send_declare (
184
+ & dst_face. primitives ,
185
+ RoutingContext :: with_expr (
186
+ Declare {
187
+ interest_id : None ,
188
+ ext_qos : ext:: QoSType :: DECLARE ,
189
+ ext_tstamp : None ,
190
+ ext_nodeid : ext:: NodeIdType :: DEFAULT ,
191
+ body : DeclareBody :: DeclareQueryable ( DeclareQueryable {
192
+ id,
193
+ wire_expr : key_expr,
194
+ ext_info : info,
195
+ } ) ,
196
+ } ,
197
+ res. expr ( ) . to_string ( ) ,
198
+ ) ,
199
+ ) ;
200
+ }
201
+
169
202
fn propagate_simple_queryable (
170
203
tables : & mut Tables ,
171
204
res : & Arc < Resource > ,
@@ -174,44 +207,32 @@ fn propagate_simple_queryable(
174
207
) {
175
208
let faces = tables. faces . values ( ) . cloned ( ) ;
176
209
for mut dst_face in faces {
177
- let info = local_qabl_info ( tables, res, & dst_face) ;
178
- let current = face_hat ! ( dst_face) . local_qabls . get ( res) ;
179
210
if src_face
180
211
. as_ref ( )
181
212
. map ( |src_face| dst_face. id != src_face. id )
182
213
. unwrap_or ( true )
183
- && ( current. is_none ( ) || current. unwrap ( ) . 1 != info)
184
214
&& dst_face. whatami == WhatAmI :: Client
185
- && face_hat ! ( dst_face)
215
+ {
216
+ if let Some ( & ( current_id, current_info) ) = face_hat ! ( dst_face) . local_qabls . get ( res) {
217
+ let info = local_qabl_info ( tables, res, & dst_face) ;
218
+ if current_info != info
219
+ && face_hat ! ( dst_face)
220
+ . remote_interests
221
+ . values ( )
222
+ . any ( |i| i. options . queryables ( ) && i. matches ( res) )
223
+ {
224
+ let id = current_id;
225
+ send_declare_queryable ( & mut dst_face, res, id, info, send_declare) ;
226
+ }
227
+ } else if face_hat ! ( dst_face)
186
228
. remote_interests
187
229
. values ( )
188
230
. any ( |i| i. options . queryables ( ) && i. matches ( res) )
189
- {
190
- let id = current
191
- . map ( |c| c. 0 )
192
- . unwrap_or ( face_hat ! ( dst_face) . next_id . fetch_add ( 1 , Ordering :: SeqCst ) ) ;
193
- face_hat_mut ! ( & mut dst_face)
194
- . local_qabls
195
- . insert ( res. clone ( ) , ( id, info) ) ;
196
- let push_declaration = push_declaration_profile ( & dst_face) ;
197
- let key_expr = Resource :: decl_key ( res, & mut dst_face, push_declaration) ;
198
- send_declare (
199
- & dst_face. primitives ,
200
- RoutingContext :: with_expr (
201
- Declare {
202
- interest_id : None ,
203
- ext_qos : ext:: QoSType :: DECLARE ,
204
- ext_tstamp : None ,
205
- ext_nodeid : ext:: NodeIdType :: DEFAULT ,
206
- body : DeclareBody :: DeclareQueryable ( DeclareQueryable {
207
- id,
208
- wire_expr : key_expr,
209
- ext_info : info,
210
- } ) ,
211
- } ,
212
- res. expr ( ) . to_string ( ) ,
213
- ) ,
214
- ) ;
231
+ {
232
+ let info = local_qabl_info ( tables, res, & dst_face) ;
233
+ let id = face_hat ! ( dst_face) . next_id . fetch_add ( 1 , Ordering :: SeqCst ) ;
234
+ send_declare_queryable ( & mut dst_face, res, id, info, send_declare) ;
235
+ }
215
236
}
216
237
}
217
238
}
0 commit comments