Skip to content

Commit 45e05f0

Browse files
Fix bug in Query Timeout (#1021)
1 parent b8dd01d commit 45e05f0

File tree

4 files changed

+63
-18
lines changed

4 files changed

+63
-18
lines changed

zenoh/src/net/routing/dispatcher/face.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ impl Primitives for Face {
248248
&self.state,
249249
&msg.wire_expr,
250250
msg.ext_qos,
251+
msg.ext_tstamp,
251252
msg.payload,
252253
msg.ext_nodeid.node_id,
253254
);
@@ -260,10 +261,10 @@ impl Primitives for Face {
260261
&self.tables,
261262
&self.state,
262263
&msg.wire_expr,
263-
// parameters,
264264
msg.id,
265265
msg.ext_target,
266-
// consolidation,
266+
msg.ext_budget,
267+
msg.ext_timeout,
267268
msg.payload,
268269
msg.ext_nodeid.node_id,
269270
);

zenoh/src/net/routing/dispatcher/pubsub.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ pub fn full_reentrant_route_data(
429429
face: &FaceState,
430430
expr: &WireExpr,
431431
ext_qos: ext::QoSType,
432+
ext_tstamp: Option<ext::TimestampType>,
432433
mut payload: PushBody,
433434
routing_context: NodeId,
434435
) {
@@ -478,7 +479,7 @@ pub fn full_reentrant_route_data(
478479
outface.primitives.send_push(Push {
479480
wire_expr: key_expr.into(),
480481
ext_qos,
481-
ext_tstamp: None,
482+
ext_tstamp,
482483
ext_nodeid: ext::NodeIdType { node_id: *context },
483484
payload,
484485
})
@@ -513,7 +514,7 @@ pub fn full_reentrant_route_data(
513514
outface.primitives.send_push(Push {
514515
wire_expr: key_expr,
515516
ext_qos,
516-
ext_tstamp: None,
517+
ext_tstamp,
517518
ext_nodeid: ext::NodeIdType { node_id: context },
518519
payload: payload.clone(),
519520
})
@@ -540,7 +541,7 @@ pub fn full_reentrant_route_data(
540541
outface.primitives.send_push(Push {
541542
wire_expr: key_expr.into(),
542543
ext_qos,
543-
ext_tstamp: None,
544+
ext_tstamp,
544545
ext_nodeid: ext::NodeIdType { node_id: *context },
545546
payload: payload.clone(),
546547
})

zenoh/src/net/routing/dispatcher/queries.rs

+51-13
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,21 @@ use std::collections::HashMap;
2222
use std::sync::{Arc, Weak};
2323
use std::time::Duration;
2424
use tokio_util::sync::CancellationToken;
25+
use zenoh_buffers::ZBuf;
2526
use zenoh_config::WhatAmI;
2627
use zenoh_protocol::core::key_expr::keyexpr;
28+
use zenoh_protocol::core::KnownEncoding;
2729
use zenoh_protocol::network::declare::queryable::ext::QueryableInfo;
30+
use zenoh_protocol::zenoh;
31+
use zenoh_protocol::zenoh::ext::ValueType;
2832
use zenoh_protocol::{
2933
core::{Encoding, WireExpr},
3034
network::{
3135
declare::ext,
32-
request::{ext::TargetType, Request, RequestId},
36+
request::{
37+
ext::{BudgetType, TargetType, TimeoutType},
38+
Request, RequestId,
39+
},
3340
response::{self, ext::ResponderIdType, Response, ResponseFinal},
3441
},
3542
zenoh::{reply::ext::ConsolidationType, Reply, RequestBody, ResponseBody},
@@ -365,6 +372,7 @@ struct QueryCleanup {
365372
tables: Arc<TablesLock>,
366373
face: Weak<FaceState>,
367374
qid: RequestId,
375+
timeout: Duration,
368376
}
369377

370378
impl QueryCleanup {
@@ -378,6 +386,7 @@ impl QueryCleanup {
378386
tables: tables_ref.clone(),
379387
face: Arc::downgrade(face),
380388
qid,
389+
timeout,
381390
};
382391
if let Some((_, cancellation_token)) = face.pending_queries.get(&qid) {
383392
let c_cancellation_token = cancellation_token.clone();
@@ -396,17 +405,42 @@ impl QueryCleanup {
396405
impl Timed for QueryCleanup {
397406
async fn run(&mut self) {
398407
if let Some(mut face) = self.face.upgrade() {
399-
let tables_lock = zwrite!(self.tables.tables);
408+
let ext_respid = Some(response::ext::ResponderIdType {
409+
zid: face.zid,
410+
eid: 0,
411+
});
412+
route_send_response(
413+
&self.tables,
414+
&mut face,
415+
self.qid,
416+
ext_respid,
417+
WireExpr::empty(),
418+
ResponseBody::Err(zenoh::Err {
419+
timestamp: None,
420+
is_infrastructure: false,
421+
ext_sinfo: None,
422+
ext_unknown: vec![],
423+
ext_body: Some(ValueType {
424+
#[cfg(feature = "shared-memory")]
425+
ext_shm: None,
426+
payload: ZBuf::from("Timeout".as_bytes().to_vec()),
427+
encoding: KnownEncoding::TextPlain.into(),
428+
}),
429+
code: 0, // TODO
430+
}),
431+
);
432+
let queries_lock = zwrite!(self.tables.queries_lock);
400433
if let Some(query) = get_mut_unchecked(&mut face)
401434
.pending_queries
402435
.remove(&self.qid)
403436
{
404-
drop(tables_lock);
437+
drop(queries_lock);
405438
tracing::warn!(
406-
"Didn't receive final reply {}:{} from {}: Timeout!",
439+
"Didn't receive final reply {}:{} from {}: Timeout({:#?})!",
407440
query.0.src_face,
408441
self.qid,
409-
face
442+
face,
443+
self.timeout,
410444
);
411445
finalize_pending_query(query);
412446
}
@@ -513,12 +547,15 @@ macro_rules! inc_res_stats {
513547
};
514548
}
515549

550+
#[allow(clippy::too_many_arguments)]
516551
pub fn route_query(
517552
tables_ref: &Arc<TablesLock>,
518553
face: &Arc<FaceState>,
519554
expr: &WireExpr,
520555
qid: RequestId,
521-
target: TargetType,
556+
ext_target: TargetType,
557+
ext_budget: Option<BudgetType>,
558+
ext_timeout: Option<TimeoutType>,
522559
body: RequestBody,
523560
routing_context: NodeId,
524561
) {
@@ -555,14 +592,15 @@ pub fn route_query(
555592
});
556593

557594
let queries_lock = zwrite!(tables_ref.queries_lock);
558-
let route = compute_final_route(&rtables, &route, face, &mut expr, &target, query);
595+
let route =
596+
compute_final_route(&rtables, &route, face, &mut expr, &ext_target, query);
559597
let local_replies =
560598
rtables
561599
.hat_code
562600
.compute_local_replies(&rtables, &prefix, expr.suffix, face);
563601
let zid = rtables.zid;
564602

565-
let timeout = rtables.queries_default_timeout;
603+
let timeout = ext_timeout.unwrap_or(rtables.queries_default_timeout);
566604

567605
drop(queries_lock);
568606
drop(rtables);
@@ -643,8 +681,8 @@ pub fn route_query(
643681
ext_tstamp: None,
644682
ext_nodeid: ext::NodeIdType { node_id: *context },
645683
ext_target: *t,
646-
ext_budget: None,
647-
ext_timeout: None,
684+
ext_budget,
685+
ext_timeout,
648686
payload: body.clone(),
649687
},
650688
expr.full_expr().to_string(),
@@ -673,9 +711,9 @@ pub fn route_query(
673711
ext_qos: ext::QoSType::request_default(),
674712
ext_tstamp: None,
675713
ext_nodeid: ext::NodeIdType { node_id: *context },
676-
ext_target: target,
677-
ext_budget: None,
678-
ext_timeout: None,
714+
ext_target,
715+
ext_budget,
716+
ext_timeout,
679717
payload: body.clone(),
680718
},
681719
expr.full_expr().to_string(),

zenoh/src/net/tests/tables.rs

+5
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ fn client_test() {
626626
&face0.upgrade().unwrap(),
627627
&"test/client/z1_wr1".into(),
628628
ext::QoSType::default(),
629+
None,
629630
PushBody::Put(Put {
630631
timestamp: None,
631632
encoding: Encoding::default(),
@@ -659,6 +660,7 @@ fn client_test() {
659660
&face0.upgrade().unwrap(),
660661
&WireExpr::from(11).with_suffix("/z1_wr2"),
661662
ext::QoSType::default(),
663+
None,
662664
PushBody::Put(Put {
663665
timestamp: None,
664666
encoding: Encoding::default(),
@@ -692,6 +694,7 @@ fn client_test() {
692694
&face1.upgrade().unwrap(),
693695
&"test/client/**".into(),
694696
ext::QoSType::default(),
697+
None,
695698
PushBody::Put(Put {
696699
timestamp: None,
697700
encoding: Encoding::default(),
@@ -725,6 +728,7 @@ fn client_test() {
725728
&face0.upgrade().unwrap(),
726729
&12.into(),
727730
ext::QoSType::default(),
731+
None,
728732
PushBody::Put(Put {
729733
timestamp: None,
730734
encoding: Encoding::default(),
@@ -758,6 +762,7 @@ fn client_test() {
758762
&face1.upgrade().unwrap(),
759763
&22.into(),
760764
ext::QoSType::default(),
765+
None,
761766
PushBody::Put(Put {
762767
timestamp: None,
763768
encoding: Encoding::default(),

0 commit comments

Comments
 (0)