From fb64aad1b72f60f5ec831de02ee28923274b14a9 Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Fri, 14 Mar 2025 13:52:21 +0100 Subject: [PATCH 01/49] pass messages by reference instead of by value --- commons/zenoh-codec/src/network/mod.rs | 25 +- commons/zenoh-codec/src/transport/batch.rs | 10 +- commons/zenoh-codec/src/transport/mod.rs | 12 +- .../zenoh-protocol/src/common/extension.rs | 3 +- commons/zenoh-protocol/src/network/mod.rs | 314 +++++++++++++----- commons/zenoh-protocol/src/transport/close.rs | 2 +- .../zenoh-protocol/src/transport/keepalive.rs | 2 +- commons/zenoh-protocol/src/transport/mod.rs | 15 +- examples/examples/z_put.rs | 2 +- io/zenoh-transport/src/common/batch.rs | 10 +- io/zenoh-transport/src/common/pipeline.rs | 20 +- io/zenoh-transport/src/lib.rs | 6 +- io/zenoh-transport/src/multicast/mod.rs | 9 +- io/zenoh-transport/src/multicast/rx.rs | 2 +- io/zenoh-transport/src/multicast/tx.rs | 23 +- io/zenoh-transport/src/shm.rs | 20 +- .../src/unicast/lowlatency/link.rs | 18 +- .../src/unicast/lowlatency/rx.rs | 2 +- .../src/unicast/lowlatency/transport.rs | 12 +- .../src/unicast/lowlatency/tx.rs | 10 +- io/zenoh-transport/src/unicast/mod.rs | 4 +- .../src/unicast/transport_unicast_inner.rs | 4 +- .../src/unicast/universal/rx.rs | 2 +- .../src/unicast/universal/transport.rs | 4 +- .../src/unicast/universal/tx.rs | 8 +- zenoh/src/api/admin.rs | 4 +- zenoh/src/api/builders/reply.rs | 2 +- zenoh/src/api/key_expr.rs | 2 +- zenoh/src/api/queryable.rs | 4 +- zenoh/src/api/session.rs | 121 ++++--- zenoh/src/net/primitives/demux.rs | 100 +++--- zenoh/src/net/primitives/mod.rs | 48 +-- zenoh/src/net/primitives/mux.rs | 158 +++++---- zenoh/src/net/routing/dispatcher/face.rs | 95 ++---- zenoh/src/net/routing/dispatcher/interests.rs | 2 +- zenoh/src/net/routing/dispatcher/pubsub.rs | 54 ++- zenoh/src/net/routing/dispatcher/queries.rs | 173 +++++----- zenoh/src/net/routing/dispatcher/resource.rs | 2 +- zenoh/src/net/routing/hat/client/interests.rs | 6 +- zenoh/src/net/routing/hat/client/mod.rs | 2 +- .../src/net/routing/hat/linkstate_peer/mod.rs | 5 +- .../net/routing/hat/linkstate_peer/network.rs | 6 +- .../net/routing/hat/linkstate_peer/pubsub.rs | 4 +- .../net/routing/hat/linkstate_peer/queries.rs | 4 +- .../net/routing/hat/linkstate_peer/token.rs | 4 +- zenoh/src/net/routing/hat/mod.rs | 2 +- zenoh/src/net/routing/hat/p2p_peer/gossip.rs | 6 +- .../src/net/routing/hat/p2p_peer/interests.rs | 6 +- zenoh/src/net/routing/hat/p2p_peer/mod.rs | 5 +- zenoh/src/net/routing/hat/p2p_peer/pubsub.rs | 2 +- zenoh/src/net/routing/hat/router/mod.rs | 5 +- zenoh/src/net/routing/hat/router/network.rs | 6 +- zenoh/src/net/routing/hat/router/pubsub.rs | 4 +- zenoh/src/net/routing/hat/router/queries.rs | 4 +- zenoh/src/net/routing/hat/router/token.rs | 4 +- .../net/routing/interceptor/access_control.rs | 205 ++++++------ .../net/routing/interceptor/downsampling.rs | 31 +- zenoh/src/net/routing/interceptor/low_pass.rs | 30 +- zenoh/src/net/routing/interceptor/mod.rs | 37 +-- .../net/routing/interceptor/qos_overwrite.rs | 44 +-- zenoh/src/net/routing/mod.rs | 38 +-- zenoh/src/net/routing/namespace.rs | 45 +-- zenoh/src/net/routing/router.rs | 4 +- zenoh/src/net/runtime/adminspace.rs | 46 +-- zenoh/src/net/runtime/mod.rs | 6 +- zenoh/src/net/tests/tables.rs | 86 ++--- 66 files changed, 1008 insertions(+), 943 deletions(-) diff --git a/commons/zenoh-codec/src/network/mod.rs b/commons/zenoh-codec/src/network/mod.rs index 452af414a7..708705e5ce 100644 --- a/commons/zenoh-codec/src/network/mod.rs +++ b/commons/zenoh-codec/src/network/mod.rs @@ -25,7 +25,10 @@ use zenoh_buffers::{ use zenoh_protocol::{ common::{imsg, ZExtZ64, ZExtZBufHeader}, core::{EntityId, Reliability, ZenohIdProto}, - network::{ext::EntityGlobalIdType, *}, + network::{ + ext::{self, EntityGlobalIdType}, + id, NetworkBody, NetworkBodyRef, NetworkMessage, NetworkMessageRef, + }, }; use crate::{ @@ -33,23 +36,23 @@ use crate::{ }; // NetworkMessage -impl WCodec<&NetworkMessage, &mut W> for Zenoh080 +impl WCodec, &mut W> for Zenoh080 where W: Writer, { type Output = Result<(), DidntWrite>; - fn write(self, writer: &mut W, x: &NetworkMessage) -> Self::Output { - let NetworkMessage { body, .. } = x; + fn write(self, writer: &mut W, x: NetworkMessageRef) -> Self::Output { + let NetworkMessageRef { body, .. } = x; match body { - NetworkBody::Push(b) => self.write(&mut *writer, b), - NetworkBody::Request(b) => self.write(&mut *writer, b), - NetworkBody::Response(b) => self.write(&mut *writer, b), - NetworkBody::ResponseFinal(b) => self.write(&mut *writer, b), - NetworkBody::Interest(b) => self.write(&mut *writer, b), - NetworkBody::Declare(b) => self.write(&mut *writer, b), - NetworkBody::OAM(b) => self.write(&mut *writer, b), + NetworkBodyRef::Push(b) => self.write(&mut *writer, b), + NetworkBodyRef::Request(b) => self.write(&mut *writer, b), + NetworkBodyRef::Response(b) => self.write(&mut *writer, b), + NetworkBodyRef::ResponseFinal(b) => self.write(&mut *writer, b), + NetworkBodyRef::Interest(b) => self.write(&mut *writer, b), + NetworkBodyRef::Declare(b) => self.write(&mut *writer, b), + NetworkBodyRef::OAM(b) => self.write(&mut *writer, b), } } } diff --git a/commons/zenoh-codec/src/transport/batch.rs b/commons/zenoh-codec/src/transport/batch.rs index d4fd603864..8b40ccbff0 100644 --- a/commons/zenoh-codec/src/transport/batch.rs +++ b/commons/zenoh-codec/src/transport/batch.rs @@ -20,7 +20,7 @@ use zenoh_buffers::{ }; use zenoh_protocol::{ core::Reliability, - network::NetworkMessage, + network::{NetworkMessageExt, NetworkMessageRef}, transport::{ Fragment, FragmentHeader, Frame, FrameHeader, TransportBody, TransportMessage, TransportSn, }, @@ -111,14 +111,14 @@ where } } -impl WCodec<&NetworkMessage, &mut W> for &mut Zenoh080Batch +impl WCodec, &mut W> for &mut Zenoh080Batch where W: Writer + BacktrackableWriter, ::Mark: Copy, { type Output = Result<(), BatchError>; - fn write(self, writer: &mut W, x: &NetworkMessage) -> Self::Output { + fn write(self, writer: &mut W, x: NetworkMessageRef) -> Self::Output { // Eventually update the current frame and sn based on the current status if let (CurrentFrame::Reliable, false) | (CurrentFrame::BestEffort, true) @@ -140,14 +140,14 @@ where } } -impl WCodec<(&NetworkMessage, &FrameHeader), &mut W> for &mut Zenoh080Batch +impl WCodec<(NetworkMessageRef<'_>, &FrameHeader), &mut W> for &mut Zenoh080Batch where W: Writer + BacktrackableWriter, ::Mark: Copy, { type Output = Result<(), BatchError>; - fn write(self, writer: &mut W, x: (&NetworkMessage, &FrameHeader)) -> Self::Output { + fn write(self, writer: &mut W, x: (NetworkMessageRef, &FrameHeader)) -> Self::Output { let (m, f) = x; if let (Reliability::Reliable, false) | (Reliability::BestEffort, true) = diff --git a/commons/zenoh-codec/src/transport/mod.rs b/commons/zenoh-codec/src/transport/mod.rs index 973eac7e1a..a966a1a494 100644 --- a/commons/zenoh-codec/src/transport/mod.rs +++ b/commons/zenoh-codec/src/transport/mod.rs @@ -34,19 +34,19 @@ use zenoh_protocol::{ use crate::{RCodec, WCodec, Zenoh080, Zenoh080Header}; // TransportMessageLowLatency -impl WCodec<&TransportMessageLowLatency, &mut W> for Zenoh080 +impl WCodec, &mut W> for Zenoh080 where W: Writer, { type Output = Result<(), DidntWrite>; - fn write(self, writer: &mut W, x: &TransportMessageLowLatency) -> Self::Output { - let TransportMessageLowLatency { body } = x; + fn write(self, writer: &mut W, x: TransportMessageLowLatencyRef) -> Self::Output { + let TransportMessageLowLatencyRef { body } = x; match body { - TransportBodyLowLatency::Network(b) => self.write(&mut *writer, b), - TransportBodyLowLatency::KeepAlive(b) => self.write(&mut *writer, b), - TransportBodyLowLatency::Close(b) => self.write(&mut *writer, b), + TransportBodyLowLatencyRef::Network(b) => self.write(&mut *writer, b), + TransportBodyLowLatencyRef::KeepAlive(b) => self.write(&mut *writer, &b), + TransportBodyLowLatencyRef::Close(b) => self.write(&mut *writer, &b), } } } diff --git a/commons/zenoh-protocol/src/common/extension.rs b/commons/zenoh-protocol/src/common/extension.rs index 5fc6cf8664..50e7cdd280 100644 --- a/commons/zenoh-protocol/src/common/extension.rs +++ b/commons/zenoh-protocol/src/common/extension.rs @@ -307,8 +307,9 @@ impl Debug for ZExtZBufHeader<{ ID }> { } } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Clone, PartialEq, Eq)] pub enum ZExtBody { + #[default] Unit, Z64(u64), ZBuf(ZBuf), diff --git a/commons/zenoh-protocol/src/network/mod.rs b/commons/zenoh-protocol/src/network/mod.rs index 6cffd9926c..c61664e67d 100644 --- a/commons/zenoh-protocol/src/network/mod.rs +++ b/commons/zenoh-protocol/src/network/mod.rs @@ -30,7 +30,7 @@ pub use push::Push; pub use request::{AtomicRequestId, Request, RequestId}; pub use response::{Response, ResponseFinal}; -use crate::core::{CongestionControl, Priority, Reliability}; +use crate::core::{CongestionControl, Priority, Reliability, WireExpr}; pub mod id { // WARNING: it's crucial that these IDs do NOT collide with the IDs @@ -80,6 +80,28 @@ pub enum NetworkBody { OAM(Oam), } +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum NetworkBodyRef<'a> { + Push(&'a Push), + Request(&'a Request), + Response(&'a Response), + ResponseFinal(&'a ResponseFinal), + Interest(&'a Interest), + Declare(&'a Declare), + OAM(&'a Oam), +} + +#[derive(Debug, PartialEq, Eq)] +pub enum NetworkBodyMut<'a> { + Push(&'a mut Push), + Request(&'a mut Request), + Response(&'a mut Response), + ResponseFinal(&'a mut ResponseFinal), + Interest(&'a mut Interest), + Declare(&'a mut Declare), + OAM(&'a mut Oam), +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct NetworkMessage { pub body: NetworkBody, @@ -88,131 +110,271 @@ pub struct NetworkMessage { pub size: Option, } -impl NetworkMessage { - #[cfg(feature = "test")] - pub fn rand() -> Self { - use rand::Rng; - - let mut rng = rand::thread_rng(); +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct NetworkMessageRef<'a> { + pub body: NetworkBodyRef<'a>, + pub reliability: Reliability, + #[cfg(feature = "stats")] + pub size: Option, +} - let body = match rng.gen_range(0..6) { - 0 => NetworkBody::Push(Push::rand()), - 1 => NetworkBody::Request(Request::rand()), - 2 => NetworkBody::Response(Response::rand()), - 3 => NetworkBody::ResponseFinal(ResponseFinal::rand()), - 4 => NetworkBody::Declare(Declare::rand()), - 5 => NetworkBody::OAM(Oam::rand()), - _ => unreachable!(), - }; +#[derive(Debug, PartialEq, Eq)] +pub struct NetworkMessageMut<'a> { + pub body: NetworkBodyMut<'a>, + pub reliability: Reliability, + #[cfg(feature = "stats")] + pub size: Option, +} - body.into() - } +pub trait NetworkMessageExt { + #[doc(hidden)] + fn body(&self) -> NetworkBodyRef; + #[doc(hidden)] + fn reliability(&self) -> Reliability; + #[cfg(feature = "stats")] + fn size(&self) -> Option; #[inline] - pub fn is_reliable(&self) -> bool { - self.reliability == Reliability::Reliable + fn is_reliable(&self) -> bool { + self.reliability() == Reliability::Reliable } #[inline] - pub fn is_express(&self) -> bool { - match &self.body { - NetworkBody::Push(msg) => msg.ext_qos.is_express(), - NetworkBody::Request(msg) => msg.ext_qos.is_express(), - NetworkBody::Response(msg) => msg.ext_qos.is_express(), - NetworkBody::ResponseFinal(msg) => msg.ext_qos.is_express(), - NetworkBody::Interest(msg) => msg.ext_qos.is_express(), - NetworkBody::Declare(msg) => msg.ext_qos.is_express(), - NetworkBody::OAM(msg) => msg.ext_qos.is_express(), + fn is_express(&self) -> bool { + match self.body() { + NetworkBodyRef::Push(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::Request(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::Response(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::ResponseFinal(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::Interest(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::Declare(msg) => msg.ext_qos.is_express(), + NetworkBodyRef::OAM(msg) => msg.ext_qos.is_express(), } } #[inline] - pub fn is_droppable(&self) -> bool { + fn is_droppable(&self) -> bool { if !self.is_reliable() { return true; } - let cc = match &self.body { - NetworkBody::Push(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::Request(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::Response(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::ResponseFinal(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::Interest(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::Declare(msg) => msg.ext_qos.get_congestion_control(), - NetworkBody::OAM(msg) => msg.ext_qos.get_congestion_control(), + let cc = match self.body() { + NetworkBodyRef::Push(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::Request(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::Response(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::ResponseFinal(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::Interest(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::Declare(msg) => msg.ext_qos.get_congestion_control(), + NetworkBodyRef::OAM(msg) => msg.ext_qos.get_congestion_control(), }; cc == CongestionControl::Drop } #[inline] - pub fn priority(&self) -> Priority { + fn priority(&self) -> Priority { + match self.body() { + NetworkBodyRef::Push(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::Request(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::Response(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::ResponseFinal(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::Interest(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::Declare(msg) => msg.ext_qos.get_priority(), + NetworkBodyRef::OAM(msg) => msg.ext_qos.get_priority(), + } + } + + #[inline] + fn wire_expr(&self) -> Option<&WireExpr> { + match &self.body() { + NetworkBodyRef::Push(m) => Some(&m.wire_expr), + NetworkBodyRef::Request(m) => Some(&m.wire_expr), + NetworkBodyRef::Response(m) => Some(&m.wire_expr), + NetworkBodyRef::ResponseFinal(_) => None, + NetworkBodyRef::Interest(m) => m.wire_expr.as_ref(), + NetworkBodyRef::Declare(m) => match &m.body { + DeclareBody::DeclareKeyExpr(m) => Some(&m.wire_expr), + DeclareBody::UndeclareKeyExpr(_) => None, + DeclareBody::DeclareSubscriber(m) => Some(&m.wire_expr), + DeclareBody::UndeclareSubscriber(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareQueryable(m) => Some(&m.wire_expr), + DeclareBody::UndeclareQueryable(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareToken(m) => Some(&m.wire_expr), + DeclareBody::UndeclareToken(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareFinal(_) => None, + }, + NetworkBodyRef::OAM(_) => None, + } + } + + #[inline] + fn as_ref(&self) -> NetworkMessageRef { + NetworkMessageRef { + body: self.body(), + reliability: self.reliability(), + #[cfg(feature = "stats")] + size: self.size(), + } + } +} + +impl NetworkMessageExt for NetworkMessage { + fn body(&self) -> NetworkBodyRef { match &self.body { - NetworkBody::Push(msg) => msg.ext_qos.get_priority(), - NetworkBody::Request(msg) => msg.ext_qos.get_priority(), - NetworkBody::Response(msg) => msg.ext_qos.get_priority(), - NetworkBody::ResponseFinal(msg) => msg.ext_qos.get_priority(), - NetworkBody::Interest(msg) => msg.ext_qos.get_priority(), - NetworkBody::Declare(msg) => msg.ext_qos.get_priority(), - NetworkBody::OAM(msg) => msg.ext_qos.get_priority(), + NetworkBody::Push(body) => NetworkBodyRef::Push(body), + NetworkBody::Request(body) => NetworkBodyRef::Request(body), + NetworkBody::Response(body) => NetworkBodyRef::Response(body), + NetworkBody::ResponseFinal(body) => NetworkBodyRef::ResponseFinal(body), + NetworkBody::Interest(body) => NetworkBodyRef::Interest(body), + NetworkBody::Declare(body) => NetworkBodyRef::Declare(body), + NetworkBody::OAM(body) => NetworkBodyRef::OAM(body), } } + + fn reliability(&self) -> Reliability { + self.reliability + } + + #[cfg(feature = "stats")] + fn size(&self) -> Option { + self.size + } } -impl fmt::Display for NetworkMessage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use NetworkBody::*; +impl<'a> NetworkMessageExt for NetworkMessageRef<'a> { + fn body(&self) -> NetworkBodyRef { + self.body + } + + fn reliability(&self) -> Reliability { + self.reliability + } + + #[cfg(feature = "stats")] + fn size(&self) -> Option { + self.size + } +} + +impl<'a> NetworkMessageExt for NetworkMessageMut<'a> { + fn body(&self) -> NetworkBodyRef { match &self.body { - OAM(_) => write!(f, "OAM"), - Push(_) => write!(f, "Push"), - Request(_) => write!(f, "Request"), - Response(_) => write!(f, "Response"), - ResponseFinal(_) => write!(f, "ResponseFinal"), - Interest(_) => write!(f, "Interest"), - Declare(_) => write!(f, "Declare"), + NetworkBodyMut::Push(body) => NetworkBodyRef::Push(body), + NetworkBodyMut::Request(body) => NetworkBodyRef::Request(body), + NetworkBodyMut::Response(body) => NetworkBodyRef::Response(body), + NetworkBodyMut::ResponseFinal(body) => NetworkBodyRef::ResponseFinal(body), + NetworkBodyMut::Interest(body) => NetworkBodyRef::Interest(body), + NetworkBodyMut::Declare(body) => NetworkBodyRef::Declare(body), + NetworkBodyMut::OAM(body) => NetworkBodyRef::OAM(body), } } + + fn reliability(&self) -> Reliability { + self.reliability + } + + #[cfg(feature = "stats")] + fn size(&self) -> Option { + self.size + } } -impl From for NetworkMessage { +impl NetworkMessage { + #[cfg(feature = "test")] + pub fn rand() -> Self { + use rand::Rng; + + let mut rng = rand::thread_rng(); + + let body = match rng.gen_range(0..6) { + 0 => NetworkBody::Push(Push::rand()), + 1 => NetworkBody::Request(Request::rand()), + 2 => NetworkBody::Response(Response::rand()), + 3 => NetworkBody::ResponseFinal(ResponseFinal::rand()), + 4 => NetworkBody::Declare(Declare::rand()), + 5 => NetworkBody::OAM(Oam::rand()), + _ => unreachable!(), + }; + + body.into() + } + #[inline] - fn from(body: NetworkBody) -> Self { - Self { + pub fn as_mut(&mut self) -> NetworkMessageMut { + let body = match &mut self.body { + NetworkBody::Push(body) => NetworkBodyMut::Push(body), + NetworkBody::Request(body) => NetworkBodyMut::Request(body), + NetworkBody::Response(body) => NetworkBodyMut::Response(body), + NetworkBody::ResponseFinal(body) => NetworkBodyMut::ResponseFinal(body), + NetworkBody::Interest(body) => NetworkBodyMut::Interest(body), + NetworkBody::Declare(body) => NetworkBodyMut::Declare(body), + NetworkBody::OAM(body) => NetworkBodyMut::OAM(body), + }; + NetworkMessageMut { body, - reliability: Reliability::DEFAULT, + reliability: self.reliability, #[cfg(feature = "stats")] - size: None, + size: self.size, } } } -impl From for NetworkMessage { - fn from(declare: Declare) -> Self { - NetworkBody::Declare(declare).into() +impl NetworkMessageMut<'_> { + #[inline] + pub fn as_mut(&mut self) -> NetworkMessageMut { + let body = match &mut self.body { + NetworkBodyMut::Push(body) => NetworkBodyMut::Push(body), + NetworkBodyMut::Request(body) => NetworkBodyMut::Request(body), + NetworkBodyMut::Response(body) => NetworkBodyMut::Response(body), + NetworkBodyMut::ResponseFinal(body) => NetworkBodyMut::ResponseFinal(body), + NetworkBodyMut::Interest(body) => NetworkBodyMut::Interest(body), + NetworkBodyMut::Declare(body) => NetworkBodyMut::Declare(body), + NetworkBodyMut::OAM(body) => NetworkBodyMut::OAM(body), + }; + NetworkMessageMut { + body, + reliability: self.reliability, + #[cfg(feature = "stats")] + size: self.size, + } } } -impl From for NetworkMessage { - fn from(push: Push) -> Self { - NetworkBody::Push(push).into() +impl fmt::Display for NetworkMessageRef<'_> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match &self.body { + NetworkBodyRef::OAM(_) => write!(f, "OAM"), + NetworkBodyRef::Push(_) => write!(f, "Push"), + NetworkBodyRef::Request(_) => write!(f, "Request"), + NetworkBodyRef::Response(_) => write!(f, "Response"), + NetworkBodyRef::ResponseFinal(_) => write!(f, "ResponseFinal"), + NetworkBodyRef::Interest(_) => write!(f, "Interest"), + NetworkBodyRef::Declare(_) => write!(f, "Declare"), + } } } -impl From for NetworkMessage { - fn from(request: Request) -> Self { - NetworkBody::Request(request).into() +impl fmt::Display for NetworkMessage { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.as_ref().fmt(f) } } -impl From for NetworkMessage { - fn from(response: Response) -> Self { - NetworkBody::Response(response).into() +impl fmt::Display for NetworkMessageMut<'_> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.as_ref().fmt(f) } } -impl From for NetworkMessage { - fn from(final_response: ResponseFinal) -> Self { - NetworkBody::ResponseFinal(final_response).into() +impl From for NetworkMessage { + #[inline] + fn from(body: NetworkBody) -> Self { + Self { + body, + reliability: Reliability::DEFAULT, + #[cfg(feature = "stats")] + size: None, + } } } diff --git a/commons/zenoh-protocol/src/transport/close.rs b/commons/zenoh-protocol/src/transport/close.rs index cfdb60b211..8c854fc647 100644 --- a/commons/zenoh-protocol/src/transport/close.rs +++ b/commons/zenoh-protocol/src/transport/close.rs @@ -80,7 +80,7 @@ pub fn reason_to_str(reason: u8) -> &'static str { /// the boundary of the serialized messages. The length is encoded as little-endian. /// In any case, the length of a message must not exceed 65535 bytes. /// -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Close { pub reason: u8, pub session: bool, diff --git a/commons/zenoh-protocol/src/transport/keepalive.rs b/commons/zenoh-protocol/src/transport/keepalive.rs index 33903e3958..eea86e3ea5 100644 --- a/commons/zenoh-protocol/src/transport/keepalive.rs +++ b/commons/zenoh-protocol/src/transport/keepalive.rs @@ -81,7 +81,7 @@ pub mod flag { /// the boundary of the serialized messages. The length is encoded as little-endian. /// In any case, the length of a message must not exceed 65535 bytes. /// -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct KeepAlive; impl KeepAlive { diff --git a/commons/zenoh-protocol/src/transport/mod.rs b/commons/zenoh-protocol/src/transport/mod.rs index d534fef04a..2dde0fa6e0 100644 --- a/commons/zenoh-protocol/src/transport/mod.rs +++ b/commons/zenoh-protocol/src/transport/mod.rs @@ -31,7 +31,7 @@ pub use keepalive::KeepAlive; pub use oam::Oam; pub use open::{OpenAck, OpenSyn}; -use crate::network::NetworkMessage; +use crate::network::{NetworkMessage, NetworkMessageRef}; /// NOTE: 16 bits (2 bytes) may be prepended to the serialized message indicating the total length /// in bytes of the message, resulting in the maximum length of a message being 65_535 bytes. @@ -66,6 +66,11 @@ pub struct TransportMessageLowLatency { pub body: TransportBodyLowLatency, } +#[derive(Debug, Clone, Copy)] +pub struct TransportMessageLowLatencyRef<'a> { + pub body: TransportBodyLowLatencyRef<'a>, +} + impl TryFrom for TransportMessageLowLatency { type Error = zenoh_result::Error; fn try_from(msg: NetworkMessage) -> Result { @@ -83,6 +88,14 @@ pub enum TransportBodyLowLatency { Network(NetworkMessage), } +#[allow(clippy::large_enum_variant)] +#[derive(Debug, Clone, Copy)] +pub enum TransportBodyLowLatencyRef<'a> { + Close(Close), + KeepAlive(KeepAlive), + Network(NetworkMessageRef<'a>), +} + pub type TransportSn = u32; #[derive(Debug, Copy, Clone, PartialEq, Eq)] diff --git a/examples/examples/z_put.rs b/examples/examples/z_put.rs index ea2bb72e8e..2b4098aeca 100644 --- a/examples/examples/z_put.rs +++ b/examples/examples/z_put.rs @@ -12,7 +12,7 @@ // ZettaScale Zenoh Team, // use clap::Parser; -use zenoh::{key_expr::KeyExpr, Config}; +use zenoh::{key_expr::KeyExpr, Config, Wait}; use zenoh_examples::CommonArgs; #[tokio::main] diff --git a/io/zenoh-transport/src/common/batch.rs b/io/zenoh-transport/src/common/batch.rs index 0a0a41cf91..b46d4e86d6 100644 --- a/io/zenoh-transport/src/common/batch.rs +++ b/io/zenoh-transport/src/common/batch.rs @@ -24,7 +24,7 @@ use zenoh_codec::{ RCodec, WCodec, }; use zenoh_protocol::{ - network::NetworkMessage, + network::NetworkMessageRef, transport::{fragment::FragmentHeader, frame::FrameHeader, BatchSize, TransportMessage}, }; use zenoh_result::{zerror, ZResult}; @@ -374,19 +374,19 @@ impl Encode<&TransportMessage> for &mut WBatch { } } -impl Encode<&NetworkMessage> for &mut WBatch { +impl Encode> for &mut WBatch { type Output = Result<(), BatchError>; - fn encode(self, x: &NetworkMessage) -> Self::Output { + fn encode(self, x: NetworkMessageRef) -> Self::Output { let mut writer = self.buffer.writer(); self.codec.write(&mut writer, x) } } -impl Encode<(&NetworkMessage, &FrameHeader)> for &mut WBatch { +impl Encode<(NetworkMessageRef<'_>, &FrameHeader)> for &mut WBatch { type Output = Result<(), BatchError>; - fn encode(self, x: (&NetworkMessage, &FrameHeader)) -> Self::Output { + fn encode(self, x: (NetworkMessageRef, &FrameHeader)) -> Self::Output { let mut writer = self.buffer.writer(); let res = self.codec.write(&mut writer, x); #[cfg(feature = "stats")] diff --git a/io/zenoh-transport/src/common/pipeline.rs b/io/zenoh-transport/src/common/pipeline.rs index 0e814687bb..486cd0b5ac 100644 --- a/io/zenoh-transport/src/common/pipeline.rs +++ b/io/zenoh-transport/src/common/pipeline.rs @@ -33,7 +33,7 @@ use zenoh_config::{QueueAllocConf, QueueAllocMode, QueueSizeConf}; use zenoh_core::zlock; use zenoh_protocol::{ core::Priority, - network::NetworkMessage, + network::{NetworkMessageExt, NetworkMessageRef}, transport::{ fragment, fragment::FragmentHeader, @@ -273,7 +273,7 @@ struct StageIn { impl StageIn { fn push_network_message( &mut self, - msg: &NetworkMessage, + msg: NetworkMessageRef, priority: Priority, deadline: &mut Deadline, ) -> Result { @@ -808,7 +808,7 @@ impl TransmissionPipelineProducer { #[inline] pub(crate) fn push_network_message( &self, - msg: NetworkMessage, + msg: NetworkMessageRef, ) -> Result { // If the queue is not QoS, it means that we only have one priority with index 0. let (idx, priority) = if self.stage_in.len() > 1 { @@ -835,14 +835,14 @@ impl TransmissionPipelineProducer { if msg.is_droppable() && self.status.is_congested(priority) { return Ok(false); } - let mut sent = queue.push_network_message(&msg, priority, &mut deadline)?; + let mut sent = queue.push_network_message(msg, priority, &mut deadline)?; // If the message cannot be sent, mark the pipeline as congested. if !sent { self.status.set_congested(priority, true); // During the time between deadline wakeup and setting the congested flag, // all batches could have been refilled (especially if there is a single one), // so try again with the same already expired deadline. - sent = queue.push_network_message(&msg, priority, &mut deadline)?; + sent = queue.push_network_message(msg, priority, &mut deadline)?; // If the message is sent in the end, reset the status. // Setting the status to `true` is only done with the stage_in mutex acquired, // so it is not possible that further messages see the congestion flag set @@ -1073,7 +1073,7 @@ mod tests { "Pipeline Flow [>>>]: Pushed {} msgs ({payload_size} bytes)", i + 1 ); - queue.push_network_message(message.clone()).unwrap(); + queue.push_network_message(message.as_ref()).unwrap(); } } @@ -1202,7 +1202,7 @@ mod tests { println!( "Pipeline Blocking [>>>]: ({id}) Scheduling message #{i} with payload size of {payload_size} bytes" ); - queue.push_network_message(message.clone()).unwrap(); + queue.push_network_message(message.as_ref()).unwrap(); let c = counter.fetch_add(1, Ordering::AcqRel); println!( "Pipeline Blocking [>>>]: ({}) Scheduled message #{} (tot {}) with payload size of {} bytes", @@ -1316,7 +1316,7 @@ mod tests { let duration = Duration::from_millis(5_500); let start = Instant::now(); while start.elapsed() < duration { - producer.push_network_message(message.clone()).unwrap(); + producer.push_network_message(message.as_ref()).unwrap(); } } } @@ -1372,9 +1372,9 @@ mod tests { } .into(); // First message should not be rejected as the is one batch available in the queue - assert!(producer.push_network_message(message.clone()).is_ok()); + assert!(producer.push_network_message(message.as_ref()).is_ok()); // Second message should be rejected - assert!(producer.push_network_message(message.clone()).is_err()); + assert!(producer.push_network_message(message.as_ref()).is_err()); Ok(()) } diff --git a/io/zenoh-transport/src/lib.rs b/io/zenoh-transport/src/lib.rs index f004b4d511..b0ecdfaf61 100644 --- a/io/zenoh-transport/src/lib.rs +++ b/io/zenoh-transport/src/lib.rs @@ -35,7 +35,7 @@ use serde::Serialize; use zenoh_link::Link; use zenoh_protocol::{ core::{WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, }; use zenoh_result::ZResult; @@ -116,7 +116,7 @@ pub struct TransportPeer { } pub trait TransportPeerEventHandler: Send + Sync { - fn handle_message(&self, msg: NetworkMessage) -> ZResult<()>; + fn handle_message(&self, msg: NetworkMessageMut) -> ZResult<()>; fn new_link(&self, src: Link); fn del_link(&self, link: Link); fn closed(&self); @@ -128,7 +128,7 @@ pub trait TransportPeerEventHandler: Send + Sync { pub struct DummyTransportPeerEventHandler; impl TransportPeerEventHandler for DummyTransportPeerEventHandler { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } diff --git a/io/zenoh-transport/src/multicast/mod.rs b/io/zenoh-transport/src/multicast/mod.rs index cd76176b50..5dd74accff 100644 --- a/io/zenoh-transport/src/multicast/mod.rs +++ b/io/zenoh-transport/src/multicast/mod.rs @@ -31,7 +31,7 @@ use zenoh_core::{zcondfeat, zread}; use zenoh_link::Link; use zenoh_protocol::{ core::Bits, - network::NetworkMessage, + network::NetworkMessageMut, transport::{close, PrioritySn}, }; use zenoh_result::{zerror, ZResult}; @@ -111,17 +111,12 @@ impl TransportMulticast { } #[inline(always)] - pub fn schedule(&self, message: NetworkMessage) -> ZResult<()> { + pub fn schedule(&self, message: NetworkMessageMut) -> ZResult<()> { let transport = self.get_transport()?; transport.schedule(message)?; Ok(()) } - #[inline(always)] - pub fn handle_message(&self, message: NetworkMessage) -> ZResult<()> { - self.schedule(message) - } - #[cfg(feature = "stats")] pub fn get_stats(&self) -> ZResult> { Ok(self.get_transport()?.stats.clone()) diff --git a/io/zenoh-transport/src/multicast/rx.rs b/io/zenoh-transport/src/multicast/rx.rs index a9b514dfce..e4f8e331d9 100644 --- a/io/zenoh-transport/src/multicast/rx.rs +++ b/io/zenoh-transport/src/multicast/rx.rs @@ -52,7 +52,7 @@ impl TransportMulticastInner { } } - peer.handler.handle_message(msg) + peer.handler.handle_message(msg.as_mut()) } pub(super) fn handle_join_from_peer( diff --git a/io/zenoh-transport/src/multicast/tx.rs b/io/zenoh-transport/src/multicast/tx.rs index dec3f4a8a9..8b79761f4b 100644 --- a/io/zenoh-transport/src/multicast/tx.rs +++ b/io/zenoh-transport/src/multicast/tx.rs @@ -12,7 +12,7 @@ // ZettaScale Zenoh Team, // use zenoh_core::zread; -use zenoh_protocol::network::NetworkMessage; +use zenoh_protocol::network::{NetworkMessageExt, NetworkMessageMut, NetworkMessageRef}; use zenoh_result::ZResult; use super::transport::TransportMulticastInner; @@ -21,23 +21,14 @@ use crate::shm::map_zmsg_to_partner; //noinspection ALL impl TransportMulticastInner { - fn schedule_on_link(&self, msg: NetworkMessage) -> ZResult { - macro_rules! zpush { - ($guard:expr, $pipeline:expr, $msg:expr) => { - // Drop the guard before the push_zenoh_message since - // the link could be congested and this operation could - // block for fairly long time - let pl = $pipeline.clone(); - drop($guard); - return Ok(pl.push_network_message($msg)?); - }; - } - + fn schedule_on_link(&self, msg: NetworkMessageRef) -> ZResult { let guard = zread!(self.link); match guard.as_ref() { Some(l) => { if let Some(pl) = l.pipeline.as_ref() { - zpush!(guard, pl, msg); + let pl = pl.clone(); + drop(guard); + return Ok(pl.push_network_message(msg)?); } } None => { @@ -54,7 +45,7 @@ impl TransportMulticastInner { #[allow(unused_mut)] // When feature "shared-memory" is not enabled #[allow(clippy::let_and_return)] // When feature "stats" is not enabled #[inline(always)] - pub(super) fn schedule(&self, mut msg: NetworkMessage) -> ZResult { + pub(super) fn schedule(&self, mut msg: NetworkMessageMut) -> ZResult { #[cfg(feature = "shared-memory")] { if let Err(e) = map_zmsg_to_partner(&mut msg, &self.shm) { @@ -63,7 +54,7 @@ impl TransportMulticastInner { } } - let res = self.schedule_on_link(msg)?; + let res = self.schedule_on_link(msg.as_ref())?; #[cfg(feature = "stats")] if res { diff --git a/io/zenoh-transport/src/shm.rs b/io/zenoh-transport/src/shm.rs index 35aa2c7396..82cd8024d1 100644 --- a/io/zenoh-transport/src/shm.rs +++ b/io/zenoh-transport/src/shm.rs @@ -17,7 +17,9 @@ use zenoh_buffers::{reader::HasReader, writer::HasWriter, ZBuf, ZSlice, ZSliceKi use zenoh_codec::{RCodec, WCodec, Zenoh080}; use zenoh_core::zerror; use zenoh_protocol::{ - network::{NetworkBody, NetworkMessage, Push, Request, Response}, + network::{ + NetworkBody, NetworkBodyMut, NetworkMessage, NetworkMessageMut, Push, Request, Response, + }, zenoh::{ err::Err, ext::ShmType, @@ -59,25 +61,25 @@ impl PartnerShmConfig for MulticastTransportShmConfig { } pub fn map_zmsg_to_partner( - msg: &mut NetworkMessage, + msg: &mut NetworkMessageMut, partner_shm_cfg: &Option, ) -> ZResult<()> { match &mut msg.body { - NetworkBody::Push(Push { payload, .. }) => match payload { + NetworkBodyMut::Push(Push { payload, .. }) => match payload { PushBody::Put(b) => b.map_to_partner(partner_shm_cfg), PushBody::Del(_) => Ok(()), }, - NetworkBody::Request(Request { payload, .. }) => match payload { + NetworkBodyMut::Request(Request { payload, .. }) => match payload { RequestBody::Query(b) => b.map_to_partner(partner_shm_cfg), }, - NetworkBody::Response(Response { payload, .. }) => match payload { + NetworkBodyMut::Response(Response { payload, .. }) => match payload { ResponseBody::Reply(b) => b.map_to_partner(partner_shm_cfg), ResponseBody::Err(b) => b.map_to_partner(partner_shm_cfg), }, - NetworkBody::ResponseFinal(_) - | NetworkBody::Interest(_) - | NetworkBody::Declare(_) - | NetworkBody::OAM(_) => Ok(()), + NetworkBodyMut::ResponseFinal(_) + | NetworkBodyMut::Interest(_) + | NetworkBodyMut::Declare(_) + | NetworkBodyMut::OAM(_) => Ok(()), } } diff --git a/io/zenoh-transport/src/unicast/lowlatency/link.rs b/io/zenoh-transport/src/unicast/lowlatency/link.rs index 3b7514d7ff..542231e8bd 100644 --- a/io/zenoh-transport/src/unicast/lowlatency/link.rs +++ b/io/zenoh-transport/src/unicast/lowlatency/link.rs @@ -19,7 +19,9 @@ use zenoh_buffers::{writer::HasWriter, ZSlice}; use zenoh_codec::*; use zenoh_core::{zasyncread, zasyncwrite}; use zenoh_link::LinkUnicast; -use zenoh_protocol::transport::{KeepAlive, TransportBodyLowLatency, TransportMessageLowLatency}; +use zenoh_protocol::transport::{ + KeepAlive, TransportBodyLowLatencyRef, TransportMessageLowLatencyRef, +}; use zenoh_result::{zerror, ZResult}; use zenoh_runtime::ZRuntime; @@ -30,7 +32,7 @@ use crate::unicast::link::{TransportLinkUnicast, TransportLinkUnicastRx}; pub(crate) async fn send_with_link( link: &LinkUnicast, - msg: TransportMessageLowLatency, + msg: TransportMessageLowLatencyRef<'_>, #[cfg(feature = "stats")] stats: &Arc, ) -> ZResult<()> { let len; @@ -39,7 +41,7 @@ pub(crate) async fn send_with_link( let mut buffer = vec![0, 0, 0, 0]; let mut writer = buffer.writer(); codec - .write(&mut writer, &msg) + .write(&mut writer, msg) .map_err(|_| zerror!("Error serializing message {:?}", msg))?; len = (buffer.len() - 4) as u32; @@ -52,7 +54,7 @@ pub(crate) async fn send_with_link( let mut buffer = vec![]; let mut writer = buffer.writer(); codec - .write(&mut writer, &msg) + .write(&mut writer, msg) .map_err(|_| zerror!("Error serializing message {:?}", msg))?; #[cfg(feature = "stats")] @@ -93,11 +95,11 @@ pub(crate) async fn read_with_link( } impl TransportUnicastLowlatency { - pub(super) fn send(&self, msg: TransportMessageLowLatency) -> ZResult<()> { + pub(super) fn send(&self, msg: TransportMessageLowLatencyRef) -> ZResult<()> { zenoh_runtime::ZRuntime::TX.block_in_place(self.send_async(msg)) } - pub(super) async fn send_async(&self, msg: TransportMessageLowLatency) -> ZResult<()> { + pub(super) async fn send_async(&self, msg: TransportMessageLowLatencyRef<'_>) -> ZResult<()> { let guard = zasyncwrite!(self.link); let link = &guard.as_ref().ok_or_else(|| zerror!("No link"))?.link; send_with_link( @@ -233,8 +235,8 @@ async fn keepalive_task( loop { tokio::select! { _ = interval.tick() => { - let keepailve = TransportMessageLowLatency { - body: TransportBodyLowLatency::KeepAlive(KeepAlive), + let keepailve = TransportMessageLowLatencyRef { + body: TransportBodyLowLatencyRef::KeepAlive(KeepAlive), }; let guard = zasyncwrite!(link); diff --git a/io/zenoh-transport/src/unicast/lowlatency/rx.rs b/io/zenoh-transport/src/unicast/lowlatency/rx.rs index 3dd499000d..4716327a24 100644 --- a/io/zenoh-transport/src/unicast/lowlatency/rx.rs +++ b/io/zenoh-transport/src/unicast/lowlatency/rx.rs @@ -43,7 +43,7 @@ impl TransportUnicastLowlatency { } } } - callback.handle_message(msg) + callback.handle_message(msg.as_mut()) } else { tracing::debug!( "Transport: {}. No callback available, dropping message: {}", diff --git a/io/zenoh-transport/src/unicast/lowlatency/transport.rs b/io/zenoh-transport/src/unicast/lowlatency/transport.rs index 6b1b588c4f..f632f9b426 100644 --- a/io/zenoh-transport/src/unicast/lowlatency/transport.rs +++ b/io/zenoh-transport/src/unicast/lowlatency/transport.rs @@ -23,8 +23,10 @@ use zenoh_core::{zasynclock, zasyncread, zasyncwrite, zread, zwrite}; use zenoh_link::Link; use zenoh_protocol::{ core::{WhatAmI, ZenohIdProto}, - network::NetworkMessage, - transport::{close, Close, TransportBodyLowLatency, TransportMessageLowLatency, TransportSn}, + network::NetworkMessageMut, + transport::{ + close, Close, TransportBodyLowLatencyRef, TransportMessageLowLatencyRef, TransportSn, + }, }; use zenoh_result::{zerror, ZResult}; @@ -95,8 +97,8 @@ impl TransportUnicastLowlatency { ); // Send close message on the link - let close = TransportMessageLowLatency { - body: TransportBodyLowLatency::Close(Close { + let close = TransportMessageLowLatencyRef { + body: TransportBodyLowLatencyRef::Close(Close { reason, session: false, }), @@ -227,7 +229,7 @@ impl TransportUnicastTrait for TransportUnicastLowlatency { /*************************************/ /* TX */ /*************************************/ - fn schedule(&self, msg: NetworkMessage) -> ZResult<()> { + fn schedule(&self, msg: NetworkMessageMut) -> ZResult<()> { self.internal_schedule(msg) } diff --git a/io/zenoh-transport/src/unicast/lowlatency/tx.rs b/io/zenoh-transport/src/unicast/lowlatency/tx.rs index 90304a196d..0cd268189d 100644 --- a/io/zenoh-transport/src/unicast/lowlatency/tx.rs +++ b/io/zenoh-transport/src/unicast/lowlatency/tx.rs @@ -12,8 +12,8 @@ // ZettaScale Zenoh Team, // use zenoh_protocol::{ - network::NetworkMessage, - transport::{TransportBodyLowLatency, TransportMessageLowLatency}, + network::{NetworkMessageExt, NetworkMessageMut}, + transport::{TransportBodyLowLatencyRef, TransportMessageLowLatencyRef}, }; #[cfg(feature = "shared-memory")] use zenoh_result::bail; @@ -27,7 +27,7 @@ impl TransportUnicastLowlatency { #[allow(unused_mut)] // When feature "shared-memory" is not enabled #[allow(clippy::let_and_return)] // When feature "stats" is not enabled #[inline(always)] - pub(crate) fn internal_schedule(&self, mut msg: NetworkMessage) -> ZResult<()> { + pub(crate) fn internal_schedule(&self, mut msg: NetworkMessageMut) -> ZResult<()> { #[cfg(feature = "shared-memory")] { if let Err(e) = map_zmsg_to_partner(&mut msg, &self.config.shm) { @@ -35,8 +35,8 @@ impl TransportUnicastLowlatency { } } - let msg = TransportMessageLowLatency { - body: TransportBodyLowLatency::Network(msg), + let msg = TransportMessageLowLatencyRef { + body: TransportBodyLowLatencyRef::Network(msg.as_ref()), }; let res = self.send(msg); diff --git a/io/zenoh-transport/src/unicast/mod.rs b/io/zenoh-transport/src/unicast/mod.rs index dfd8eef55f..8c6df08f09 100644 --- a/io/zenoh-transport/src/unicast/mod.rs +++ b/io/zenoh-transport/src/unicast/mod.rs @@ -33,7 +33,7 @@ use zenoh_core::zcondfeat; use zenoh_link::Link; use zenoh_protocol::{ core::{Bits, WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, transport::{close, init::ext::PatchType, TransportSn}, }; use zenoh_result::{zerror, ZResult}; @@ -129,7 +129,7 @@ impl TransportUnicast { } #[inline(always)] - pub fn schedule(&self, message: NetworkMessage) -> ZResult<()> { + pub fn schedule(&self, message: NetworkMessageMut) -> ZResult<()> { let transport = self.get_inner()?; transport.schedule(message) } diff --git a/io/zenoh-transport/src/unicast/transport_unicast_inner.rs b/io/zenoh-transport/src/unicast/transport_unicast_inner.rs index 4aae5ee742..a651050206 100644 --- a/io/zenoh-transport/src/unicast/transport_unicast_inner.rs +++ b/io/zenoh-transport/src/unicast/transport_unicast_inner.rs @@ -19,7 +19,7 @@ use tokio::sync::MutexGuard as AsyncMutexGuard; use zenoh_link::Link; use zenoh_protocol::{ core::{WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, transport::TransportSn, }; use zenoh_result::ZResult; @@ -84,7 +84,7 @@ pub(crate) trait TransportUnicastTrait: Send + Sync { /*************************************/ /* TX */ /*************************************/ - fn schedule(&self, msg: NetworkMessage) -> ZResult<()>; + fn schedule(&self, msg: NetworkMessageMut) -> ZResult<()>; /*************************************/ /* TERMINATION */ diff --git a/io/zenoh-transport/src/unicast/universal/rx.rs b/io/zenoh-transport/src/unicast/universal/rx.rs index 11f1807819..2b1a146b03 100644 --- a/io/zenoh-transport/src/unicast/universal/rx.rs +++ b/io/zenoh-transport/src/unicast/universal/rx.rs @@ -52,7 +52,7 @@ impl TransportUnicastUniversal { } } } - callback.handle_message(msg) + callback.handle_message(msg.as_mut()) } fn handle_close(&self, link: &Link, _reason: u8, session: bool) -> ZResult<()> { diff --git a/io/zenoh-transport/src/unicast/universal/transport.rs b/io/zenoh-transport/src/unicast/universal/transport.rs index e900b4b919..17fd944c80 100644 --- a/io/zenoh-transport/src/unicast/universal/transport.rs +++ b/io/zenoh-transport/src/unicast/universal/transport.rs @@ -23,7 +23,7 @@ use zenoh_core::{zasynclock, zcondfeat, zread, zwrite}; use zenoh_link::Link; use zenoh_protocol::{ core::{Priority, WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, transport::{close, Close, PrioritySn, TransportMessage, TransportSn}, }; use zenoh_result::{bail, zerror, ZResult}; @@ -398,7 +398,7 @@ impl TransportUnicastTrait for TransportUnicastUniversal { /*************************************/ /* TX */ /*************************************/ - fn schedule(&self, msg: NetworkMessage) -> ZResult<()> { + fn schedule(&self, msg: NetworkMessageMut) -> ZResult<()> { self.internal_schedule(msg).map(|_| ()) } diff --git a/io/zenoh-transport/src/unicast/universal/tx.rs b/io/zenoh-transport/src/unicast/universal/tx.rs index 9442bdd1c5..ad8b300136 100644 --- a/io/zenoh-transport/src/unicast/universal/tx.rs +++ b/io/zenoh-transport/src/unicast/universal/tx.rs @@ -13,7 +13,7 @@ // use zenoh_protocol::{ core::{Priority, PriorityRange, Reliability}, - network::NetworkMessage, + network::{NetworkMessageExt, NetworkMessageMut, NetworkMessageRef}, transport::close, }; use zenoh_result::ZResult; @@ -69,7 +69,7 @@ impl TransportUnicastUniversal { match_.full.or(match_.partial).or(match_.any) } - fn schedule_on_link(&self, msg: NetworkMessage) -> ZResult { + fn schedule_on_link(&self, msg: NetworkMessageRef) -> ZResult { let transport_links = self .links .read() @@ -138,7 +138,7 @@ impl TransportUnicastUniversal { #[allow(unused_mut)] // When feature "shared-memory" is not enabled #[allow(clippy::let_and_return)] // When feature "stats" is not enabled #[inline(always)] - pub(crate) fn internal_schedule(&self, mut msg: NetworkMessage) -> ZResult { + pub(crate) fn internal_schedule(&self, mut msg: NetworkMessageMut) -> ZResult { #[cfg(feature = "shared-memory")] { if let Err(e) = map_zmsg_to_partner(&mut msg, &self.config.shm) { @@ -147,7 +147,7 @@ impl TransportUnicastUniversal { } } - let res = self.schedule_on_link(msg)?; + let res = self.schedule_on_link(msg.as_ref())?; #[cfg(feature = "stats")] if res { diff --git a/zenoh/src/api/admin.rs b/zenoh/src/api/admin.rs index 28808ee664..eaf32f2edf 100644 --- a/zenoh/src/api/admin.rs +++ b/zenoh/src/api/admin.rs @@ -22,7 +22,7 @@ use zenoh_keyexpr::keyexpr; use zenoh_macros::ke; #[cfg(feature = "unstable")] use zenoh_protocol::core::Reliability; -use zenoh_protocol::{core::WireExpr, network::NetworkMessage}; +use zenoh_protocol::{core::WireExpr, network::NetworkMessageMut}; use zenoh_transport::{ TransportEventHandler, TransportMulticastEventHandler, TransportPeer, TransportPeerEventHandler, }; @@ -231,7 +231,7 @@ pub(crate) struct PeerHandler { } impl TransportPeerEventHandler for PeerHandler { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { Ok(()) } diff --git a/zenoh/src/api/builders/reply.rs b/zenoh/src/api/builders/reply.rs index 3abb6c6b62..dcc49abea1 100644 --- a/zenoh/src/api/builders/reply.rs +++ b/zenoh/src/api/builders/reply.rs @@ -252,7 +252,7 @@ impl Resolvable for ReplyErrBuilder<'_> { impl Wait for ReplyErrBuilder<'_> { fn wait(self) -> ::To { - self.query.inner.primitives.send_response(Response { + self.query.inner.primitives.send_response(&mut Response { rid: self.query.inner.qid, wire_expr: WireExpr { scope: 0, diff --git a/zenoh/src/api/key_expr.rs b/zenoh/src/api/key_expr.rs index 5a867e4a12..1d58a53eb6 100644 --- a/zenoh/src/api/key_expr.rs +++ b/zenoh/src/api/key_expr.rs @@ -697,7 +697,7 @@ impl Wait for KeyExprUndeclaration<'_> { let primitives = state.primitives()?; drop(state); - primitives.send_declare(zenoh_protocol::network::Declare { + primitives.send_declare(&mut zenoh_protocol::network::Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/api/queryable.rs b/zenoh/src/api/queryable.rs index 9fc34bd9f4..37282a389f 100644 --- a/zenoh/src/api/queryable.rs +++ b/zenoh/src/api/queryable.rs @@ -74,7 +74,7 @@ impl QueryInner { impl Drop for QueryInner { fn drop(&mut self) { - self.primitives.send_response_final(ResponseFinal { + self.primitives.send_response_final(&mut ResponseFinal { rid: self.qid, ext_qos: response::ext::QoSType::RESPONSE_FINAL, ext_tstamp: None, @@ -289,7 +289,7 @@ impl Query { let ext_sinfo = None; #[cfg(feature = "unstable")] let ext_sinfo = sample.source_info.into(); - self.inner.primitives.send_response(Response { + self.inner.primitives.send_response(&mut Response { rid: self.inner.qid, wire_expr: WireExpr { scope: 0, diff --git a/zenoh/src/api/session.rs b/zenoh/src/api/session.rs index 799c2f5474..fafa3cb460 100644 --- a/zenoh/src/api/session.rs +++ b/zenoh/src/api/session.rs @@ -14,7 +14,7 @@ use std::{ collections::{hash_map::Entry, HashMap}, convert::TryInto, - fmt, + fmt, mem, ops::Deref, sync::{ atomic::{AtomicU16, Ordering}, @@ -1317,7 +1317,7 @@ impl SessionInner { } state.local_resources.insert(expr_id, res); drop(state); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1390,7 +1390,7 @@ impl SessionInner { if let Some(res) = declared_pub { let primitives = state.primitives()?; drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id, mode: InterestMode::CurrentFuture, options: InterestOptions::KEYEXPRS + InterestOptions::SUBSCRIBERS, @@ -1417,7 +1417,7 @@ impl SessionInner { p.destination != Locality::SessionLocal && p.remote_id == pub_state.remote_id }) { drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id: pub_state.remote_id, mode: InterestMode::Final, // Note: InterestMode::Final options are undefined in the current protocol specification, @@ -1449,7 +1449,7 @@ impl SessionInner { if let Some(res) = declared_querier { let primitives = state.primitives()?; drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id, mode: InterestMode::CurrentFuture, options: InterestOptions::KEYEXPRS + InterestOptions::QUERYABLES, @@ -1478,7 +1478,7 @@ impl SessionInner { && p.remote_id == querier_state.remote_id }) { drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id: querier_state.remote_id, mode: InterestMode::Final, options: InterestOptions::empty(), @@ -1523,7 +1523,7 @@ impl SessionInner { drop(state); let wire_expr = self.optimize_nonwild_prefix(&key_expr)?; - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1585,7 +1585,7 @@ impl SessionInner { s.origin != Locality::SessionLocal && s.remote_id == sub_state.remote_id }) { drop(state); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1629,7 +1629,7 @@ impl SessionInner { let primitives = state.primitives()?; drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id: sub_state.id, mode: InterestMode::Final, // Note: InterestMode::Final options are undefined in the current protocol specification, @@ -1678,7 +1678,7 @@ impl SessionInner { distance: 0, }; let wire_expr = self.optimize_nonwild_prefix(key_expr)?; - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1716,7 +1716,7 @@ impl SessionInner { trace!("undeclare_queryable({:?})", qable_state); if qable_state.origin != Locality::SessionLocal { drop(state); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1751,7 +1751,7 @@ impl SessionInner { tracing::trace!("declare_liveliness({:?})", key_expr); let id = self.runtime.next_id(); let primitives = zread!(self.state).primitives()?; - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: declare::ext::QoSType::DECLARE, ext_tstamp: None, @@ -1846,7 +1846,7 @@ impl SessionInner { }); } - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id, mode: if history { InterestMode::CurrentFuture @@ -1868,7 +1868,7 @@ impl SessionInner { return Ok(()); }; trace!("undeclare_liveliness({:?})", tid); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -2180,7 +2180,7 @@ impl SessionInner { let timestamp = timestamp.or_else(|| self.runtime.new_timestamp()); let wire_expr = key_expr.to_wire(self); if destination != Locality::SessionLocal { - let body = || match kind { + let body = match kind { SampleKind::Put => PushBody::Put(Put { timestamp, encoding: encoding.clone().into(), @@ -2204,15 +2204,18 @@ impl SessionInner { ext_unknown: vec![], }), }; + let push = &mut Push { + wire_expr: wire_expr.to_owned(), + ext_qos: push::ext::QoSType::new(priority.into(), congestion_control, is_express), + ext_tstamp: None, + ext_nodeid: push::ext::NodeIdType::DEFAULT, + payload: body, + }; match &self.namespace { Some(_) => { let face = primitives.as_any().downcast_ref::().unwrap(); - face.send_push_lazy( - wire_expr.to_owned(), - push::ext::QoSType::new(priority.into(), congestion_control, is_express), - None, - push::ext::NodeIdType::DEFAULT, - body, + face.send_push( + push, #[cfg(feature = "unstable")] reliability, #[cfg(not(feature = "unstable"))] @@ -2221,12 +2224,8 @@ impl SessionInner { } None => { let face = primitives.as_any().downcast_ref::().unwrap(); - face.send_push_lazy( - wire_expr.to_owned(), - push::ext::QoSType::new(priority.into(), congestion_control, is_express), - None, - push::ext::NodeIdType::DEFAULT, - body, + face.send_push( + push, #[cfg(feature = "unstable")] reliability, #[cfg(not(feature = "unstable"))] @@ -2350,7 +2349,7 @@ impl SessionInner { if destination != Locality::SessionLocal { let ext_attachment = attachment.clone().map(Into::into); - primitives.send_request(Request { + primitives.send_request(&mut Request { id: qid, wire_expr: wexpr.clone(), ext_qos: qos.into(), @@ -2438,7 +2437,7 @@ impl SessionInner { let primitives = state.primitives()?; drop(state); - primitives.send_interest(Interest { + primitives.send_interest(&mut Interest { id, mode: InterestMode::Current, options: InterestOptions::KEYEXPRS + InterestOptions::TOKENS, @@ -2532,11 +2531,11 @@ impl SessionInner { } impl Primitives for WeakSession { - fn send_interest(&self, msg: zenoh_protocol::network::Interest) { + fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { trace!("recv Interest {} {:?}", msg.id, msg.wire_expr); } - fn send_declare(&self, msg: zenoh_protocol::network::Declare) { - match msg.body { + fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { + match &msg.body { zenoh_protocol::network::DeclareBody::DeclareKeyExpr(m) => { trace!("recv DeclareKeyExpr {} {:?}", m.id, m.wire_expr); let state = &mut zwrite!(self.state); @@ -2796,13 +2795,13 @@ impl Primitives for WeakSession { } } - fn send_push(&self, msg: Push, _reliability: Reliability) { + fn send_push(&self, msg: &mut Push, _reliability: Reliability) { trace!("recv Push {:?}", msg); - match msg.payload { + match &mut msg.payload { PushBody::Put(m) => { let info = DataInfo { kind: SampleKind::Put, - encoding: Some(m.encoding.into()), + encoding: Some(mem::take(&mut m.encoding).into()), timestamp: m.timestamp, qos: QoS::from(msg.ext_qos), source_id: m.ext_sinfo.as_ref().map(|i| i.id.into()), @@ -2812,11 +2811,11 @@ impl Primitives for WeakSession { false, &msg.wire_expr, Some(info), - m.payload, + mem::take(&mut m.payload), SubscriberKind::Subscriber, #[cfg(feature = "unstable")] _reliability, - m.ext_attachment.map(Into::into), + mem::take(&mut m.ext_attachment).map(Into::into), ) } PushBody::Del(m) => { @@ -2836,15 +2835,15 @@ impl Primitives for WeakSession { SubscriberKind::Subscriber, #[cfg(feature = "unstable")] _reliability, - m.ext_attachment.map(Into::into), + mem::take(&mut m.ext_attachment).map(Into::into), ) } } } - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { trace!("recv Request {:?}", msg); - match msg.payload { + match &mut msg.payload { RequestBody::Query(m) => self.handle_query( false, &msg.wire_expr, @@ -2852,15 +2851,15 @@ impl Primitives for WeakSession { msg.id, msg.ext_target, m.consolidation, - m.ext_body, - m.ext_attachment.map(Into::into), + mem::take(&mut m.ext_body), + mem::take(&mut m.ext_attachment).map(Into::into), ), } } - fn send_response(&self, msg: Response) { + fn send_response(&self, msg: &mut Response) { trace!("recv Response {:?}", msg); - match msg.payload { + match &mut msg.payload { ResponseBody::Err(e) => { let mut state = zwrite!(self.state); if state.primitives.is_none() { @@ -2872,11 +2871,11 @@ impl Primitives for WeakSession { std::mem::drop(state); let new_reply = Reply { result: Err(ReplyError { - payload: e.payload.into(), - encoding: e.encoding.into(), + payload: mem::take(&mut e.payload).into(), + encoding: mem::take(&mut e.encoding).into(), }), #[cfg(feature = "unstable")] - replier_id: e.ext_sinfo.map(|info| info.id.zid), + replier_id: mem::take(&mut e.ext_sinfo).map(|info| info.id.zid), }; callback.call(new_reply); } @@ -2920,7 +2919,7 @@ impl Primitives for WeakSession { payload, info, attachment, - } = match m.payload { + } = match &mut m.payload { ReplyBody::Put(Put { timestamp, encoding, @@ -2929,16 +2928,16 @@ impl Primitives for WeakSession { payload, .. }) => Ret { - payload, + payload: mem::take(payload), info: DataInfo { kind: SampleKind::Put, - encoding: Some(encoding.into()), - timestamp, + encoding: Some(mem::take(encoding).into()), + timestamp: *timestamp, qos: QoS::from(msg.ext_qos), source_id: ext_sinfo.as_ref().map(|i| i.id.into()), source_sn: ext_sinfo.as_ref().map(|i| i.sn), }, - attachment: _attachment.map(Into::into), + attachment: mem::take(_attachment).map(Into::into), }, ReplyBody::Del(Del { timestamp, @@ -2950,12 +2949,12 @@ impl Primitives for WeakSession { info: DataInfo { kind: SampleKind::Delete, encoding: None, - timestamp, + timestamp: *timestamp, qos: QoS::from(msg.ext_qos), source_id: ext_sinfo.as_ref().map(|i| i.id.into()), source_sn: ext_sinfo.as_ref().map(|i| i.sn), }, - attachment: _attachment.map(Into::into), + attachment: mem::take(_attachment).map(Into::into), }, }; let sample = info.into_sample( @@ -3062,7 +3061,7 @@ impl Primitives for WeakSession { } } - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { trace!("recv ResponseFinal {:?}", msg); let mut state = zwrite!(self.state); if state.primitives.is_none() { @@ -3099,32 +3098,32 @@ impl Primitives for WeakSession { impl crate::net::primitives::EPrimitives for WeakSession { #[inline] - fn send_interest(&self, ctx: crate::net::routing::RoutingContext) { + fn send_interest(&self, ctx: crate::net::routing::RoutingContext<&mut Interest>) { (self as &dyn Primitives).send_interest(ctx.msg) } #[inline] - fn send_declare(&self, ctx: crate::net::routing::RoutingContext) { + fn send_declare(&self, ctx: crate::net::routing::RoutingContext<&mut Declare>) { (self as &dyn Primitives).send_declare(ctx.msg) } #[inline] - fn send_push(&self, msg: Push, reliability: Reliability) { + fn send_push(&self, msg: &mut Push, reliability: Reliability) { (self as &dyn Primitives).send_push(msg, reliability) } #[inline] - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { (self as &dyn Primitives).send_request(msg) } #[inline] - fn send_response(&self, msg: Response) { + fn send_response(&self, msg: &mut Response) { (self as &dyn Primitives).send_response(msg) } #[inline] - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { (self as &dyn Primitives).send_response_final(msg) } diff --git a/zenoh/src/net/primitives/demux.rs b/zenoh/src/net/primitives/demux.rs index ebf63c1786..1f10646410 100644 --- a/zenoh/src/net/primitives/demux.rs +++ b/zenoh/src/net/primitives/demux.rs @@ -16,7 +16,8 @@ use std::{any::Any, sync::Arc}; use arc_swap::ArcSwap; use zenoh_link::Link; use zenoh_protocol::network::{ - ext, response, Declare, DeclareBody, DeclareFinal, NetworkBody, NetworkMessage, ResponseFinal, + ext, response, Declare, DeclareBody, DeclareFinal, NetworkBodyMut, NetworkMessageMut, + ResponseFinal, }; use zenoh_result::ZResult; use zenoh_transport::{unicast::TransportUnicast, TransportPeerEventHandler}; @@ -50,10 +51,10 @@ impl DeMux { impl TransportPeerEventHandler for DeMux { #[inline] - fn handle_message(&self, mut msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, mut msg: NetworkMessageMut) -> ZResult<()> { let interceptor = self.interceptor.load(); if !interceptor.interceptors.is_empty() { - let ctx = RoutingContext::new_in(msg, self.face.clone()); + let mut ctx = RoutingContext::new_in(msg.as_mut(), self.face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -64,65 +65,58 @@ impl TransportPeerEventHandler for DeMux { .and_then(|p| p.get_ingress_cache(&self.face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - let ctx = match &ctx.msg.body { - NetworkBody::Request(request) => { + match &ctx.msg.body { + NetworkBodyMut::Request(request) => { let request_id = request.id; - match interceptor.intercept(ctx, cache) { - Some(ctx) => ctx, - None => { - // request was blocked by an interceptor, we need to send response final to avoid timeout error - self.face - .state - .primitives - .send_response_final(ResponseFinal { - rid: request_id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); - return Ok(()); - } + if !interceptor.intercept(&mut ctx, cache) { + // request was blocked by an interceptor, we need to send response final to avoid timeout error + self.face + .state + .primitives + .send_response_final(&mut ResponseFinal { + rid: request_id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); + return Ok(()); } } - NetworkBody::Interest(interest) => { + NetworkBodyMut::Interest(interest) => { let interest_id = interest.id; - match interceptor.intercept(ctx, cache) { - Some(ctx) => ctx, - None => { - // request was blocked by an interceptor, we need to send declare final to avoid timeout error - self.face - .state - .primitives - .send_declare(RoutingContext::new_in( - Declare { - interest_id: Some(interest_id), - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareFinal(DeclareFinal), - }, - self.face.clone(), - )); - return Ok(()); - } + if !interceptor.intercept(&mut ctx, cache) { + // request was blocked by an interceptor, we need to send declare final to avoid timeout error + self.face + .state + .primitives + .send_declare(RoutingContext::new_in( + &mut Declare { + interest_id: Some(interest_id), + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareFinal(DeclareFinal), + }, + self.face.clone(), + )); + return Ok(()); + } + } + _ => { + if !interceptor.intercept(&mut ctx, cache) { + return Ok(()); } } - _ => match interceptor.intercept(ctx, cache) { - Some(ctx) => ctx, - None => return Ok(()), - }, }; - - msg = ctx.msg; } match msg.body { - NetworkBody::Push(m) => self.face.send_push(m, msg.reliability), - NetworkBody::Declare(m) => self.face.send_declare(m), - NetworkBody::Interest(m) => self.face.send_interest(m), - NetworkBody::Request(m) => self.face.send_request(m), - NetworkBody::Response(m) => self.face.send_response(m), - NetworkBody::ResponseFinal(m) => self.face.send_response_final(m), - NetworkBody::OAM(m) => { + NetworkBodyMut::Push(m) => self.face.send_push(m, msg.reliability), + NetworkBodyMut::Declare(m) => self.face.send_declare(m), + NetworkBodyMut::Interest(m) => self.face.send_interest(m), + NetworkBodyMut::Request(m) => self.face.send_request(m), + NetworkBodyMut::Response(m) => self.face.send_response(m), + NetworkBodyMut::ResponseFinal(m) => self.face.send_response_final(m), + NetworkBodyMut::OAM(m) => { if let Some(transport) = self.transport.as_ref() { let mut declares = vec![]; let ctrl_lock = zlock!(self.face.tables.ctrl_lock); @@ -137,7 +131,7 @@ impl TransportPeerEventHandler for DeMux { drop(tables); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } } diff --git a/zenoh/src/net/primitives/mod.rs b/zenoh/src/net/primitives/mod.rs index 321b33b494..859e0a8549 100644 --- a/zenoh/src/net/primitives/mod.rs +++ b/zenoh/src/net/primitives/mod.rs @@ -26,17 +26,17 @@ use zenoh_protocol::{ use super::routing::RoutingContext; pub trait Primitives: Send + Sync { - fn send_interest(&self, msg: Interest); + fn send_interest(&self, msg: &mut Interest); - fn send_declare(&self, msg: Declare); + fn send_declare(&self, msg: &mut Declare); - fn send_push(&self, msg: Push, reliability: Reliability); + fn send_push(&self, msg: &mut Push, reliability: Reliability); - fn send_request(&self, msg: Request); + fn send_request(&self, msg: &mut Request); - fn send_response(&self, msg: Response); + fn send_response(&self, msg: &mut Response); - fn send_response_final(&self, msg: ResponseFinal); + fn send_response_final(&self, msg: &mut ResponseFinal); fn send_close(&self); @@ -46,34 +46,34 @@ pub trait Primitives: Send + Sync { pub(crate) trait EPrimitives: Send + Sync { fn as_any(&self) -> &dyn Any; - fn send_interest(&self, ctx: RoutingContext); + fn send_interest(&self, ctx: RoutingContext<&mut Interest>); - fn send_declare(&self, ctx: RoutingContext); + fn send_declare(&self, ctx: RoutingContext<&mut Declare>); - fn send_push(&self, msg: Push, reliability: Reliability); + fn send_push(&self, msg: &mut Push, reliability: Reliability); - fn send_request(&self, msg: Request); + fn send_request(&self, msg: &mut Request); - fn send_response(&self, msg: Response); + fn send_response(&self, msg: &mut Response); - fn send_response_final(&self, msg: ResponseFinal); + fn send_response_final(&self, msg: &mut ResponseFinal); } #[derive(Default)] pub struct DummyPrimitives; impl Primitives for DummyPrimitives { - fn send_interest(&self, _msg: Interest) {} + fn send_interest(&self, _msg: &mut Interest) {} - fn send_declare(&self, _msg: Declare) {} + fn send_declare(&self, _msg: &mut Declare) {} - fn send_push(&self, _msg: Push, _reliability: Reliability) {} + fn send_push(&self, _msg: &mut Push, _reliability: Reliability) {} - fn send_request(&self, _msg: Request) {} + fn send_request(&self, _msg: &mut Request) {} - fn send_response(&self, _msg: Response) {} + fn send_response(&self, _msg: &mut Response) {} - fn send_response_final(&self, _msg: ResponseFinal) {} + fn send_response_final(&self, _msg: &mut ResponseFinal) {} fn send_close(&self) {} @@ -83,17 +83,17 @@ impl Primitives for DummyPrimitives { } impl EPrimitives for DummyPrimitives { - fn send_interest(&self, _ctx: RoutingContext) {} + fn send_interest(&self, _ctx: RoutingContext<&mut Interest>) {} - fn send_declare(&self, _ctx: RoutingContext) {} + fn send_declare(&self, _ctx: RoutingContext<&mut Declare>) {} - fn send_push(&self, _msg: Push, _reliability: Reliability) {} + fn send_push(&self, _msg: &mut Push, _reliability: Reliability) {} - fn send_request(&self, _msg: Request) {} + fn send_request(&self, _msg: &mut Request) {} - fn send_response(&self, _msg: Response) {} + fn send_response(&self, _msg: &mut Response) {} - fn send_response_final(&self, _msg: ResponseFinal) {} + fn send_response_final(&self, _msg: &mut ResponseFinal) {} fn as_any(&self) -> &dyn Any { self diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index c395c4d4fd..6b6b6c50ce 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -17,7 +17,7 @@ use arc_swap::ArcSwap; use zenoh_protocol::{ core::Reliability, network::{ - interest::Interest, response, Declare, NetworkBody, NetworkMessage, Push, Request, + interest::Interest, response, Declare, NetworkBodyMut, NetworkMessageMut, Push, Request, Response, ResponseFinal, }, }; @@ -47,11 +47,11 @@ impl Mux { } impl EPrimitives for Mux { - fn send_interest(&self, ctx: RoutingContext) { + fn send_interest(&self, ctx: RoutingContext<&mut Interest>) { let interest_id = ctx.msg.id; - let ctx = RoutingContext { - msg: NetworkMessage { - body: NetworkBody::Interest(ctx.msg), + let mut ctx = RoutingContext { + msg: NetworkMessageMut { + body: NetworkBodyMut::Interest(ctx.msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -73,23 +73,20 @@ impl EPrimitives for Mux { let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - match interceptor.intercept(ctx, cache) { - Some(ctx) => { - let _ = self.handler.schedule(ctx.msg); - } - None => { - // send declare final to avoid timeout on blocked interest - if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - face.reject_interest(interest_id); - } + if self.interceptor.load().intercept(&mut ctx, cache) { + let _ = self.handler.schedule(ctx.msg); + } else { + // send declare final to avoid timeout on blocked interest + if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { + face.reject_interest(interest_id); } - }; + } } - fn send_declare(&self, ctx: RoutingContext) { - let ctx = RoutingContext { - msg: NetworkMessage { - body: NetworkBody::Declare(ctx.msg), + fn send_declare(&self, ctx: RoutingContext<&mut Declare>) { + let mut ctx = RoutingContext { + msg: NetworkMessageMut { + body: NetworkBodyMut::Declare(ctx.msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -109,14 +106,15 @@ impl EPrimitives for Mux { .as_ref() .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + + if self.interceptor.load().intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } - fn send_push(&self, msg: Push, reliability: Reliability) { - let msg = NetworkMessage { - body: NetworkBody::Push(msg), + fn send_push(&self, mut msg: &mut Push, reliability: Reliability) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Push(&mut msg), reliability, #[cfg(feature = "stats")] size: None, @@ -125,7 +123,7 @@ impl EPrimitives for Mux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -136,7 +134,7 @@ impl EPrimitives for Mux { .and_then(|p| p.get_egress_cache(&face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -144,10 +142,10 @@ impl EPrimitives for Mux { } } - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { let request_id = msg.id; - let msg = NetworkMessage { - body: NetworkBody::Request(msg), + let msg = NetworkMessageMut { + body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -156,7 +154,7 @@ impl EPrimitives for Mux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -167,27 +165,24 @@ impl EPrimitives for Mux { .and_then(|p| p.get_egress_cache(&face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - match interceptor.intercept(ctx, cache) { - Some(ctx) => { - let _ = self.handler.schedule(ctx.msg); - } - None => { - // request was blocked by an interceptor, we need to send response final to avoid timeout error - face.send_response_final(ResponseFinal { - rid: request_id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }) - } + if interceptor.intercept(&mut ctx, cache) { + let _ = self.handler.schedule(ctx.msg); + } else { + // request was blocked by an interceptor, we need to send response final to avoid timeout error + face.send_response_final(&mut ResponseFinal { + rid: request_id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }) } } else { tracing::error!("Uninitialized multiplexer!"); } } - fn send_response(&self, msg: Response) { - let msg = NetworkMessage { - body: NetworkBody::Response(msg), + fn send_response(&self, msg: &mut Response) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -196,7 +191,7 @@ impl EPrimitives for Mux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -206,7 +201,8 @@ impl EPrimitives for Mux { .as_ref() .and_then(|p| p.get_egress_cache(&face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -214,9 +210,9 @@ impl EPrimitives for Mux { } } - fn send_response_final(&self, msg: ResponseFinal) { - let msg = NetworkMessage { - body: NetworkBody::ResponseFinal(msg), + fn send_response_final(&self, msg: &mut ResponseFinal) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -225,7 +221,7 @@ impl EPrimitives for Mux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -235,7 +231,7 @@ impl EPrimitives for Mux { .as_ref() .and_then(|p| p.get_egress_cache(&face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -265,10 +261,10 @@ impl McastMux { } impl EPrimitives for McastMux { - fn send_interest(&self, ctx: RoutingContext) { - let ctx = RoutingContext { - msg: NetworkMessage { - body: NetworkBody::Interest(ctx.msg), + fn send_interest(&self, ctx: RoutingContext<&mut Interest>) { + let mut ctx = RoutingContext { + msg: NetworkMessageMut { + body: NetworkBodyMut::Interest(ctx.msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -288,15 +284,15 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if self.interceptor.load().intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } - fn send_declare(&self, ctx: RoutingContext) { - let ctx = RoutingContext { - msg: NetworkMessage { - body: NetworkBody::Declare(ctx.msg), + fn send_declare(&self, ctx: RoutingContext<&mut Declare>) { + let mut ctx = RoutingContext { + msg: NetworkMessageMut { + body: NetworkBodyMut::Declare(ctx.msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -316,14 +312,14 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if self.interceptor.load().intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } - fn send_push(&self, msg: Push, reliability: Reliability) { - let msg = NetworkMessage { - body: NetworkBody::Push(msg), + fn send_push(&self, msg: &mut Push, reliability: Reliability) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Push(msg), reliability, #[cfg(feature = "stats")] size: None, @@ -332,7 +328,7 @@ impl EPrimitives for McastMux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get() { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -342,7 +338,7 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -350,9 +346,9 @@ impl EPrimitives for McastMux { } } - fn send_request(&self, msg: Request) { - let msg = NetworkMessage { - body: NetworkBody::Request(msg), + fn send_request(&self, msg: &mut Request) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -361,7 +357,7 @@ impl EPrimitives for McastMux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get() { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -371,7 +367,7 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -379,9 +375,9 @@ impl EPrimitives for McastMux { } } - fn send_response(&self, msg: Response) { - let msg = NetworkMessage { - body: NetworkBody::Response(msg), + fn send_response(&self, msg: &mut Response) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -390,7 +386,7 @@ impl EPrimitives for McastMux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get() { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -400,7 +396,7 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { @@ -408,9 +404,9 @@ impl EPrimitives for McastMux { } } - fn send_response_final(&self, msg: ResponseFinal) { - let msg = NetworkMessage { - body: NetworkBody::ResponseFinal(msg), + fn send_response_final(&self, msg: &mut ResponseFinal) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, @@ -419,7 +415,7 @@ impl EPrimitives for McastMux { if interceptor.interceptors.is_empty() { let _ = self.handler.schedule(msg); } else if let Some(face) = self.face.get() { - let ctx = RoutingContext::new_out(msg, face.clone()); + let mut ctx = RoutingContext::new_out(msg, face.clone()); let prefix = ctx .wire_expr() .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) @@ -429,7 +425,7 @@ impl EPrimitives for McastMux { .as_ref() .and_then(|p| p.get_egress_cache(face, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if let Some(ctx) = interceptor.intercept(ctx, cache) { + if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); } } else { diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index c045c0575e..cd54f76f69 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -23,12 +23,12 @@ use std::{ use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; use zenoh_protocol::{ - core::{ExprId, Reliability, WhatAmI, WireExpr, ZenohIdProto}, + core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ interest::{InterestId, InterestMode, InterestOptions}, - push, Mapping, Push, Request, RequestId, Response, ResponseFinal, + Mapping, Push, Request, RequestId, Response, ResponseFinal, }, - zenoh::{PushBody, RequestBody}, + zenoh::RequestBody, }; use zenoh_sync::get_mut_unchecked; use zenoh_task::TaskController; @@ -278,27 +278,6 @@ pub struct Face { } impl Face { - pub(crate) fn send_push_lazy( - &self, - wire_expr: WireExpr, - qos: push::ext::QoSType, - ext_tstamp: Option, - ext_nodeid: push::ext::NodeIdType, - body: impl FnOnce() -> PushBody, - reliability: Reliability, - ) { - route_data( - &self.tables, - &self.state, - wire_expr, - qos, - ext_tstamp, - ext_nodeid, - body, - reliability, - ); - } - pub fn downgrade(&self) -> WeakFace { WeakFace { tables: Arc::downgrade(&self.tables), @@ -314,7 +293,7 @@ impl Face { } impl Primitives for Face { - fn send_interest(&self, msg: zenoh_protocol::network::Interest) { + fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { let ctrl_lock = zlock!(self.tables.ctrl_lock); if msg.mode != InterestMode::Final { let mut declares = vec![]; @@ -330,7 +309,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } else { undeclare_interest( @@ -342,9 +321,9 @@ impl Primitives for Face { } } - fn send_declare(&self, msg: zenoh_protocol::network::Declare) { + fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { let ctrl_lock = zlock!(self.tables.ctrl_lock); - match msg.body { + match &mut msg.body { zenoh_protocol::network::DeclareBody::DeclareKeyExpr(m) => { register_expr(&self.tables, &mut self.state.clone(), m.id, &m.wire_expr); } @@ -365,7 +344,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::UndeclareSubscriber(m) => { @@ -381,7 +360,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::DeclareQueryable(m) => { @@ -398,7 +377,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::UndeclareQueryable(m) => { @@ -414,7 +393,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::DeclareToken(m) => { @@ -431,7 +410,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::UndeclareToken(m) => { @@ -447,7 +426,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } zenoh_protocol::network::DeclareBody::DeclareFinal(_) => { @@ -472,7 +451,7 @@ impl Primitives for Face { drop(wtables); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } } @@ -480,53 +459,23 @@ impl Primitives for Face { } #[inline] - fn send_push(&self, msg: Push, reliability: Reliability) { - route_data( - &self.tables, - &self.state, - msg.wire_expr, - msg.ext_qos, - msg.ext_tstamp, - msg.ext_nodeid, - move || msg.payload, - reliability, - ); + fn send_push(&self, msg: &mut Push, reliability: Reliability) { + route_data(&self.tables, &self.state, msg, reliability); } - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { match msg.payload { RequestBody::Query(_) => { - route_query( - &self.tables, - &self.state, - &msg.wire_expr, - msg.id, - msg.ext_qos, - msg.ext_tstamp, - msg.ext_target, - msg.ext_budget, - msg.ext_timeout, - msg.payload, - msg.ext_nodeid.node_id, - ); + route_query(&self.tables, &self.state, msg); } } } - fn send_response(&self, msg: Response) { - route_send_response( - &self.tables, - &mut self.state.clone(), - msg.rid, - msg.ext_qos, - msg.ext_tstamp, - msg.ext_respid, - msg.wire_expr, - msg.payload, - ); + fn send_response(&self, msg: &mut Response) { + route_send_response(&self.tables, &mut self.state.clone(), msg); } - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { route_send_response_final(&self.tables, &mut self.state.clone(), msg.rid); } @@ -548,7 +497,7 @@ impl Primitives for Face { ); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } } diff --git a/zenoh/src/net/routing/dispatcher/interests.rs b/zenoh/src/net/routing/dispatcher/interests.rs index a849476696..9511c1d82a 100644 --- a/zenoh/src/net/routing/dispatcher/interests.rs +++ b/zenoh/src/net/routing/dispatcher/interests.rs @@ -181,7 +181,7 @@ impl CurrentInterestCleanup { self.interests_timeout, ); } - finalize_pending_interest(interest, &mut |p, m| p.send_declare(m)); + finalize_pending_interest(interest, &mut |p, m| m.with_mut(|m| p.send_declare(m))); } } } diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index d19373528b..8d0f1ba660 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -282,16 +282,12 @@ macro_rules! inc_stats { pub fn route_data( tables_ref: &Arc, face: &FaceState, - wire_expr: WireExpr, - ext_qos: ext::QoSType, - ext_tstamp: Option, - ext_nodeid: ext::NodeIdType, - payload: impl FnOnce() -> PushBody, + msg: &mut Push, reliability: Reliability, ) { let tables = zread!(tables_ref.tables); match tables - .get_mapping(face, &wire_expr.scope, wire_expr.mapping) + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => { @@ -299,30 +295,26 @@ pub fn route_data( "{} Route data for res {}{}", face, prefix.expr(), - wire_expr.suffix.as_ref() + msg.wire_expr.suffix.as_ref() ); - let mut expr = RoutingExpr::new(&prefix, wire_expr.suffix.as_ref()); + let mut expr = RoutingExpr::new(&prefix, msg.wire_expr.suffix.as_ref()); #[cfg(feature = "stats")] let admin = expr.full_expr().starts_with("@/"); #[cfg(feature = "stats")] - let mut payload = payload(); - #[cfg(feature = "stats")] if !admin { - inc_stats!(face, rx, user, payload); + inc_stats!(face, rx, user, msg.payload); } else { - inc_stats!(face, rx, admin, payload); + inc_stats!(face, rx, admin, msg.payload); } if tables.hat_code.ingress_filter(&tables, face, &mut expr) { let res = Resource::get_resource(&prefix, expr.suffix); - let route = get_data_route(&tables, face, &res, &mut expr, ext_nodeid.node_id); + let route = get_data_route(&tables, face, &res, &mut expr, msg.ext_nodeid.node_id); if !route.is_empty() { - #[cfg(not(feature = "stats"))] - let mut payload = payload(); - treat_timestamp!(&tables.hlc, payload, tables.drop_future_timestamp); + treat_timestamp!(&tables.hlc, msg.payload, tables.drop_future_timestamp); if route.len() == 1 { let (outface, key_expr, context) = route.values().next().unwrap(); @@ -333,21 +325,13 @@ pub fn route_data( drop(tables); #[cfg(feature = "stats")] if !admin { - inc_stats!(outface, tx, user, payload); + inc_stats!(outface, tx, user, msg.payload); } else { - inc_stats!(outface, tx, admin, payload); + inc_stats!(outface, tx, admin, msg.payload); } - - outface.primitives.send_push( - Push { - wire_expr: key_expr.into(), - ext_qos, - ext_tstamp, - ext_nodeid: ext::NodeIdType { node_id: *context }, - payload, - }, - reliability, - ) + msg.wire_expr = key_expr.into(); + msg.ext_nodeid = ext::NodeIdType { node_id: *context }; + outface.primitives.send_push(msg, reliability) } } else { let route = route @@ -364,18 +348,18 @@ pub fn route_data( for (outface, key_expr, context) in route { #[cfg(feature = "stats")] if !admin { - inc_stats!(outface, tx, user, payload) + inc_stats!(outface, tx, user, msg.payload) } else { - inc_stats!(outface, tx, admin, payload) + inc_stats!(outface, tx, admin, msg.payload) } outface.primitives.send_push( - Push { + &mut Push { wire_expr: key_expr, - ext_qos, + ext_qos: msg.ext_qos, ext_tstamp: None, ext_nodeid: ext::NodeIdType { node_id: context }, - payload: payload.clone(), + payload: msg.payload.clone(), }, reliability, ) @@ -388,7 +372,7 @@ pub fn route_data( tracing::error!( "{} Route data with unknown scope {}!", face, - wire_expr.scope + msg.wire_expr.scope ); } } diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index b48eaf54ba..b19df50377 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -26,13 +26,10 @@ use zenoh_protocol::{ core::{key_expr::keyexpr, Encoding, WireExpr}, network::{ declare::{ext, queryable::ext::QueryableInfoType, QueryableId}, - request::{ - ext::{BudgetType, QueryTarget, TimeoutType}, - Request, RequestId, - }, - response::{self, ext::ResponderIdType, Response, ResponseFinal}, + request::{ext::QueryTarget, Request, RequestId}, + response::{self, Response, ResponseFinal}, }, - zenoh::{self, RequestBody, ResponseBody}, + zenoh::{self, ResponseBody}, }; use zenoh_sync::get_mut_unchecked; use zenoh_util::Timed; @@ -307,19 +304,21 @@ impl Timed for QueryCleanup { route_send_response( &self.tables, &mut face, - self.qid, - response::ext::QoSType::RESPONSE, - None, - ext_respid, - WireExpr::empty(), - ResponseBody::Err(zenoh::Err { - encoding: Encoding::default(), - ext_sinfo: None, - #[cfg(feature = "shared-memory")] - ext_shm: None, - ext_unknown: vec![], - payload: ZBuf::from("Timeout".as_bytes().to_vec()), - }), + &mut Response { + rid: self.qid, + wire_expr: WireExpr::empty(), + payload: ResponseBody::Err(zenoh::Err { + encoding: Encoding::default(), + ext_sinfo: None, + #[cfg(feature = "shared-memory")] + ext_shm: None, + ext_unknown: vec![], + payload: ZBuf::from("Timeout".as_bytes().to_vec()), + }), + ext_qos: response::ext::QoSType::RESPONSE, + ext_tstamp: None, + ext_respid, + }, ); let queries_lock = zwrite!(self.tables.queries_lock); if let Some(query) = get_mut_unchecked(&mut face) @@ -449,55 +448,44 @@ macro_rules! inc_res_stats { } #[allow(clippy::too_many_arguments)] -pub fn route_query( - tables_ref: &Arc, - face: &Arc, - expr: &WireExpr, - qid: RequestId, - ext_qos: ext::QoSType, - ext_tstamp: Option, - ext_target: QueryTarget, - ext_budget: Option, - ext_timeout: Option, - body: RequestBody, - routing_context: NodeId, -) { +pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mut Request) { let rtables = zread!(tables_ref.tables); - match rtables.get_mapping(face, &expr.scope, expr.mapping) { + match rtables.get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) { Some(prefix) => { tracing::debug!( "{}:{} Route query for res {}{}", face, - qid, + msg.id, prefix.expr(), - expr.suffix.as_ref(), + msg.wire_expr.suffix.as_ref(), ); let prefix = prefix.clone(); - let mut expr = RoutingExpr::new(&prefix, expr.suffix.as_ref()); + let mut expr = RoutingExpr::new(&prefix, msg.wire_expr.suffix.as_ref()); #[cfg(feature = "stats")] let admin = expr.full_expr().starts_with("@/"); #[cfg(feature = "stats")] if !admin { - inc_req_stats!(face, rx, user, body) + inc_req_stats!(face, rx, user, msg.payload) } else { - inc_req_stats!(face, rx, admin, body) + inc_req_stats!(face, rx, admin, msg.payload) } if rtables.hat_code.ingress_filter(&rtables, face, &mut expr) { let res = Resource::get_resource(&prefix, expr.suffix); - let route = get_query_route(&rtables, face, &res, &mut expr, routing_context); + let route = + get_query_route(&rtables, face, &res, &mut expr, msg.ext_nodeid.node_id); let query = Arc::new(Query { src_face: face.clone(), - src_qid: qid, + src_qid: msg.id, }); let queries_lock = zwrite!(tables_ref.queries_lock); let route = - compute_final_route(&rtables, &route, face, &mut expr, &ext_target, query); - let timeout = ext_timeout.unwrap_or(rtables.queries_default_timeout); + compute_final_route(&rtables, &route, face, &mut expr, &msg.ext_target, query); + let timeout = msg.ext_timeout.unwrap_or(rtables.queries_default_timeout); drop(queries_lock); drop(rtables); @@ -505,13 +493,15 @@ pub fn route_query( tracing::debug!( "{}:{} Send final reply (no matching queryables or not master)", face, - qid + msg.id ); - face.primitives.clone().send_response_final(ResponseFinal { - rid: qid, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.primitives + .clone() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } else { for ((outface, key_expr, context), outqid) in route.values() { QueryCleanup::spawn_query_clean_up_task( @@ -519,54 +509,58 @@ pub fn route_query( ); #[cfg(feature = "stats")] if !admin { - inc_req_stats!(outface, tx, user, body) + inc_req_stats!(outface, tx, user, msg.payload) } else { - inc_req_stats!(outface, tx, admin, body) + inc_req_stats!(outface, tx, admin, msg.payload) } tracing::trace!( "{}:{} Propagate query to {}:{}", face, - qid, + msg.id, outface, outqid ); - outface.primitives.send_request(Request { + outface.primitives.send_request(&mut Request { id: *outqid, wire_expr: key_expr.into(), - ext_qos, - ext_tstamp, + ext_qos: msg.ext_qos, + ext_tstamp: msg.ext_tstamp, ext_nodeid: ext::NodeIdType { node_id: *context }, - ext_target, - ext_budget, - ext_timeout, - payload: body.clone(), + ext_target: msg.ext_target, + ext_budget: msg.ext_budget, + ext_timeout: msg.ext_timeout, + payload: msg.payload.clone(), }); } } } else { - tracing::debug!("{}:{} Send final reply (not master)", face, qid); + tracing::debug!("{}:{} Send final reply (not master)", face, msg.id); drop(rtables); - face.primitives.clone().send_response_final(ResponseFinal { - rid: qid, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.primitives + .clone() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } } None => { tracing::error!( "{}:{} Route query with unknown scope {}! Send final reply.", face, - qid, - expr.scope, + msg.id, + msg.wire_expr.scope, ); drop(rtables); - face.primitives.clone().send_response_final(ResponseFinal { - rid: qid, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.primitives + .clone() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } } } @@ -575,53 +569,42 @@ pub fn route_query( pub(crate) fn route_send_response( tables_ref: &Arc, face: &mut Arc, - qid: RequestId, - ext_qos: ext::QoSType, - ext_tstamp: Option, - ext_respid: Option, - key_expr: WireExpr, - body: ResponseBody, + msg: &mut Response, ) { let queries_lock = zread!(tables_ref.queries_lock); #[cfg(feature = "stats")] - let admin = key_expr.as_str().starts_with("@/"); + let admin = msg.wire_expr.as_str().starts_with("@/"); #[cfg(feature = "stats")] if !admin { - inc_res_stats!(face, rx, user, body) + inc_res_stats!(face, rx, user, msg.payload) } else { - inc_res_stats!(face, rx, admin, body) + inc_res_stats!(face, rx, admin, msg.payload) } - match face.pending_queries.get(&qid) { + match face.pending_queries.get(&msg.rid) { Some((query, _)) => { tracing::trace!( "{}:{} Route reply for query {}:{} ({})", face, - qid, + msg.rid, query.src_face, query.src_qid, - key_expr.suffix.as_ref() + msg.wire_expr.suffix.as_ref() ); drop(queries_lock); #[cfg(feature = "stats")] if !admin { - inc_res_stats!(query.src_face, tx, user, body) + inc_res_stats!(query.src_face, tx, user, msg.payload) } else { - inc_res_stats!(query.src_face, tx, admin, body) + inc_res_stats!(query.src_face, tx, admin, msg.payload) } - query.src_face.primitives.send_response(Response { - rid: query.src_qid, - wire_expr: key_expr.to_owned(), - payload: body, - ext_qos, - ext_tstamp, - ext_respid, - }); + msg.rid = query.src_qid; + query.src_face.primitives.send_response(msg); } - None => tracing::warn!("{}:{} Route reply: Query not found!", face, qid), + None => tracing::warn!("{}:{} Route reply: Query not found!", face, msg.rid), } } @@ -664,7 +647,7 @@ pub(crate) fn finalize_pending_query(query: (Arc, CancellationToken)) { .src_face .primitives .clone() - .send_response_final(ResponseFinal { + .send_response_final(&mut ResponseFinal { rid: query.src_qid, ext_qos: response::ext::QoSType::RESPONSE_FINAL, ext_tstamp: None, diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index cf8b0a244c..ddecc3002c 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -541,7 +541,7 @@ impl Resource { .local_mappings .insert(expr_id, nonwild_prefix.clone()); face.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/client/interests.rs b/zenoh/src/net/routing/hat/client/interests.rs index 599ad022ac..3256278469 100644 --- a/zenoh/src/net/routing/hat/client/interests.rs +++ b/zenoh/src/net/routing/hat/client/interests.rs @@ -59,7 +59,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) ); let wire_expr = res.as_ref().map(|res| Resource::decl_key(res, face, true)); face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode: InterestMode::CurrentFuture, options: *options, @@ -152,7 +152,7 @@ impl HatInterestTrait for HatCode { .as_ref() .map(|res| Resource::decl_key(res, dst_face, true)); dst_face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode, options, @@ -226,7 +226,7 @@ impl HatInterestTrait for HatCode { && local_interest.options == interest.options { dst_face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode: InterestMode::Final, // Note: InterestMode::Final options are undefined in the current protocol specification, diff --git a/zenoh/src/net/routing/hat/client/mod.rs b/zenoh/src/net/routing/hat/client/mod.rs index cf25f6a682..2f4331c115 100644 --- a/zenoh/src/net/routing/hat/client/mod.rs +++ b/zenoh/src/net/routing/hat/client/mod.rs @@ -231,7 +231,7 @@ impl HatBaseTrait for HatCode { &self, _tables: &mut Tables, _tables_ref: &Arc, - _oam: Oam, + _oam: &mut Oam, _transport: &TransportUnicast, _send_declare: &mut SendDeclare, ) -> ZResult<()> { diff --git a/zenoh/src/net/routing/hat/linkstate_peer/mod.rs b/zenoh/src/net/routing/hat/linkstate_peer/mod.rs index 6e38e6ab38..940067f949 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/mod.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/mod.rs @@ -20,6 +20,7 @@ use std::{ any::Any, collections::{HashMap, HashSet}, + mem, sync::{atomic::AtomicU32, Arc}, }; @@ -384,12 +385,12 @@ impl HatBaseTrait for HatCode { &self, tables: &mut Tables, tables_ref: &Arc, - oam: Oam, + oam: &mut Oam, transport: &TransportUnicast, send_declare: &mut SendDeclare, ) -> ZResult<()> { if oam.id == OAM_LINKSTATE { - if let ZExtBody::ZBuf(buf) = oam.body { + if let ZExtBody::ZBuf(buf) = mem::take(&mut oam.body) { if let Ok(zid) = transport.get_zid() { use zenoh_buffers::reader::HasReader; use zenoh_codec::RCodec; diff --git a/zenoh/src/net/routing/hat/linkstate_peer/network.rs b/zenoh/src/net/routing/hat/linkstate_peer/network.rs index 7ed6f93a2c..79aa3d4c73 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/network.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/network.rs @@ -293,9 +293,9 @@ impl Network { for idx in &mut idxs { idx.1.locators = self.propagate_locators(idx.0, transport); } - if let Ok(msg) = self.make_msg(&idxs) { + if let Ok(mut msg) = self.make_msg(&idxs) { tracing::trace!("{} Send to {:?} {:?}", self.name, transport.get_zid(), msg); - if let Err(e) = transport.schedule(msg) { + if let Err(e) = transport.schedule(msg.as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } else { @@ -314,7 +314,7 @@ impl Network { if let Ok(msg) = self.make_msg(&idxs) { if parameters(link) { tracing::trace!("{} Send to {} {:?}", self.name, link.zid, msg); - if let Err(e) = link.transport.schedule(msg.clone()) { + if let Err(e) = link.transport.schedule(msg.clone().as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs index 771e63eb75..74bd7e1933 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs @@ -71,7 +71,7 @@ fn send_sourced_subscription_to_net_children( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -359,7 +359,7 @@ fn send_forget_sourced_subscription_to_net_children( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs index 115b51cd33..367c6ecce0 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs @@ -142,7 +142,7 @@ fn send_sourced_queryable_to_net_children( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -375,7 +375,7 @@ fn send_forget_sourced_queryable_to_net_children( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/token.rs b/zenoh/src/net/routing/hat/linkstate_peer/token.rs index 3e6bd9c702..853a711ece 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/token.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/token.rs @@ -58,7 +58,7 @@ fn send_sourced_token_to_net_clildren( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -331,7 +331,7 @@ fn send_forget_sourced_token_to_net_clildren( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/mod.rs b/zenoh/src/net/routing/hat/mod.rs index df988da634..00f74721d6 100644 --- a/zenoh/src/net/routing/hat/mod.rs +++ b/zenoh/src/net/routing/hat/mod.rs @@ -106,7 +106,7 @@ pub(crate) trait HatBaseTrait { &self, tables: &mut Tables, tables_ref: &Arc, - oam: Oam, + oam: &mut Oam, transport: &TransportUnicast, send_declare: &mut SendDeclare, ) -> ZResult<()>; diff --git a/zenoh/src/net/routing/hat/p2p_peer/gossip.rs b/zenoh/src/net/routing/hat/p2p_peer/gossip.rs index 65b44d0f92..109faf1e0b 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/gossip.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/gossip.rs @@ -239,9 +239,9 @@ impl Network { .get_whatami() .is_ok_and(|w| self.gossip_target.matches(w)) { - if let Ok(msg) = self.make_msg(idxs) { + if let Ok(mut msg) = self.make_msg(idxs) { tracing::trace!("{} Send to {:?} {:?}", self.name, transport.get_zid(), msg); - if let Err(e) = transport.schedule(msg) { + if let Err(e) = transport.schedule(msg.as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } else { @@ -263,7 +263,7 @@ impl Network { && parameters(link) { tracing::trace!("{} Send to {} {:?}", self.name, link.zid, msg); - if let Err(e) = link.transport.schedule(msg.clone()) { + if let Err(e) = link.transport.schedule(msg.clone().as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/interests.rs b/zenoh/src/net/routing/hat/p2p_peer/interests.rs index 92ecfadc60..adb3ea683a 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/interests.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/interests.rs @@ -66,7 +66,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) Resource::decl_key(res, face, super::push_declaration_profile(face)) }); face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode: InterestMode::CurrentFuture, options: *options, @@ -190,7 +190,7 @@ impl HatInterestTrait for HatCode { Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)) }); dst_face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode: propagated_mode, options, @@ -252,7 +252,7 @@ impl HatInterestTrait for HatCode { && local_interest.options == interest.options { dst_face.primitives.send_interest(RoutingContext::with_expr( - Interest { + &mut Interest { id, mode: InterestMode::Final, // Note: InterestMode::Final options are undefined in the current protocol specification, diff --git a/zenoh/src/net/routing/hat/p2p_peer/mod.rs b/zenoh/src/net/routing/hat/p2p_peer/mod.rs index 00a334e955..03b9455270 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/mod.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/mod.rs @@ -20,6 +20,7 @@ use std::{ any::Any, collections::HashMap, + mem, sync::{atomic::AtomicU32, Arc}, }; @@ -327,12 +328,12 @@ impl HatBaseTrait for HatCode { &self, tables: &mut Tables, _tables_ref: &Arc, - oam: Oam, + oam: &mut Oam, transport: &TransportUnicast, _send_declare: &mut SendDeclare, ) -> ZResult<()> { if oam.id == OAM_LINKSTATE { - if let ZExtBody::ZBuf(buf) = oam.body { + if let ZExtBody::ZBuf(buf) = mem::take(&mut oam.body) { if let Ok(zid) = transport.get_zid() { let whatami = transport.get_whatami()?; if whatami != WhatAmI::Client { diff --git a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs index 634969bb63..8a84906c3c 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs @@ -202,7 +202,7 @@ fn declare_simple_subscription( mcast_group .primitives .send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/router/mod.rs b/zenoh/src/net/routing/hat/router/mod.rs index e1cc50a416..69920069cf 100644 --- a/zenoh/src/net/routing/hat/router/mod.rs +++ b/zenoh/src/net/routing/hat/router/mod.rs @@ -21,6 +21,7 @@ use std::{ any::Any, collections::{hash_map::DefaultHasher, HashMap, HashSet}, hash::Hasher, + mem, sync::{atomic::AtomicU32, Arc}, }; @@ -617,12 +618,12 @@ impl HatBaseTrait for HatCode { &self, tables: &mut Tables, tables_ref: &Arc, - oam: Oam, + oam: &mut Oam, transport: &TransportUnicast, send_declare: &mut SendDeclare, ) -> ZResult<()> { if oam.id == OAM_LINKSTATE { - if let ZExtBody::ZBuf(buf) = oam.body { + if let ZExtBody::ZBuf(buf) = mem::take(&mut oam.body) { if let Ok(zid) = transport.get_zid() { use zenoh_buffers::reader::HasReader; use zenoh_codec::RCodec; diff --git a/zenoh/src/net/routing/hat/router/network.rs b/zenoh/src/net/routing/hat/router/network.rs index 972de7a5b3..3b37abc58d 100644 --- a/zenoh/src/net/routing/hat/router/network.rs +++ b/zenoh/src/net/routing/hat/router/network.rs @@ -298,9 +298,9 @@ impl Network { for idx in &mut idxs { idx.1.locators = self.propagate_locators(idx.0, transport); } - if let Ok(msg) = self.make_msg(&idxs) { + if let Ok(mut msg) = self.make_msg(&idxs) { tracing::trace!("{} Send to {:?} {:?}", self.name, transport.get_zid(), msg); - if let Err(e) = transport.schedule(msg) { + if let Err(e) = transport.schedule(msg.as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } else { @@ -319,7 +319,7 @@ impl Network { if let Ok(msg) = self.make_msg(&idxs) { if parameters(link) { tracing::trace!("{} Send to {} {:?}", self.name, link.zid, msg); - if let Err(e) = link.transport.schedule(msg.clone()) { + if let Err(e) = link.transport.schedule(msg.clone().as_mut()) { tracing::debug!("{} Error sending LinkStateList: {}", self.name, e); } } diff --git a/zenoh/src/net/routing/hat/router/pubsub.rs b/zenoh/src/net/routing/hat/router/pubsub.rs index ea1bbae410..d6da037c5c 100644 --- a/zenoh/src/net/routing/hat/router/pubsub.rs +++ b/zenoh/src/net/routing/hat/router/pubsub.rs @@ -71,7 +71,7 @@ fn send_sourced_subscription_to_net_children( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -394,7 +394,7 @@ fn send_forget_sourced_subscription_to_net_children( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/router/queries.rs b/zenoh/src/net/routing/hat/router/queries.rs index 946bd110ac..6b0a6f284b 100644 --- a/zenoh/src/net/routing/hat/router/queries.rs +++ b/zenoh/src/net/routing/hat/router/queries.rs @@ -210,7 +210,7 @@ fn send_sourced_queryable_to_net_children( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -521,7 +521,7 @@ fn send_forget_sourced_queryable_to_net_children( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/hat/router/token.rs b/zenoh/src/net/routing/hat/router/token.rs index 670d0f4dbd..172e1c0e6c 100644 --- a/zenoh/src/net/routing/hat/router/token.rs +++ b/zenoh/src/net/routing/hat/router/token.rs @@ -58,7 +58,7 @@ fn send_sourced_token_to_net_clildren( let key_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -369,7 +369,7 @@ fn send_forget_sourced_token_to_net_clildren( let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); someface.primitives.send_declare(RoutingContext::with_expr( - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, diff --git a/zenoh/src/net/routing/interceptor/access_control.rs b/zenoh/src/net/routing/interceptor/access_control.rs index 965d0da9ae..6b158363cf 100644 --- a/zenoh/src/net/routing/interceptor/access_control.rs +++ b/zenoh/src/net/routing/interceptor/access_control.rs @@ -29,8 +29,8 @@ use zenoh_link::LinkAuthId; use zenoh_protocol::{ core::ZenohIdProto, network::{ - interest::InterestMode, Declare, DeclareBody, Interest, NetworkBody, NetworkMessage, Push, - Request, Response, + interest::InterestMode, Declare, DeclareBody, Interest, NetworkBodyMut, NetworkMessageMut, + Push, Request, Response, }, zenoh::{PushBody, RequestBody}, }; @@ -64,19 +64,19 @@ impl EgressAclEnforcer { cached_permission: Option, action: AclMessage, log_msg: &str, - key_expr: &keyexpr, + key_expr: Option<&keyexpr>, ) -> Permission { match cached_permission { Some(p) => { match p { Permission::Allow => tracing::trace!( - "Using cached result: {} is authorized to {} on {}", + "Using cached result: {} is authorized to {} on {:?}", self.zid(), log_msg, key_expr ), Permission::Deny => tracing::trace!( - "Using cached result: {} is unauthorized to {} on {}", + "Using cached result: {} is unauthorized to {} on {:?}", self.zid(), log_msg, key_expr @@ -84,7 +84,10 @@ impl EgressAclEnforcer { } p } - None => self.action(action, log_msg, key_expr), + None => match key_expr { + Some(ke) => self.action(action, log_msg, ke), + None => Permission::Allow, + }, } } } @@ -102,19 +105,19 @@ impl IngressAclEnforcer { cached_permission: Option, action: AclMessage, log_msg: &str, - key_expr: &keyexpr, + key_expr: Option<&keyexpr>, ) -> Permission { match cached_permission { Some(p) => { match p { Permission::Allow => tracing::trace!( - "Using cached result: {} is authorized to {} on {}", + "Using cached result: {} is authorized to {} on {:?}", self.zid(), log_msg, key_expr ), Permission::Deny => tracing::trace!( - "Using cached result: {} is unauthorized to {} on {}", + "Using cached result: {} is unauthorized to {} on {:?}", self.zid(), log_msg, key_expr @@ -122,7 +125,10 @@ impl IngressAclEnforcer { } p } - None => self.action(action, log_msg, key_expr), + None => match key_expr { + Some(ke) => self.action(action, log_msg, ke), + None => Permission::Deny, + }, } } @@ -365,9 +371,9 @@ impl InterceptorTrait for IngressAclEnforcer { fn intercept<'a>( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let cache = cache.and_then(|i| match i.downcast_ref::() { Some(c) => Some(c), None => { @@ -377,7 +383,7 @@ impl InterceptorTrait for IngressAclEnforcer { }); match &ctx.msg.body { - NetworkBody::Request(Request { + NetworkBodyMut::Request(Request { payload: RequestBody::Query(_), .. }) => { @@ -385,24 +391,24 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.query), AclMessage::Query, "Query (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Response(Response { .. }) => { + NetworkBodyMut::Response(Response { .. }) => { if self.cached_result_or_action( cache.map(|c| c.reply), AclMessage::Reply, "Reply (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. }) => { @@ -410,13 +416,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.put), AclMessage::Put, "Put (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. }) => { @@ -424,13 +430,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.delete), AclMessage::Delete, "Delete (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareSubscriber(_), .. }) => { @@ -438,13 +444,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.declare_subscriber), AclMessage::DeclareSubscriber, "Declare Subscriber (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareSubscriber(_), .. }) => { @@ -459,10 +465,10 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareQueryable(_), .. }) => { @@ -470,13 +476,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.declare_queryable), AclMessage::DeclareQueryable, "Declare Queryable (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareQueryable(_), .. }) => { @@ -491,10 +497,10 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareToken(_), .. }) => { @@ -502,14 +508,14 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.declare_token), AclMessage::LivelinessToken, "Liveliness Token (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareToken(_), .. }) => { @@ -524,10 +530,10 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Current, options, .. @@ -536,13 +542,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.query_token), AclMessage::LivelinessQuery, "Liveliness Query (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Future | InterestMode::CurrentFuture, options, .. @@ -551,13 +557,13 @@ impl InterceptorTrait for IngressAclEnforcer { cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Declare Liveliness Subscriber (ingress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Final, .. }) => { @@ -565,23 +571,25 @@ impl InterceptorTrait for IngressAclEnforcer { // InterestMode::Final ingress is always allowed, it will be rejected by routing logic if its associated Interest was denied } // Unfiltered Declare messages - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareKeyExpr(_), .. }) - | NetworkBody::Declare(Declare { + | NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareFinal(_), .. }) => {} // Unfiltered Undeclare messages - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareKeyExpr(_), .. }) => {} // Unfiltered remaining message types - NetworkBody::Interest(_) | NetworkBody::OAM(_) | NetworkBody::ResponseFinal(_) => {} + NetworkBodyMut::Interest(_) + | NetworkBodyMut::OAM(_) + | NetworkBodyMut::ResponseFinal(_) => {} } - Some(ctx) + true } } @@ -624,9 +632,9 @@ impl InterceptorTrait for EgressAclEnforcer { fn intercept( // String, Arc, Box, etc... & -> &str &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let cache = cache.and_then(|i| match i.downcast_ref::() { Some(c) => Some(c), None => { @@ -636,7 +644,7 @@ impl InterceptorTrait for EgressAclEnforcer { }); match &ctx.msg.body { - NetworkBody::Request(Request { + NetworkBodyMut::Request(Request { payload: RequestBody::Query(_), .. }) => { @@ -644,24 +652,24 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.query), AclMessage::Query, "Query (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Response(Response { .. }) => { + NetworkBodyMut::Response(Response { .. }) => { if self.cached_result_or_action( cache.map(|c| c.reply), AclMessage::Reply, "Reply (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. }) => { @@ -669,13 +677,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.put), AclMessage::Put, "Put (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. }) => { @@ -683,13 +691,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.put), AclMessage::Delete, "Delete (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareSubscriber(_), .. }) => { @@ -697,13 +705,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_subscriber), AclMessage::DeclareSubscriber, "Declare Subscriber (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareSubscriber(_), .. }) => { @@ -713,13 +721,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_subscriber), AclMessage::DeclareSubscriber, "Undeclare Subscriber (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareQueryable(_), .. }) => { @@ -727,13 +735,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_queryable), AclMessage::DeclareQueryable, "Declare Queryable (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareQueryable(_), .. }) => { @@ -743,13 +751,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_queryable), AclMessage::DeclareQueryable, "Undeclare Queryable (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareToken(_), .. }) => { @@ -757,13 +765,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_token), AclMessage::LivelinessToken, "Liveliness Token (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareToken(_), .. }) => { @@ -773,13 +781,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_token), AclMessage::LivelinessToken, "Undeclare Liveliness Token (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Current, options, .. @@ -788,13 +796,13 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.query_token), AclMessage::LivelinessQuery, "Liveliness Query (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Future | InterestMode::CurrentFuture, options, .. @@ -803,49 +811,50 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Declare Liveliness Subscriber (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Final, options, .. }) if options.tokens() => { // Note: options are set for InterestMode::Final for internal use only by egress interceptors. - // InterestMode::Final filtering diverges between ingress and egress: // in egress the keyexpr has to be provided in the RoutingContext if self.cached_result_or_action( cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Undeclare Liveliness Subscriber (egress)", - ctx.full_keyexpr()?, + ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } // Unfiltered Declare messages - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareKeyExpr(_), .. }) - | NetworkBody::Declare(Declare { + | NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareFinal(_), .. }) => {} // Unfiltered Undeclare messages - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareKeyExpr(_), .. }) => {} // Unfiltered remaining message types - NetworkBody::Interest(_) | NetworkBody::OAM(_) | NetworkBody::ResponseFinal(_) => {} + NetworkBodyMut::Interest(_) + | NetworkBodyMut::OAM(_) + | NetworkBodyMut::ResponseFinal(_) => {} } - Some(ctx) + true } } diff --git a/zenoh/src/net/routing/interceptor/downsampling.rs b/zenoh/src/net/routing/interceptor/downsampling.rs index 30ffb41e8f..294fd25fbf 100644 --- a/zenoh/src/net/routing/interceptor/downsampling.rs +++ b/zenoh/src/net/routing/interceptor/downsampling.rs @@ -32,7 +32,7 @@ use zenoh_core::zlock; use zenoh_keyexpr::keyexpr_tree::{ impls::KeyedSetProvider, support::UnknownWildness, IKeyExprTree, IKeyExprTreeMut, KeBoxTree, }; -use zenoh_protocol::network::NetworkBody; +use zenoh_protocol::network::NetworkBodyMut; use zenoh_result::ZResult; use crate::net::routing::interceptor::*; @@ -180,15 +180,15 @@ pub(crate) struct DownsamplingInterceptor { } impl DownsamplingInterceptor { - fn is_msg_filtered(&self, ctx: &RoutingContext) -> bool { + fn is_msg_filtered(&self, ctx: &RoutingContext) -> bool { match ctx.msg.body { - NetworkBody::Push(_) => self.filtered_messages.push, - NetworkBody::Request(_) => self.filtered_messages.query, - NetworkBody::Response(_) => self.filtered_messages.reply, - NetworkBody::ResponseFinal(_) => false, - NetworkBody::Interest(_) => false, - NetworkBody::Declare(_) => false, - NetworkBody::OAM(_) => false, + NetworkBodyMut::Push(_) => self.filtered_messages.push, + NetworkBodyMut::Request(_) => self.filtered_messages.query, + NetworkBodyMut::Response(_) => self.filtered_messages.reply, + NetworkBodyMut::ResponseFinal(_) => false, + NetworkBodyMut::Interest(_) => false, + NetworkBodyMut::Declare(_) => false, + NetworkBodyMut::OAM(_) => false, } } } @@ -209,10 +209,10 @@ impl InterceptorTrait for DownsamplingInterceptor { fn intercept( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { - if self.is_msg_filtered(&ctx) { + ) -> bool { + if self.is_msg_filtered(ctx) { if let Some(cache) = cache { if let Some(id) = cache.downcast_ref::>() { if let Some(id) = id { @@ -222,7 +222,7 @@ impl InterceptorTrait for DownsamplingInterceptor { if timestamp - state.latest_message_timestamp >= state.threshold { state.latest_message_timestamp = timestamp; - return Some(ctx); + return true; } else { if !INFO_FLAG.swap(true, Ordering::Relaxed) { tracing::info!("Some message(s) have been dropped by the downsampling interceptor. Enable trace level tracing for more details."); @@ -234,7 +234,7 @@ impl InterceptorTrait for DownsamplingInterceptor { ctx.inface().map(|f| f.to_string()).unwrap_or_default(), ctx.outface().map(|f| f.to_string()).unwrap_or_default(), ); - return None; + return false; } } else { tracing::debug!("unexpected cache ID {}", id); @@ -245,8 +245,7 @@ impl InterceptorTrait for DownsamplingInterceptor { } } } - - Some(ctx) + true } } diff --git a/zenoh/src/net/routing/interceptor/low_pass.rs b/zenoh/src/net/routing/interceptor/low_pass.rs index 84b3ca1848..04a79b6306 100644 --- a/zenoh/src/net/routing/interceptor/low_pass.rs +++ b/zenoh/src/net/routing/interceptor/low_pass.rs @@ -30,7 +30,7 @@ use zenoh_keyexpr::{ keyexpr_tree::{IKeyExprTree, IKeyExprTreeMut, IKeyExprTreeNode, KeBoxTree}, }; use zenoh_protocol::{ - network::{NetworkBody, NetworkMessage, Push, Request, Response}, + network::{NetworkBodyMut, NetworkMessageMut, Push, Request, Response}, zenoh::{PushBody, Reply, RequestBody, ResponseBody}, }; use zenoh_result::ZResult; @@ -232,7 +232,7 @@ impl LowPassInterceptor { fn message_passes_filters( &self, - ctx: &RoutingContext, + ctx: &RoutingContext>, cache: Option<&Cache>, ) -> bool { let payload_size: usize; @@ -243,7 +243,7 @@ impl LowPassInterceptor { let msg = &ctx.msg; match &msg.body { - NetworkBody::Request(Request { + NetworkBodyMut::Request(Request { payload: RequestBody::Query(query), .. }) => { @@ -260,7 +260,7 @@ impl LowPassInterceptor { .unwrap_or(0); max_allowed_size = cache.map(|c| c.query); } - NetworkBody::Response(Response { + NetworkBodyMut::Response(Response { payload: ResponseBody::Reply(Reply { payload: PushBody::Put(put), @@ -277,7 +277,7 @@ impl LowPassInterceptor { .unwrap_or(0); max_allowed_size = cache.map(|c| c.reply); } - NetworkBody::Response(Response { + NetworkBodyMut::Response(Response { payload: ResponseBody::Reply(Reply { payload: PushBody::Del(delete), @@ -294,7 +294,7 @@ impl LowPassInterceptor { .unwrap_or(0); max_allowed_size = cache.map(|c| c.reply); } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(put), .. }) => { @@ -307,7 +307,7 @@ impl LowPassInterceptor { .unwrap_or(0); max_allowed_size = cache.map(|c| c.put); } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(delete), .. }) => { @@ -320,7 +320,7 @@ impl LowPassInterceptor { .unwrap_or(0); max_allowed_size = cache.map(|c| c.delete); } - NetworkBody::Response(Response { + NetworkBodyMut::Response(Response { payload: ResponseBody::Err(zenoh_protocol::zenoh::Err { payload, .. }), .. }) => { @@ -329,10 +329,10 @@ impl LowPassInterceptor { attachment_size = 0; max_allowed_size = cache.map(|c| c.reply); } - NetworkBody::ResponseFinal(_) => return true, - NetworkBody::Interest(_) => return true, - NetworkBody::Declare(_) => return true, - NetworkBody::OAM(_) => return true, + NetworkBodyMut::ResponseFinal(_) => return true, + NetworkBodyMut::Interest(_) => return true, + NetworkBodyMut::Declare(_) => return true, + NetworkBodyMut::OAM(_) => return true, } let max_allowed_size = match max_allowed_size { Some(v) => v, @@ -396,12 +396,12 @@ impl InterceptorTrait for LowPassInterceptor { fn intercept( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext>, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let cache = cache.and_then(|i| i.downcast_ref::()); - self.message_passes_filters(&ctx, cache).then_some(ctx) + self.message_passes_filters(ctx, cache) } } diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index 748c469405..fed7d51991 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -30,7 +30,7 @@ mod low_pass; use low_pass::low_pass_interceptor_factories; use zenoh_config::{Config, InterceptorFlow, InterceptorLink}; use zenoh_keyexpr::{keyexpr, OwnedKeyExpr}; -use zenoh_protocol::network::NetworkMessage; +use zenoh_protocol::network::NetworkMessageMut; use zenoh_result::ZResult; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; @@ -88,9 +88,9 @@ pub(crate) trait InterceptorTrait { fn intercept( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option>; + ) -> bool; } pub(crate) type Interceptor = Box; @@ -165,24 +165,21 @@ impl InterceptorTrait for InterceptorsChain { fn intercept<'a>( &self, - mut ctx: RoutingContext, + ctx: &mut RoutingContext, caches: Option<&Box>, - ) -> Option> { + ) -> bool { let caches = caches.and_then(|i| i.downcast_ref::>>>()); for (idx, interceptor) in self.interceptors.iter().enumerate() { let cache = caches .and_then(|caches| caches.get(idx).map(|k| k.as_ref())) .flatten(); - match interceptor.intercept(ctx, cache) { - Some(newctx) => ctx = newctx, - None => { - tracing::trace!("Msg intercepted!"); - return None; - } + if !interceptor.intercept(ctx, cache) { + tracing::trace!("Msg intercepted!"); + return false; } } - Some(ctx) + true } } @@ -206,9 +203,9 @@ impl InterceptorTrait for ComputeOnMiss { #[inline] fn intercept<'a>( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { + ) -> bool { if cache.is_some() { self.interceptor.intercept(ctx, cache) } else if let Some(key_expr) = ctx.full_keyexpr() { @@ -230,9 +227,9 @@ impl InterceptorTrait for IngressMsgLogger { fn intercept( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let expr = cache .and_then(|i| i.downcast_ref::().map(|e| e.as_str())) .or_else(|| ctx.full_expr()); @@ -245,7 +242,7 @@ impl InterceptorTrait for IngressMsgLogger { ctx.msg, expr, ); - Some(ctx) + true } } @@ -259,9 +256,9 @@ impl InterceptorTrait for EgressMsgLogger { fn intercept( &self, - ctx: RoutingContext, + ctx: &mut RoutingContext, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let expr = cache .and_then(|i| i.downcast_ref::().map(|e| e.as_str())) .or_else(|| ctx.full_expr()); @@ -273,7 +270,7 @@ impl InterceptorTrait for EgressMsgLogger { ctx.msg, expr ); - Some(ctx) + true } } diff --git a/zenoh/src/net/routing/interceptor/qos_overwrite.rs b/zenoh/src/net/routing/interceptor/qos_overwrite.rs index e962691623..63c19d0bf0 100644 --- a/zenoh/src/net/routing/interceptor/qos_overwrite.rs +++ b/zenoh/src/net/routing/interceptor/qos_overwrite.rs @@ -26,7 +26,7 @@ use zenoh_config::{ }; use zenoh_keyexpr::keyexpr_tree::{IKeyExprTree, IKeyExprTreeMut, IKeyExprTreeNode, KeBoxTree}; use zenoh_protocol::{ - network::{NetworkBody, Push, Request, Response}, + network::{NetworkBodyMut, Push, Request, Response}, zenoh::PushBody, }; use zenoh_result::ZResult; @@ -210,7 +210,7 @@ impl QosInterceptor { fn is_ke_affected_from_cache_or_ctx( &self, cache: Option<&Cache>, - ctx: &RoutingContext, + ctx: &RoutingContext>, ) -> bool { cache.map(|v| v.is_ke_affected).unwrap_or_else(|| { ctx.full_keyexpr() @@ -231,9 +231,9 @@ impl InterceptorTrait for QosInterceptor { fn intercept( &self, - mut ctx: RoutingContext, + ctx: &mut RoutingContext>, cache: Option<&Box>, - ) -> Option> { + ) -> bool { let cache = cache.and_then(|i| match i.downcast_ref::() { Some(c) => Some(c), None => { @@ -243,44 +243,44 @@ impl InterceptorTrait for QosInterceptor { }); let should_overwrite = match &ctx.msg.body { - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. }) => self.filter.put && self.is_ke_affected_from_cache_or_ctx(cache, &ctx), - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. }) => self.filter.delete && self.is_ke_affected_from_cache_or_ctx(cache, &ctx), - NetworkBody::Request(_) => { + NetworkBodyMut::Request(_) => { self.filter.query && self.is_ke_affected_from_cache_or_ctx(cache, &ctx) } - NetworkBody::Response(_) => { + NetworkBodyMut::Response(_) => { self.filter.reply && self.is_ke_affected_from_cache_or_ctx(cache, &ctx) } - NetworkBody::ResponseFinal(_) => false, - NetworkBody::Interest(_) => false, - NetworkBody::Declare(_) => false, - NetworkBody::OAM(_) => false, + NetworkBodyMut::ResponseFinal(_) => false, + NetworkBodyMut::Interest(_) => false, + NetworkBodyMut::Declare(_) => false, + NetworkBodyMut::OAM(_) => false, }; if !should_overwrite { - return Some(ctx); + return true; } match &mut ctx.msg.body { - NetworkBody::Request(Request { ext_qos, .. }) => { + NetworkBodyMut::Request(Request { ext_qos, .. }) => { self.overwrite_qos(QosOverwriteMessage::Query, ext_qos); } - NetworkBody::Response(Response { ext_qos, .. }) => { + NetworkBodyMut::Response(Response { ext_qos, .. }) => { self.overwrite_qos(QosOverwriteMessage::Reply, ext_qos); } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), ext_qos, .. }) => { self.overwrite_qos(QosOverwriteMessage::Put, ext_qos); } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), ext_qos, .. @@ -288,11 +288,11 @@ impl InterceptorTrait for QosInterceptor { self.overwrite_qos(QosOverwriteMessage::Delete, ext_qos); } // unaffected message types - NetworkBody::ResponseFinal(_) => {} - NetworkBody::Declare(_) => {} - NetworkBody::Interest(_) => {} - NetworkBody::OAM(_) => {} + NetworkBodyMut::ResponseFinal(_) => {} + NetworkBodyMut::Declare(_) => {} + NetworkBodyMut::Interest(_) => {} + NetworkBodyMut::OAM(_) => {} } - Some(ctx) + true } } diff --git a/zenoh/src/net/routing/mod.rs b/zenoh/src/net/routing/mod.rs index 06d2bf1bcf..290be7043d 100644 --- a/zenoh/src/net/routing/mod.rs +++ b/zenoh/src/net/routing/mod.rs @@ -26,7 +26,10 @@ pub mod router; use std::{cell::OnceCell, sync::Arc}; use zenoh_keyexpr::keyexpr; -use zenoh_protocol::{core::WireExpr, network::NetworkMessage}; +use zenoh_protocol::{ + core::WireExpr, + network::{NetworkMessageExt, NetworkMessageMut}, +}; use self::{dispatcher::face::Face, router::Resource}; use super::runtime; @@ -93,31 +96,22 @@ impl RoutingContext { pub(crate) fn outface(&self) -> Option<&Face> { self.outface.get() } + + pub(crate) fn with_mut(mut self, f: impl FnOnce(RoutingContext<&mut Msg>) -> R) -> R { + f(RoutingContext { + msg: &mut self.msg, + inface: self.inface, + outface: self.outface, + prefix: self.prefix, + full_expr: self.full_expr, + }) + } } -impl RoutingContext { +impl RoutingContext> { #[inline] pub(crate) fn wire_expr(&self) -> Option<&WireExpr> { - use zenoh_protocol::network::{DeclareBody, NetworkBody}; - match &self.msg.body { - NetworkBody::Push(m) => Some(&m.wire_expr), - NetworkBody::Request(m) => Some(&m.wire_expr), - NetworkBody::Response(m) => Some(&m.wire_expr), - NetworkBody::ResponseFinal(_) => None, - NetworkBody::Interest(m) => m.wire_expr.as_ref(), - NetworkBody::Declare(m) => match &m.body { - DeclareBody::DeclareKeyExpr(m) => Some(&m.wire_expr), - DeclareBody::UndeclareKeyExpr(_) => None, - DeclareBody::DeclareSubscriber(m) => Some(&m.wire_expr), - DeclareBody::UndeclareSubscriber(m) => Some(&m.ext_wire_expr.wire_expr), - DeclareBody::DeclareQueryable(m) => Some(&m.wire_expr), - DeclareBody::UndeclareQueryable(m) => Some(&m.ext_wire_expr.wire_expr), - DeclareBody::DeclareToken(m) => Some(&m.wire_expr), - DeclareBody::UndeclareToken(m) => Some(&m.ext_wire_expr.wire_expr), - DeclareBody::DeclareFinal(_) => None, - }, - NetworkBody::OAM(_) => None, - } + self.msg.wire_expr() } #[inline] diff --git a/zenoh/src/net/routing/namespace.rs b/zenoh/src/net/routing/namespace.rs index 3c7d09e9e2..291b0bdfa5 100644 --- a/zenoh/src/net/routing/namespace.rs +++ b/zenoh/src/net/routing/namespace.rs @@ -81,34 +81,34 @@ impl Namespace { } impl Primitives for Namespace { - fn send_interest(&self, mut msg: zenoh_protocol::network::Interest) { + fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { if let Some(w) = &mut msg.wire_expr { self.handle_namespace_egress(w, false); } self.primitives.send_interest(msg); } - fn send_declare(&self, mut msg: zenoh_protocol::network::Declare) { - self.handle_declare_egress(&mut msg); + fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { + self.handle_declare_egress(msg); self.primitives.send_declare(msg); } - fn send_push(&self, mut msg: Push, reliability: zenoh_protocol::core::Reliability) { + fn send_push(&self, msg: &mut Push, reliability: zenoh_protocol::core::Reliability) { self.handle_namespace_egress(&mut msg.wire_expr, false); self.primitives.send_push(msg, reliability); } - fn send_request(&self, mut msg: Request) { + fn send_request(&self, msg: &mut Request) { self.handle_namespace_egress(&mut msg.wire_expr, false); self.primitives.send_request(msg); } - fn send_response(&self, mut msg: Response) { + fn send_response(&self, msg: &mut Response) { self.handle_namespace_egress(&mut msg.wire_expr, false); self.primitives.send_response(msg); } - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { self.primitives.send_response_final(msg); } @@ -121,22 +121,6 @@ impl Primitives for Namespace { } } -impl Namespace { - pub(crate) fn send_push_lazy( - &self, - mut wire_expr: WireExpr, - qos: zenoh_protocol::network::push::ext::QoSType, - ext_tstamp: Option, - ext_nodeid: zenoh_protocol::network::push::ext::NodeIdType, - body: impl FnOnce() -> zenoh_protocol::zenoh::PushBody, - reliability: zenoh_protocol::core::Reliability, - ) { - self.handle_namespace_egress(&mut wire_expr, false); - self.primitives - .send_push_lazy(wire_expr, qos, ext_tstamp, ext_nodeid, body, reliability); - } -} - pub(crate) struct ENamespace { namespace: OwnedNonWildKeyExpr, primitives: Arc, @@ -263,37 +247,40 @@ impl EPrimitives for ENamespace { self } - fn send_interest(&self, mut ctx: super::RoutingContext) { + fn send_interest( + &self, + mut ctx: super::RoutingContext<&mut zenoh_protocol::network::Interest>, + ) { if self.handle_interest_ingress(&mut ctx.msg) { self.primitives.send_interest(ctx); } } - fn send_declare(&self, mut ctx: super::RoutingContext) { + fn send_declare(&self, mut ctx: super::RoutingContext<&mut zenoh_protocol::network::Declare>) { if self.handle_declare_ingress(&mut ctx.msg) { self.primitives.send_declare(ctx); } } - fn send_push(&self, mut msg: Push, reliability: zenoh_protocol::core::Reliability) { + fn send_push(&self, msg: &mut Push, reliability: zenoh_protocol::core::Reliability) { if self.handle_namespace_ingress(&mut msg.wire_expr, None) { self.primitives.send_push(msg, reliability); } } - fn send_request(&self, mut msg: Request) { + fn send_request(&self, msg: &mut Request) { if self.handle_namespace_ingress(&mut msg.wire_expr, None) { self.primitives.send_request(msg); } } - fn send_response(&self, mut msg: Response) { + fn send_response(&self, msg: &mut Response) { if self.handle_namespace_ingress(&mut msg.wire_expr, None) { self.primitives.send_response(msg); } } - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { self.primitives.send_response_final(msg); } } diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index 0a6607366f..b183987da2 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -109,7 +109,7 @@ impl Router { drop(tables); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } Arc::new(face) } @@ -169,7 +169,7 @@ impl Router { drop(tables); drop(ctrl_lock); for (p, m) in declares { - p.send_declare(m); + m.with_mut(|m| p.send_declare(m)); } Ok(Arc::new(DeMux::new(face, Some(transport), ingress))) diff --git a/zenoh/src/net/runtime/adminspace.rs b/zenoh/src/net/runtime/adminspace.rs index 4fdd17d52b..44537431ed 100644 --- a/zenoh/src/net/runtime/adminspace.rs +++ b/zenoh/src/net/runtime/adminspace.rs @@ -13,6 +13,7 @@ use std::{ collections::HashMap, convert::{TryFrom, TryInto}, + mem, sync::{Arc, Mutex}, }; @@ -316,7 +317,7 @@ impl AdminSpace { let primitives = runtime.state.router.new_primitives(admin.clone()); zlock!(admin.primitives).replace(primitives.clone()); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -329,7 +330,7 @@ impl AdminSpace { }), }); - primitives.send_declare(Declare { + primitives.send_declare(&mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -359,13 +360,13 @@ impl AdminSpace { } impl Primitives for AdminSpace { - fn send_interest(&self, msg: Interest) { + fn send_interest(&self, msg: &mut Interest) { tracing::trace!("Recv interest {:?}", msg); } - fn send_declare(&self, msg: Declare) { + fn send_declare(&self, msg: &mut Declare) { tracing::trace!("Recv declare {:?}", msg); - if let DeclareBody::DeclareKeyExpr(m) = msg.body { + if let DeclareBody::DeclareKeyExpr(m) = &msg.body { match self.key_expr_to_string(&m.wire_expr) { Ok(s) => { zlock!(self.mappings).insert(m.id, s.into()); @@ -375,7 +376,7 @@ impl Primitives for AdminSpace { } } - fn send_push(&self, msg: Push, _reliability: Reliability) { + fn send_push(&self, msg: &mut Push, _reliability: Reliability) { trace!("recv Push {:?}", msg); { let conf = &self.context.runtime.state.config.lock().0; @@ -392,7 +393,7 @@ impl Primitives for AdminSpace { "@/{}/{}/config/", self.context.runtime.state.zid, self.context.runtime.state.whatami, )) { - match msg.payload { + match &msg.payload { PushBody::Put(put) => match std::str::from_utf8(&put.payload.contiguous()) { Ok(json) => { tracing::trace!( @@ -433,9 +434,9 @@ impl Primitives for AdminSpace { } } - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { trace!("recv Request {:?}", msg); - match msg.payload { + match &mut msg.payload { RequestBody::Query(query) => { let primitives = zlock!(self.primitives).as_ref().unwrap().clone(); { @@ -445,7 +446,7 @@ impl Primitives for AdminSpace { "Received GET on '{}' but adminspace.permissions.read=false in configuration", msg.wire_expr ); - primitives.send_response_final(ResponseFinal { + primitives.send_response_final(&mut ResponseFinal { rid: msg.id, ext_qos: ext::QoSType::RESPONSE_FINAL, ext_tstamp: None, @@ -458,7 +459,7 @@ impl Primitives for AdminSpace { Ok(key_expr) => key_expr.into_owned(), Err(e) => { tracing::error!("Unknown KeyExpr: {}", e); - primitives.send_response_final(ResponseFinal { + primitives.send_response_final(&mut ResponseFinal { rid: msg.id, ext_qos: ext::QoSType::RESPONSE_FINAL, ext_tstamp: None, @@ -471,16 +472,15 @@ impl Primitives for AdminSpace { let query = Query { inner: Arc::new(QueryInner { key_expr: key_expr.clone(), - parameters: query.parameters.into(), + parameters: mem::take(&mut query.parameters).into(), qid: msg.id, zid: zid.into(), primitives, }), eid: self.queryable_id, - value: query - .ext_body + value: mem::take(&mut query.ext_body) .map(|b| (b.payload.into(), b.encoding.into())), - attachment: query.ext_attachment.map(Into::into), + attachment: query.ext_attachment.take().map(Into::into), }; for (key, handler) in &self.handlers { @@ -492,11 +492,11 @@ impl Primitives for AdminSpace { } } - fn send_response(&self, msg: Response) { + fn send_response(&self, msg: &mut Response) { trace!("recv Response {:?}", msg); } - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { trace!("recv ResponseFinal {:?}", msg); } @@ -511,32 +511,32 @@ impl Primitives for AdminSpace { impl crate::net::primitives::EPrimitives for AdminSpace { #[inline] - fn send_interest(&self, ctx: crate::net::routing::RoutingContext) { + fn send_interest(&self, ctx: crate::net::routing::RoutingContext<&mut Interest>) { (self as &dyn Primitives).send_interest(ctx.msg) } #[inline] - fn send_declare(&self, ctx: crate::net::routing::RoutingContext) { + fn send_declare(&self, ctx: crate::net::routing::RoutingContext<&mut Declare>) { (self as &dyn Primitives).send_declare(ctx.msg) } #[inline] - fn send_push(&self, msg: Push, reliability: Reliability) { + fn send_push(&self, msg: &mut Push, reliability: Reliability) { (self as &dyn Primitives).send_push(msg, reliability) } #[inline] - fn send_request(&self, msg: Request) { + fn send_request(&self, msg: &mut Request) { (self as &dyn Primitives).send_request(msg) } #[inline] - fn send_response(&self, msg: Response) { + fn send_response(&self, msg: &mut Response) { (self as &dyn Primitives).send_response(msg) } #[inline] - fn send_response_final(&self, msg: ResponseFinal) { + fn send_response_final(&self, msg: &mut ResponseFinal) { (self as &dyn Primitives).send_response_final(msg) } diff --git a/zenoh/src/net/runtime/mod.rs b/zenoh/src/net/runtime/mod.rs index b9907b86e6..2836fe3a52 100644 --- a/zenoh/src/net/runtime/mod.rs +++ b/zenoh/src/net/runtime/mod.rs @@ -42,7 +42,7 @@ use zenoh_link::{EndPoint, Link}; use zenoh_plugin_trait::{PluginStartArgs, StructVersion}; use zenoh_protocol::{ core::{Locator, WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, }; use zenoh_result::{bail, ZResult}; #[cfg(feature = "shared-memory")] @@ -436,7 +436,7 @@ pub(super) struct RuntimeSession { } impl TransportPeerEventHandler for RuntimeSession { - fn handle_message(&self, msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, msg: NetworkMessageMut) -> ZResult<()> { self.main_handler.handle_message(msg) } @@ -507,7 +507,7 @@ pub(super) struct RuntimeMulticastSession { } impl TransportPeerEventHandler for RuntimeMulticastSession { - fn handle_message(&self, msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, msg: NetworkMessageMut) -> ZResult<()> { self.main_handler.handle_message(msg) } diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index c4f24bd9fe..bc3491182b 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -25,7 +25,7 @@ use zenoh_protocol::{ key_expr::keyexpr, Encoding, ExprId, Reliability, WhatAmI, WireExpr, ZenohIdProto, EMPTY_EXPR_ID, }, - network::{ext, Declare, DeclareBody, DeclareKeyExpr}, + network::{ext, Declare, DeclareBody, DeclareKeyExpr, Push}, zenoh::{PushBody, Put}, }; @@ -82,7 +82,7 @@ fn base_test() { &WireExpr::from(1).with_suffix("four/five"), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); Tables::print(&zread!(tables.tables)); @@ -204,7 +204,7 @@ fn multisub_test() { &"sub".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); let optres = Resource::get_resource(zread!(tables.tables)._get_root(), "sub") .map(|res| Arc::downgrade(&res)); @@ -220,7 +220,7 @@ fn multisub_test() { &"sub".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); assert!(res.upgrade().is_some()); @@ -231,7 +231,7 @@ fn multisub_test() { 0, &WireExpr::empty(), NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); assert!(res.upgrade().is_some()); @@ -242,7 +242,7 @@ fn multisub_test() { 1, &WireExpr::empty(), NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); assert!(res.upgrade().is_none()); @@ -324,7 +324,7 @@ async fn clean_test() { &"todrop1/todrop11".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); let optres2 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1/todrop11") .map(|res| Arc::downgrade(&res)); @@ -340,7 +340,7 @@ async fn clean_test() { &WireExpr::from(1).with_suffix("/todrop12"), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); let optres3 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1/todrop12") .map(|res| Arc::downgrade(&res)); @@ -356,7 +356,7 @@ async fn clean_test() { 1, &WireExpr::empty(), NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); println!("COUNT2: {}", res3.strong_count()); @@ -372,7 +372,7 @@ async fn clean_test() { 0, &WireExpr::empty(), NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); assert!(res1.upgrade().is_some()); assert!(res2.upgrade().is_none()); @@ -393,7 +393,7 @@ async fn clean_test() { &"todrop3".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop3") .map(|res| Arc::downgrade(&res)); @@ -408,7 +408,7 @@ async fn clean_test() { 2, &WireExpr::empty(), NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); assert!(res1.upgrade().is_some()); @@ -426,7 +426,7 @@ async fn clean_test() { &"todrop5".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); declare_subscription( zlock!(tables.ctrl_lock).as_ref(), @@ -436,7 +436,7 @@ async fn clean_test() { &"todrop6".into(), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop4") @@ -514,10 +514,10 @@ impl ClientPrimitives { } impl Primitives for ClientPrimitives { - fn send_interest(&self, _msg: zenoh_protocol::network::Interest) {} + fn send_interest(&self, _msg: &mut zenoh_protocol::network::Interest) {} - fn send_declare(&self, msg: zenoh_protocol::network::Declare) { - match msg.body { + fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { + match &msg.body { DeclareBody::DeclareKeyExpr(d) => { let name = self.get_name(&d.wire_expr); zlock!(self.mapping).insert(d.id, name); @@ -529,15 +529,15 @@ impl Primitives for ClientPrimitives { } } - fn send_push(&self, msg: zenoh_protocol::network::Push, _reliability: Reliability) { + fn send_push(&self, msg: &mut zenoh_protocol::network::Push, _reliability: Reliability) { *zlock!(self.data) = Some(msg.wire_expr.to_owned()); } - fn send_request(&self, _msg: zenoh_protocol::network::Request) {} + fn send_request(&self, _msg: &mut zenoh_protocol::network::Request) {} - fn send_response(&self, _msg: zenoh_protocol::network::Response) {} + fn send_response(&self, _msg: &mut zenoh_protocol::network::Response) {} - fn send_response_final(&self, _msg: zenoh_protocol::network::ResponseFinal) {} + fn send_response_final(&self, _msg: &mut zenoh_protocol::network::ResponseFinal) {} fn send_close(&self) {} @@ -547,10 +547,10 @@ impl Primitives for ClientPrimitives { } impl EPrimitives for ClientPrimitives { - fn send_interest(&self, _ctx: RoutingContext) {} + fn send_interest(&self, _ctx: RoutingContext<&mut zenoh_protocol::network::Interest>) {} - fn send_declare(&self, ctx: RoutingContext) { - match ctx.msg.body { + fn send_declare(&self, ctx: RoutingContext<&mut zenoh_protocol::network::Declare>) { + match &ctx.msg.body { DeclareBody::DeclareKeyExpr(d) => { let name = self.get_name(&d.wire_expr); zlock!(self.mapping).insert(d.id, name); @@ -562,19 +562,19 @@ impl EPrimitives for ClientPrimitives { } } - fn send_push(&self, msg: zenoh_protocol::network::Push, _reliability: Reliability) { + fn send_push(&self, msg: &mut zenoh_protocol::network::Push, _reliability: Reliability) { *zlock!(self.data) = Some(msg.wire_expr.to_owned()); } - fn send_request(&self, msg: zenoh_protocol::network::Request) { + fn send_request(&self, msg: &mut zenoh_protocol::network::Request) { *zlock!(self.data) = Some(msg.wire_expr.to_owned()); } - fn send_response(&self, msg: zenoh_protocol::network::Response) { + fn send_response(&self, msg: &mut zenoh_protocol::network::Response) { *zlock!(self.data) = Some(msg.wire_expr.to_owned()); } - fn send_response_final(&self, _msg: zenoh_protocol::network::ResponseFinal) {} + fn send_response_final(&self, _msg: &mut zenoh_protocol::network::ResponseFinal) {} fn as_any(&self) -> &dyn std::any::Any { self @@ -605,7 +605,7 @@ fn client_test() { ); Primitives::send_declare( primitives0.as_ref(), - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -624,7 +624,7 @@ fn client_test() { &WireExpr::from(11).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); register_expr( &tables, @@ -634,7 +634,7 @@ fn client_test() { ); Primitives::send_declare( primitives0.as_ref(), - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -656,7 +656,7 @@ fn client_test() { ); Primitives::send_declare( primitives1.as_ref(), - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -675,7 +675,7 @@ fn client_test() { &WireExpr::from(21).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); register_expr( &tables, @@ -685,7 +685,7 @@ fn client_test() { ); Primitives::send_declare( primitives1.as_ref(), - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -707,7 +707,7 @@ fn client_test() { ); Primitives::send_declare( primitives2.as_ref(), - Declare { + &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, @@ -726,7 +726,7 @@ fn client_test() { &WireExpr::from(31).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| p.send_declare(m), + &mut |p, m| m.with_mut(|m| p.send_declare(m)), ); primitives0.clear_data(); @@ -737,12 +737,12 @@ fn client_test() { route_data( &tables, &face.upgrade().unwrap(), - wire_expr, - ext::QoSType::DEFAULT, - None, - ext::NodeIdType { node_id: 0 }, - || { - PushBody::Put(Put { + &mut Push { + wire_expr, + ext_qos: ext::QoSType::DEFAULT, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType { node_id: 0 }, + payload: PushBody::Put(Put { timestamp: None, encoding: Encoding::empty(), ext_sinfo: None, @@ -751,7 +751,7 @@ fn client_test() { ext_unknown: vec![], payload: ZBuf::empty(), ext_attachment: None, - }) + }), }, Reliability::Reliable, ); From 932ddd7c154934ded5eef69456a81bbd211ee3e1 Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Fri, 14 Mar 2025 14:23:27 +0100 Subject: [PATCH 02/49] fix lints --- commons/zenoh-protocol/src/network/mod.rs | 34 +++++++++++++++++-- io/zenoh-transport/src/common/batch.rs | 12 +++---- io/zenoh-transport/src/common/pipeline.rs | 2 +- io/zenoh-transport/tests/endpoints.rs | 4 +-- .../tests/multicast_compression.rs | 8 ++--- .../tests/multicast_transport.rs | 6 ++-- .../tests/transport_whitelist.rs | 4 +-- .../tests/unicast_authenticator.rs | 4 +-- .../tests/unicast_compression.rs | 8 ++--- .../tests/unicast_concurrent.rs | 8 ++--- .../tests/unicast_fragmentation.rs | 10 +++--- .../tests/unicast_intermittent.rs | 6 ++-- .../tests/unicast_priorities.rs | 10 +++--- io/zenoh-transport/tests/unicast_shm.rs | 14 ++++---- .../tests/unicast_simultaneous.rs | 6 ++-- io/zenoh-transport/tests/unicast_transport.rs | 10 +++--- zenoh/src/net/primitives/mux.rs | 4 +-- zenoh/src/net/routing/dispatcher/queries.rs | 2 +- zenoh/src/net/routing/namespace.rs | 11 +++--- 19 files changed, 95 insertions(+), 68 deletions(-) diff --git a/commons/zenoh-protocol/src/network/mod.rs b/commons/zenoh-protocol/src/network/mod.rs index c61664e67d..b6161d2240 100644 --- a/commons/zenoh-protocol/src/network/mod.rs +++ b/commons/zenoh-protocol/src/network/mod.rs @@ -241,7 +241,7 @@ impl NetworkMessageExt for NetworkMessage { } } -impl<'a> NetworkMessageExt for NetworkMessageRef<'a> { +impl NetworkMessageExt for NetworkMessageRef<'_> { fn body(&self) -> NetworkBodyRef { self.body } @@ -256,7 +256,7 @@ impl<'a> NetworkMessageExt for NetworkMessageRef<'a> { } } -impl<'a> NetworkMessageExt for NetworkMessageMut<'a> { +impl NetworkMessageExt for NetworkMessageMut<'_> { fn body(&self) -> NetworkBodyRef { match &self.body { NetworkBodyMut::Push(body) => NetworkBodyRef::Push(body), @@ -378,6 +378,36 @@ impl From for NetworkMessage { } } +impl From for NetworkMessage { + fn from(declare: Declare) -> Self { + NetworkBody::Declare(declare).into() + } +} + +impl From for NetworkMessage { + fn from(push: Push) -> Self { + NetworkBody::Push(push).into() + } +} + +impl From for NetworkMessage { + fn from(request: Request) -> Self { + NetworkBody::Request(request).into() + } +} + +impl From for NetworkMessage { + fn from(response: Response) -> Self { + NetworkBody::Response(response).into() + } +} + +impl From for NetworkMessage { + fn from(final_response: ResponseFinal) -> Self { + NetworkBody::ResponseFinal(final_response).into() + } +} + // Extensions pub mod ext { use core::fmt; diff --git a/io/zenoh-transport/src/common/batch.rs b/io/zenoh-transport/src/common/batch.rs index b46d4e86d6..d7e52eaf5f 100644 --- a/io/zenoh-transport/src/common/batch.rs +++ b/io/zenoh-transport/src/common/batch.rs @@ -535,7 +535,7 @@ mod tests { use zenoh_core::zcondfeat; use zenoh_protocol::{ core::{CongestionControl, Encoding, Priority, Reliability, WireExpr}, - network::{ext, Push}, + network::{ext, NetworkMessage, NetworkMessageExt, Push}, transport::{ frame::{self, FrameHeader}, Fragment, KeepAlive, TransportMessage, @@ -629,7 +629,7 @@ mod tests { // Serialize assuming there is already a frame batch.clear(); - assert!(batch.encode(&nmsg).is_err()); + assert!(batch.encode(nmsg.as_ref()).is_err()); assert_eq!(batch.len(), 0); let mut frame = FrameHeader { @@ -640,13 +640,13 @@ mod tests { nmsg.reliability = frame.reliability; // Serialize with a frame - batch.encode((&nmsg, &frame)).unwrap(); + batch.encode((nmsg.as_ref(), &frame)).unwrap(); assert_ne!(batch.len(), 0); nmsgs_in.push(nmsg.clone()); frame.reliability = Reliability::BestEffort; nmsg.reliability = frame.reliability; - batch.encode((&nmsg, &frame)).unwrap(); + batch.encode((nmsg.as_ref(), &frame)).unwrap(); assert_ne!(batch.len(), 0); nmsgs_in.push(nmsg.clone()); @@ -655,12 +655,12 @@ mod tests { tmsgs_in.push(tmsg.clone()); // Serialize assuming there is already a frame - assert!(batch.encode(&nmsg).is_err()); + assert!(batch.encode(nmsg.as_ref()).is_err()); assert_ne!(batch.len(), 0); // Serialize with a frame frame.sn = 1; - batch.encode((&nmsg, &frame)).unwrap(); + batch.encode((nmsg.as_ref(), &frame)).unwrap(); assert_ne!(batch.len(), 0); nmsgs_in.push(nmsg.clone()); } diff --git a/io/zenoh-transport/src/common/pipeline.rs b/io/zenoh-transport/src/common/pipeline.rs index 486cd0b5ac..2097aa9e75 100644 --- a/io/zenoh-transport/src/common/pipeline.rs +++ b/io/zenoh-transport/src/common/pipeline.rs @@ -995,7 +995,7 @@ mod tests { use zenoh_config::{QueueAllocConf, QueueAllocMode}; use zenoh_protocol::{ core::{Bits, CongestionControl, Encoding, Priority, Reliability}, - network::{ext, Push}, + network::{ext, NetworkMessage, Push}, transport::{BatchSize, Fragment, Frame, TransportBody, TransportSn}, zenoh::{PushBody, Put}, }; diff --git a/io/zenoh-transport/tests/endpoints.rs b/io/zenoh-transport/tests/endpoints.rs index 21f67b327c..b2a60dcf16 100644 --- a/io/zenoh-transport/tests/endpoints.rs +++ b/io/zenoh-transport/tests/endpoints.rs @@ -17,7 +17,7 @@ use zenoh_core::ztimeout; use zenoh_link::{EndPoint, Link}; use zenoh_protocol::{ core::{WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, }; use zenoh_result::ZResult; use zenoh_transport::{ @@ -57,7 +57,7 @@ impl TransportEventHandler for SH { pub struct SC; impl TransportPeerEventHandler for SC { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } fn new_link(&self, _link: Link) {} diff --git a/io/zenoh-transport/tests/multicast_compression.rs b/io/zenoh-transport/tests/multicast_compression.rs index 5e31aa6514..9303dfcbe3 100644 --- a/io/zenoh-transport/tests/multicast_compression.rs +++ b/io/zenoh-transport/tests/multicast_compression.rs @@ -37,7 +37,7 @@ mod tests { ext::{NodeIdType, QoSType}, Push, }, - NetworkMessage, + NetworkMessage, NetworkMessageMut, }, zenoh::Put, }; @@ -119,7 +119,7 @@ mod tests { } impl TransportPeerEventHandler for SCPeer { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::Relaxed); Ok(()) } @@ -260,7 +260,7 @@ mod tests { msg_size: usize, ) { // Create the message to send - let message: NetworkMessage = Push { + let mut message: NetworkMessage = Push { wire_expr: "test".into(), ext_qos: QoSType::new(channel.priority, CongestionControl::Block, false), ext_tstamp: None, @@ -281,7 +281,7 @@ mod tests { println!("Sending {MSG_COUNT} messages... {channel:?} {msg_size}"); for _ in 0..MSG_COUNT { - peer01.transport.schedule(message.clone()).unwrap(); + peer01.transport.schedule(message.as_mut()).unwrap(); } match channel.reliability { diff --git a/io/zenoh-transport/tests/multicast_transport.rs b/io/zenoh-transport/tests/multicast_transport.rs index 18c8468ecc..fd35d0555c 100644 --- a/io/zenoh-transport/tests/multicast_transport.rs +++ b/io/zenoh-transport/tests/multicast_transport.rs @@ -38,7 +38,7 @@ mod tests { ext::{NodeIdType, QoSType}, Push, }, - NetworkMessage, + NetworkMessage, NetworkMessageMut, }, zenoh::Put, }; @@ -118,7 +118,7 @@ mod tests { } impl TransportPeerEventHandler for SCPeer { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::Relaxed); Ok(()) } @@ -278,7 +278,7 @@ mod tests { println!("Sending {MSG_COUNT} messages... {channel:?} {msg_size}"); for _ in 0..MSG_COUNT { - peer01.transport.schedule(message.clone()).unwrap(); + peer01.transport.schedule(message.clone().as_mut()).unwrap(); } match channel.reliability { diff --git a/io/zenoh-transport/tests/transport_whitelist.rs b/io/zenoh-transport/tests/transport_whitelist.rs index 66f5b58e3b..674a67d4a1 100644 --- a/io/zenoh-transport/tests/transport_whitelist.rs +++ b/io/zenoh-transport/tests/transport_whitelist.rs @@ -17,7 +17,7 @@ use zenoh_core::ztimeout; use zenoh_link::Link; use zenoh_protocol::{ core::{EndPoint, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, }; use zenoh_result::ZResult; use zenoh_transport::{ @@ -52,7 +52,7 @@ impl TransportEventHandler for SHRouter { pub struct SCRouter; impl TransportPeerEventHandler for SCRouter { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } diff --git a/io/zenoh-transport/tests/unicast_authenticator.rs b/io/zenoh-transport/tests/unicast_authenticator.rs index 58b1304d1f..79a02711f1 100644 --- a/io/zenoh-transport/tests/unicast_authenticator.rs +++ b/io/zenoh-transport/tests/unicast_authenticator.rs @@ -17,7 +17,7 @@ use zenoh_core::{zasyncwrite, ztimeout}; use zenoh_link::Link; use zenoh_protocol::{ core::{EndPoint, WhatAmI, ZenohIdProto}, - network::NetworkMessage, + network::NetworkMessageMut, }; use zenoh_result::ZResult; use zenoh_transport::{ @@ -65,7 +65,7 @@ impl MHRouterAuthenticator { } impl TransportPeerEventHandler for MHRouterAuthenticator { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { Ok(()) } fn new_link(&self, _link: Link) {} diff --git a/io/zenoh-transport/tests/unicast_compression.rs b/io/zenoh-transport/tests/unicast_compression.rs index b7f34fbf7f..e96fa24a6c 100644 --- a/io/zenoh-transport/tests/unicast_compression.rs +++ b/io/zenoh-transport/tests/unicast_compression.rs @@ -33,7 +33,7 @@ mod tests { }, network::{ push::ext::{NodeIdType, QoSType}, - NetworkMessage, Push, + NetworkMessage, NetworkMessageMut, Push, }, zenoh::Put, }; @@ -103,7 +103,7 @@ mod tests { } impl TransportPeerEventHandler for SCRouter { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::SeqCst); Ok(()) } @@ -143,7 +143,7 @@ mod tests { pub struct SCClient; impl TransportPeerEventHandler for SCClient { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } @@ -303,7 +303,7 @@ mod tests { } .into(); for _ in 0..MSG_COUNT { - let _ = client_transport.schedule(message.clone()); + let _ = client_transport.schedule(message.clone().as_mut()); } match channel.reliability { diff --git a/io/zenoh-transport/tests/unicast_concurrent.rs b/io/zenoh-transport/tests/unicast_concurrent.rs index 410ac33955..de2fdbfdea 100644 --- a/io/zenoh-transport/tests/unicast_concurrent.rs +++ b/io/zenoh-transport/tests/unicast_concurrent.rs @@ -30,7 +30,7 @@ use zenoh_protocol::{ ext::{NodeIdType, QoSType}, Push, }, - NetworkMessage, + NetworkMessage, NetworkMessageMut, }, zenoh::Put, }; @@ -91,7 +91,7 @@ impl MHPeer { } impl TransportPeerEventHandler for MHPeer { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::AcqRel); Ok(()) } @@ -210,7 +210,7 @@ async fn transport_concurrent(endpoint01: Vec, endpoint02: Vec Scheduling OK"); @@ -312,7 +312,7 @@ async fn transport_concurrent(endpoint01: Vec, endpoint02: Vec Scheduling OK"); diff --git a/io/zenoh-transport/tests/unicast_fragmentation.rs b/io/zenoh-transport/tests/unicast_fragmentation.rs index f45e65702a..63d0553908 100644 --- a/io/zenoh-transport/tests/unicast_fragmentation.rs +++ b/io/zenoh-transport/tests/unicast_fragmentation.rs @@ -29,7 +29,7 @@ use zenoh_protocol::{ core::{CongestionControl, Encoding, EndPoint, Priority, WhatAmI, ZenohIdProto}, network::{ push::ext::{NodeIdType, QoSType}, - NetworkMessage, Push, + NetworkMessage, NetworkMessageExt, NetworkMessageMut, Push, }, zenoh::Put, }; @@ -119,8 +119,8 @@ impl SCRouter { } impl TransportPeerEventHandler for SCRouter { - fn handle_message(&self, message: NetworkMessage) -> ZResult<()> { - assert_eq!(message, *MSG); + fn handle_message(&self, message: NetworkMessageMut) -> ZResult<()> { + assert_eq!(message.as_ref(), MSG.as_ref()); self.count.fetch_add(1, Ordering::SeqCst); std::thread::sleep(2 * SLEEP_SEND); Ok(()) @@ -161,7 +161,7 @@ impl TransportEventHandler for SHClient { pub struct SCClient; impl TransportPeerEventHandler for SCClient { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } @@ -290,7 +290,7 @@ async fn test_transport(router_handler: Arc, client_transport: Transpo ztimeout!(async { let mut sent = 0; while router_handler.get_count() < MSG_COUNT { - if client_transport.schedule(MSG.clone()).is_ok() { + if client_transport.schedule(MSG.clone().as_mut()).is_ok() { sent += 1; println!( "Sent: {sent}. Received: {}/{MSG_COUNT}", diff --git a/io/zenoh-transport/tests/unicast_intermittent.rs b/io/zenoh-transport/tests/unicast_intermittent.rs index 3e2f8196f4..0e288a4360 100644 --- a/io/zenoh-transport/tests/unicast_intermittent.rs +++ b/io/zenoh-transport/tests/unicast_intermittent.rs @@ -31,7 +31,7 @@ use zenoh_protocol::{ ext::{NodeIdType, QoSType}, Push, }, - NetworkMessage, + NetworkMessage, NetworkMessageMut, }, zenoh::Put, }; @@ -131,7 +131,7 @@ impl SCClient { } impl TransportPeerEventHandler for SCClient { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { self.counter.fetch_add(1, Ordering::AcqRel); Ok(()) } @@ -340,7 +340,7 @@ async fn transport_intermittent(endpoint: &EndPoint, lowlatency_transport: bool) assert_eq!(ll.len(), 1); } } - let res = s.schedule(message.clone()); + let res = s.schedule(message.clone().as_mut()); if res.is_err() { print!("X"); std::io::stdout().flush().unwrap(); diff --git a/io/zenoh-transport/tests/unicast_priorities.rs b/io/zenoh-transport/tests/unicast_priorities.rs index 87cf5b5e9e..77cfa22545 100644 --- a/io/zenoh-transport/tests/unicast_priorities.rs +++ b/io/zenoh-transport/tests/unicast_priorities.rs @@ -31,7 +31,7 @@ use zenoh_protocol::{ ext::{NodeIdType, QoSType}, Push, }, - NetworkBody, NetworkMessage, + NetworkBodyMut, NetworkMessage, NetworkMessageMut, }, zenoh::Put, }; @@ -117,9 +117,9 @@ impl SCRouter { } impl TransportPeerEventHandler for SCRouter { - fn handle_message(&self, message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, message: NetworkMessageMut) -> ZResult<()> { match &message.body { - NetworkBody::Push(p) => { + NetworkBodyMut::Push(p) => { assert_eq!( self.priority.load(Ordering::Relaxed), p.ext_qos.get_priority() as usize @@ -176,7 +176,7 @@ impl Default for SCClient { } impl TransportPeerEventHandler for SCClient { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } @@ -305,7 +305,7 @@ async fn single_run(router_handler: Arc, client_transport: TransportUn println!("Sending {MSG_COUNT} messages... {p:?} {ms}"); for _ in 0..MSG_COUNT { - client_transport.schedule(message.clone()).unwrap(); + client_transport.schedule(message.clone().as_mut()).unwrap(); } // Wait for the messages to arrive to the other side diff --git a/io/zenoh-transport/tests/unicast_shm.rs b/io/zenoh-transport/tests/unicast_shm.rs index b03771a164..ae5728b207 100644 --- a/io/zenoh-transport/tests/unicast_shm.rs +++ b/io/zenoh-transport/tests/unicast_shm.rs @@ -30,7 +30,7 @@ mod tests { core::{CongestionControl, Encoding, EndPoint, Priority, WhatAmI, ZenohIdProto}, network::{ push::ext::{NodeIdType, QoSType}, - NetworkBody, NetworkMessage, Push, + NetworkBodyMut, NetworkMessage, NetworkMessageMut, Push, }, zenoh::{PushBody, Put}, }; @@ -105,14 +105,14 @@ mod tests { } impl TransportPeerEventHandler for SCPeer { - fn handle_message(&self, message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, message: NetworkMessageMut) -> ZResult<()> { if self.is_shm { print!("s"); } else { print!("n"); } let payload = match message.body { - NetworkBody::Push(m) => match m.payload { + NetworkBodyMut::Push(m) => match &mut m.payload { PushBody::Put(Put { payload, .. }) => { for zs in payload.zslices() { if self.is_shm && zs.downcast_ref::().is_none() { @@ -247,7 +247,7 @@ mod tests { ztimeout!(layout.alloc().with_policy::>()).unwrap(); sbuf[0..8].copy_from_slice(&msg_count.to_le_bytes()); - let message: NetworkMessage = Push { + let mut message: NetworkMessage = Push { wire_expr: "test".into(), ext_qos: QoSType::new(Priority::DEFAULT, CongestionControl::Block, false), ext_tstamp: None, @@ -265,7 +265,7 @@ mod tests { } .into(); - peer_shm02_transport.schedule(message).unwrap(); + peer_shm02_transport.schedule(message.as_mut()).unwrap(); } // Wait a little bit @@ -288,7 +288,7 @@ mod tests { ztimeout!(layout.alloc().with_policy::>()).unwrap(); sbuf[0..8].copy_from_slice(&msg_count.to_le_bytes()); - let message: NetworkMessage = Push { + let mut message: NetworkMessage = Push { wire_expr: "test".into(), ext_qos: QoSType::new(Priority::DEFAULT, CongestionControl::Block, false), ext_tstamp: None, @@ -306,7 +306,7 @@ mod tests { } .into(); - peer_net01_transport.schedule(message).unwrap(); + peer_net01_transport.schedule(message.as_mut()).unwrap(); } // Wait a little bit diff --git a/io/zenoh-transport/tests/unicast_simultaneous.rs b/io/zenoh-transport/tests/unicast_simultaneous.rs index 97d43fc672..366623560f 100644 --- a/io/zenoh-transport/tests/unicast_simultaneous.rs +++ b/io/zenoh-transport/tests/unicast_simultaneous.rs @@ -29,7 +29,7 @@ mod tests { core::{CongestionControl, Encoding, EndPoint, Priority, WhatAmI, ZenohIdProto}, network::{ push::ext::{NodeIdType, QoSType}, - NetworkMessage, Push, + NetworkMessage, NetworkMessageMut, Push, }, zenoh::Put, }; @@ -92,7 +92,7 @@ mod tests { println!("[Simultaneous {}] Sending {}...", self.zid, MSG_COUNT); for _ in 0..MSG_COUNT { - transport.schedule(message.clone()).unwrap(); + transport.schedule(message.clone().as_mut()).unwrap(); } println!("[Simultaneous {}] ... sent {}", self.zid, MSG_COUNT); @@ -119,7 +119,7 @@ mod tests { } impl TransportPeerEventHandler for MHPeer { - fn handle_message(&self, _msg: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _msg: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::AcqRel); Ok(()) } diff --git a/io/zenoh-transport/tests/unicast_transport.rs b/io/zenoh-transport/tests/unicast_transport.rs index 34b10dbce5..a04444ab77 100644 --- a/io/zenoh-transport/tests/unicast_transport.rs +++ b/io/zenoh-transport/tests/unicast_transport.rs @@ -31,7 +31,7 @@ use zenoh_protocol::{ }, network::{ push::ext::{NodeIdType, QoSType}, - NetworkMessage, Push, + NetworkMessage, NetworkMessageMut, Push, }, zenoh::Put, }; @@ -294,7 +294,7 @@ impl SCRouter { } impl TransportPeerEventHandler for SCRouter { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { self.count.fetch_add(1, Ordering::SeqCst); Ok(()) } @@ -334,7 +334,7 @@ impl TransportEventHandler for SHClient { pub struct SCClient; impl TransportPeerEventHandler for SCClient { - fn handle_message(&self, _message: NetworkMessage) -> ZResult<()> { + fn handle_message(&self, _message: NetworkMessageMut) -> ZResult<()> { Ok(()) } @@ -499,8 +499,8 @@ async fn test_transport( } .into(); - for _ in 0..msg_count { - let _ = client_transport.schedule(message.clone()); + for _ in 0..MSG_COUNT { + let _ = client_transport.schedule(message.clone().as_mut()); } ztimeout!(async { diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index 6b6b6c50ce..1cbe8db8d9 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -112,9 +112,9 @@ impl EPrimitives for Mux { } } - fn send_push(&self, mut msg: &mut Push, reliability: Reliability) { + fn send_push(&self, msg: &mut Push, reliability: Reliability) { let msg = NetworkMessageMut { - body: NetworkBodyMut::Push(&mut msg), + body: NetworkBodyMut::Push(msg), reliability, #[cfg(feature = "stats")] size: None, diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index b19df50377..a0b6f3e354 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -393,7 +393,7 @@ macro_rules! inc_req_stats { if let Some(stats) = $face.stats.as_ref() { use zenoh_buffers::buffer::Buffer; match &$body { - RequestBody::Query(q) => { + zenoh_protocol::zenoh::RequestBody::Query(q) => { stats.[<$txrx _z_query_msgs>].[](1); stats.[<$txrx _z_query_pl_bytes>].[]( q.ext_body.as_ref().map(|b| b.payload.len()).unwrap_or(0), diff --git a/zenoh/src/net/routing/namespace.rs b/zenoh/src/net/routing/namespace.rs index 291b0bdfa5..b9bd6b6f0c 100644 --- a/zenoh/src/net/routing/namespace.rs +++ b/zenoh/src/net/routing/namespace.rs @@ -247,17 +247,14 @@ impl EPrimitives for ENamespace { self } - fn send_interest( - &self, - mut ctx: super::RoutingContext<&mut zenoh_protocol::network::Interest>, - ) { - if self.handle_interest_ingress(&mut ctx.msg) { + fn send_interest(&self, ctx: super::RoutingContext<&mut zenoh_protocol::network::Interest>) { + if self.handle_interest_ingress(ctx.msg) { self.primitives.send_interest(ctx); } } - fn send_declare(&self, mut ctx: super::RoutingContext<&mut zenoh_protocol::network::Declare>) { - if self.handle_declare_ingress(&mut ctx.msg) { + fn send_declare(&self, ctx: super::RoutingContext<&mut zenoh_protocol::network::Declare>) { + if self.handle_declare_ingress(ctx.msg) { self.primitives.send_declare(ctx); } } From 86ce2ac9939956f62eac4e04f16711025935917f Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Fri, 14 Mar 2025 14:39:01 +0100 Subject: [PATCH 03/49] fix lints2 --- commons/zenoh-codec/src/network/mod.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/commons/zenoh-codec/src/network/mod.rs b/commons/zenoh-codec/src/network/mod.rs index 708705e5ce..407e74aecf 100644 --- a/commons/zenoh-codec/src/network/mod.rs +++ b/commons/zenoh-codec/src/network/mod.rs @@ -57,6 +57,17 @@ where } } +impl WCodec<&NetworkMessage, &mut W> for Zenoh080 +where + W: Writer, +{ + type Output = Result<(), DidntWrite>; + + fn write(self, writer: &mut W, x: &NetworkMessage) -> Self::Output { + self.write(writer, x.as_ref()) + } +} + impl RCodec for Zenoh080 where R: Reader, From abb41bbf5b325c68e022b35be9cfc4f2e7caba1d Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Fri, 14 Mar 2025 14:45:35 +0100 Subject: [PATCH 04/49] revert unexpected committed changes --- examples/examples/z_put.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/examples/z_put.rs b/examples/examples/z_put.rs index 2b4098aeca..ea2bb72e8e 100644 --- a/examples/examples/z_put.rs +++ b/examples/examples/z_put.rs @@ -12,7 +12,7 @@ // ZettaScale Zenoh Team, // use clap::Parser; -use zenoh::{key_expr::KeyExpr, Config, Wait}; +use zenoh::{key_expr::KeyExpr, Config}; use zenoh_examples::CommonArgs; #[tokio::main] From cec21c6e627df0663a92d94b98482892e4d5ba7f Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Fri, 14 Mar 2025 15:41:10 +0100 Subject: [PATCH 05/49] fix doc --- io/zenoh-transport/src/common/batch.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/io/zenoh-transport/src/common/batch.rs b/io/zenoh-transport/src/common/batch.rs index d7e52eaf5f..3902ed1b2a 100644 --- a/io/zenoh-transport/src/common/batch.rs +++ b/io/zenoh-transport/src/common/batch.rs @@ -190,6 +190,7 @@ pub enum Finalize { /// /// | Keep Alive | Frame Reliable\ | Frame Best Effort\ | /// +/// [`NetworkMessage`]: zenoh_protocol::network::NetworkMessage #[derive(Clone, Debug)] pub struct WBatch { // The buffer to perform the batching on From 10a6b1c17fd988dba671cf386f8836577de238a7 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 18 Mar 2025 17:37:15 +0100 Subject: [PATCH 06/49] Handle ingress PUSH messages --- zenoh/src/net/primitives/demux.rs | 8 +++- zenoh/src/net/routing/dispatcher/face.rs | 2 +- zenoh/src/net/routing/dispatcher/pubsub.rs | 55 +++++++++++++++++----- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/zenoh/src/net/primitives/demux.rs b/zenoh/src/net/primitives/demux.rs index 1f10646410..6aeaa82703 100644 --- a/zenoh/src/net/primitives/demux.rs +++ b/zenoh/src/net/primitives/demux.rs @@ -53,7 +53,7 @@ impl TransportPeerEventHandler for DeMux { #[inline] fn handle_message(&self, mut msg: NetworkMessageMut) -> ZResult<()> { let interceptor = self.interceptor.load(); - if !interceptor.interceptors.is_empty() { + if !interceptor.interceptors.is_empty() && !matches!(msg.body, NetworkBodyMut::Push(..)) { let mut ctx = RoutingContext::new_in(msg.as_mut(), self.face.clone()); let prefix = ctx .wire_expr() @@ -101,7 +101,11 @@ impl TransportPeerEventHandler for DeMux { return Ok(()); } } - _ => { + NetworkBodyMut::Push(..) => unreachable!(), + NetworkBodyMut::Response(..) + | NetworkBodyMut::ResponseFinal(..) + | NetworkBodyMut::Declare(..) + | NetworkBodyMut::OAM(..) => { if !interceptor.intercept(&mut ctx, cache) { return Ok(()); } diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index cd54f76f69..b86fa1a95d 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -460,7 +460,7 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { - route_data(&self.tables, &self.state, msg, reliability); + route_data(&self.tables, &self, msg, reliability); } fn send_request(&self, msg: &mut Request) { diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 8d0f1ba660..7fdd67dc32 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -14,18 +14,18 @@ #[zenoh_macros::unstable] use std::collections::HashMap; -use std::sync::Arc; +use std::{ops::Not, sync::Arc}; use zenoh_core::zread; use zenoh_protocol::{ core::{key_expr::keyexpr, Reliability, WireExpr}, - network::{declare::SubscriberId, push::ext, Push}, + network::{declare::SubscriberId, push::ext, NetworkBodyMut, NetworkMessageMut, Push}, zenoh::PushBody, }; use zenoh_sync::get_mut_unchecked; use super::{ - face::FaceState, + face::{Face, FaceState}, resource::{Direction, Resource}, tables::{NodeId, Route, RoutingExpr, Tables, TablesLock}, }; @@ -33,7 +33,9 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ hat::{HatTrait, SendDeclare}, + interceptor::InterceptorTrait, router::get_or_set_route, + RoutingContext, }; #[derive(Copy, Clone)] @@ -281,13 +283,13 @@ macro_rules! inc_stats { #[allow(clippy::too_many_arguments)] pub fn route_data( tables_ref: &Arc, - face: &FaceState, + face: &Face, msg: &mut Push, reliability: Reliability, ) { let tables = zread!(tables_ref.tables); match tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_mapping(&face.state, &msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => { @@ -297,6 +299,25 @@ pub fn route_data( prefix.expr(), msg.wire_expr.suffix.as_ref() ); + + if let Some(interceptor) = face + .state + .in_interceptors + .as_ref() + .map(|i| i.load()) + .and_then(|i| i.is_empty().not().then_some(i)) + { + let cache = prefix.get_ingress_cache(&face); + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + }); + + if !interceptor.intercept(ctx, cache) { + return; + } + }; + let mut expr = RoutingExpr::new(&prefix, msg.wire_expr.suffix.as_ref()); #[cfg(feature = "stats")] @@ -308,10 +329,19 @@ pub fn route_data( inc_stats!(face, rx, admin, msg.payload); } - if tables.hat_code.ingress_filter(&tables, face, &mut expr) { + if tables + .hat_code + .ingress_filter(&tables, &face.state, &mut expr) + { let res = Resource::get_resource(&prefix, expr.suffix); - let route = get_data_route(&tables, face, &res, &mut expr, msg.ext_nodeid.node_id); + let route = get_data_route( + &tables, + &face.state, + &res, + &mut expr, + msg.ext_nodeid.node_id, + ); if !route.is_empty() { treat_timestamp!(&tables.hlc, msg.payload, tables.drop_future_timestamp); @@ -320,7 +350,7 @@ pub fn route_data( let (outface, key_expr, context) = route.values().next().unwrap(); if tables .hat_code - .egress_filter(&tables, face, outface, &mut expr) + .egress_filter(&tables, &face.state, outface, &mut expr) { drop(tables); #[cfg(feature = "stats")] @@ -337,9 +367,12 @@ pub fn route_data( let route = route .values() .filter(|(outface, _key_expr, _context)| { - tables - .hat_code - .egress_filter(&tables, face, outface, &mut expr) + tables.hat_code.egress_filter( + &tables, + &face.state, + outface, + &mut expr, + ) }) .cloned() .collect::>(); From 23609ec9cfbd5aa63cd1bfbe287f61a2fc7ab04b Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 20 Mar 2025 10:59:06 +0100 Subject: [PATCH 07/49] Improve `InterceptorChain` logging --- zenoh/src/net/routing/interceptor/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index fed7d51991..9334d50273 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -175,7 +175,7 @@ impl InterceptorTrait for InterceptorsChain { .and_then(|caches| caches.get(idx).map(|k| k.as_ref())) .flatten(); if !interceptor.intercept(ctx, cache) { - tracing::trace!("Msg intercepted!"); + tracing::trace!("Msg {:?} intercepted!", &ctx.msg); return false; } } From 95626241022be7c8a30a095cb5a38044c5ea3d93 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 21 Mar 2025 10:34:36 +0100 Subject: [PATCH 08/49] Handle egress PUSH messages --- zenoh/src/net/primitives/mux.rs | 27 ++-------- zenoh/src/net/routing/dispatcher/face.rs | 14 ++++-- zenoh/src/net/routing/dispatcher/pubsub.rs | 58 ++++++++++++++++++---- zenoh/src/net/routing/router.rs | 12 +++-- 4 files changed, 71 insertions(+), 40 deletions(-) diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index 1cbe8db8d9..30c5f3dbee 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -11,7 +11,7 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::sync::OnceLock; +use std::sync::{Arc, OnceLock}; use arc_swap::ArcSwap; use zenoh_protocol::{ @@ -33,7 +33,7 @@ use crate::net::routing::{ pub struct Mux { pub handler: TransportUnicast, pub(crate) face: OnceLock, - pub(crate) interceptor: ArcSwap, + pub(crate) interceptor: Arc>, } impl Mux { @@ -41,7 +41,7 @@ impl Mux { Mux { handler, face: OnceLock::new(), - interceptor: ArcSwap::new(interceptor.into()), + interceptor: Arc::new(ArcSwap::new(interceptor.into())), } } } @@ -119,27 +119,8 @@ impl EPrimitives for Mux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_request(&self, msg: &mut Request) { diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index b86fa1a95d..9a0049ff54 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -75,6 +75,7 @@ pub struct FaceState { pub(crate) pending_queries: HashMap, CancellationToken)>, pub(crate) mcast_group: Option, pub(crate) in_interceptors: Option>>, + pub(crate) eg_interceptors: Option>>, pub(crate) hat: Box, pub(crate) task_controller: TaskController, pub(crate) is_local: bool, @@ -90,6 +91,7 @@ impl FaceState { primitives: Arc, mcast_group: Option, in_interceptors: Option>>, + eg_interceptors: Option>>, hat: Box, is_local: bool, ) -> Arc { @@ -109,6 +111,7 @@ impl FaceState { pending_queries: HashMap::new(), mcast_group, in_interceptors, + eg_interceptors, hat, task_controller: TaskController::default(), is_local, @@ -219,11 +222,16 @@ impl FaceState { InterceptorsChain::new(ingress.into_iter().flatten().collect::>(), version), InterceptorsChain::new(egress.into_iter().flatten().collect::>(), version), ); - mux.interceptor.store(egress.into()); + let egress = Arc::new(egress); + mux.interceptor.store(egress.clone()); self.in_interceptors .as_ref() .expect("face in_interceptors should not be None when primitives are Mux") - .store(ingress.into()); + .store(Arc::new(ingress)); + self.in_interceptors + .as_ref() + .expect("face eg_interceptors should not be None when primitives are Mux") + .store(egress.clone()); } else if let Some(mux) = self.primitives.as_any().downcast_ref::() { let interceptor = InterceptorsChain::new( factories @@ -460,7 +468,7 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { - route_data(&self.tables, &self, msg, reliability); + route_data(&self.tables, self, msg, reliability); } fn send_request(&self, msg: &mut Request) { diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 7fdd67dc32..6dd008e6f0 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -307,7 +307,7 @@ pub fn route_data( .map(|i| i.load()) .and_then(|i| i.is_empty().not().then_some(i)) { - let cache = prefix.get_ingress_cache(&face); + let cache = prefix.get_ingress_cache(face); let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -361,6 +361,25 @@ pub fn route_data( } msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; + + if let Some(interceptor) = face + .state + .eg_interceptors + .as_ref() + .map(|i| i.load()) + .and_then(|i| i.is_empty().not().then_some(i)) + { + let cache = prefix.get_egress_cache(face); + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + }); + + if !interceptor.intercept(ctx, cache) { + return; + } + }; + outface.primitives.send_push(msg, reliability) } } else { @@ -386,16 +405,33 @@ pub fn route_data( inc_stats!(outface, tx, admin, msg.payload) } - outface.primitives.send_push( - &mut Push { - wire_expr: key_expr, - ext_qos: msg.ext_qos, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType { node_id: context }, - payload: msg.payload.clone(), - }, - reliability, - ) + let msg = &mut Push { + wire_expr: key_expr, + ext_qos: msg.ext_qos, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType { node_id: context }, + payload: msg.payload.clone(), + }; + + if let Some(interceptor) = face + .state + .eg_interceptors + .as_ref() + .map(|i| i.load()) + .and_then(|i| i.is_empty().not().then_some(i)) + { + let cache = prefix.get_egress_cache(face); + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + }); + + if !interceptor.intercept(ctx, cache) { + continue; + } + }; + + outface.primitives.send_push(msg, reliability) } } } diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index b183987da2..3b60fefbc7 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -89,6 +89,7 @@ impl Router { primitives.clone(), None, None, + None, ctrl_lock.new_face(), true, ) @@ -126,6 +127,7 @@ impl Router { let stats = transport.get_stats()?; let ingress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); + let egress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); let mux = Arc::new(Mux::new(transport.clone(), InterceptorsChain::empty())); let newface = tables .faces @@ -140,6 +142,7 @@ impl Router { mux.clone(), None, Some(ingress.clone()), + Some(egress), ctrl_lock.new_face(), false, ) @@ -190,6 +193,7 @@ impl Router { mux.clone(), Some(transport), None, + None, ctrl_lock.new_face(), false, ); @@ -216,7 +220,8 @@ impl Router { let mut tables = zwrite!(self.tables.tables); let fid = tables.face_counter; tables.face_counter += 1; - let interceptor = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); + let ingress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); + let egress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); let face_state = FaceState::new( fid, peer.zid, @@ -225,7 +230,8 @@ impl Router { Some(transport.get_stats().unwrap()), Arc::new(DummyPrimitives), Some(transport), - Some(interceptor.clone()), + Some(ingress.clone()), + Some(egress), ctrl_lock.new_face(), false, ); @@ -242,7 +248,7 @@ impl Router { state: face_state, }, None, - interceptor, + ingress, ))) } } From 009e6e058cfa4d3ca1c4bcb286b8a21065983431 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 21 Mar 2025 16:06:16 +0100 Subject: [PATCH 09/49] Fix typo --- zenoh/src/net/routing/dispatcher/face.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 9a0049ff54..c190c4129d 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -228,7 +228,7 @@ impl FaceState { .as_ref() .expect("face in_interceptors should not be None when primitives are Mux") .store(Arc::new(ingress)); - self.in_interceptors + self.eg_interceptors .as_ref() .expect("face eg_interceptors should not be None when primitives are Mux") .store(egress.clone()); From 60caaf07f936267e7d274d0d1204980cf661ff6b Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 31 Mar 2025 14:28:39 +0200 Subject: [PATCH 10/49] API changed... --- zenoh/src/net/routing/dispatcher/pubsub.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 6dd008e6f0..b5ce2fbbfe 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -307,7 +307,8 @@ pub fn route_data( .map(|i| i.load()) .and_then(|i| i.is_empty().not().then_some(i)) { - let cache = prefix.get_ingress_cache(face); + let cache_guard = prefix.get_ingress_cache(face, &interceptor); + let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -369,7 +370,9 @@ pub fn route_data( .map(|i| i.load()) .and_then(|i| i.is_empty().not().then_some(i)) { - let cache = prefix.get_egress_cache(face); + let cache_guard = prefix.get_ingress_cache(face, &interceptor); + let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); + let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -420,13 +423,15 @@ pub fn route_data( .map(|i| i.load()) .and_then(|i| i.is_empty().not().then_some(i)) { - let cache = prefix.get_egress_cache(face); + let cache_guard = prefix.get_ingress_cache(face, &interceptor); + let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); + let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, }); - if !interceptor.intercept(ctx, cache) { + if !interceptor.intercept(ctx, cache.as_deref()) { continue; } }; From 864753ee768010ddbffb2910eeb733241887cd29 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 31 Mar 2025 14:30:31 +0200 Subject: [PATCH 11/49] Missing import --- commons/zenoh-codec/src/network/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/zenoh-codec/src/network/mod.rs b/commons/zenoh-codec/src/network/mod.rs index 407e74aecf..812e3b50f6 100644 --- a/commons/zenoh-codec/src/network/mod.rs +++ b/commons/zenoh-codec/src/network/mod.rs @@ -27,7 +27,7 @@ use zenoh_protocol::{ core::{EntityId, Reliability, ZenohIdProto}, network::{ ext::{self, EntityGlobalIdType}, - id, NetworkBody, NetworkBodyRef, NetworkMessage, NetworkMessageRef, + id, NetworkBody, NetworkBodyRef, NetworkMessage, NetworkMessageExt, NetworkMessageRef, }, }; From 5879f9977ddbf2b6ce9c06d0b593bdf4713434c9 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 31 Mar 2025 14:44:42 +0200 Subject: [PATCH 12/49] Fix tests --- zenoh/src/net/routing/dispatcher/pubsub.rs | 2 +- .../net/routing/interceptor/qos_overwrite.rs | 8 +++---- zenoh/src/net/tests/tables.rs | 24 ++++++++----------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index b5ce2fbbfe..5c8d760ed0 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -431,7 +431,7 @@ pub fn route_data( reliability, }); - if !interceptor.intercept(ctx, cache.as_deref()) { + if !interceptor.intercept(ctx, cache) { continue; } }; diff --git a/zenoh/src/net/routing/interceptor/qos_overwrite.rs b/zenoh/src/net/routing/interceptor/qos_overwrite.rs index 63c19d0bf0..e48be2cdd2 100644 --- a/zenoh/src/net/routing/interceptor/qos_overwrite.rs +++ b/zenoh/src/net/routing/interceptor/qos_overwrite.rs @@ -246,16 +246,16 @@ impl InterceptorTrait for QosInterceptor { NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. - }) => self.filter.put && self.is_ke_affected_from_cache_or_ctx(cache, &ctx), + }) => self.filter.put && self.is_ke_affected_from_cache_or_ctx(cache, ctx), NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. - }) => self.filter.delete && self.is_ke_affected_from_cache_or_ctx(cache, &ctx), + }) => self.filter.delete && self.is_ke_affected_from_cache_or_ctx(cache, ctx), NetworkBodyMut::Request(_) => { - self.filter.query && self.is_ke_affected_from_cache_or_ctx(cache, &ctx) + self.filter.query && self.is_ke_affected_from_cache_or_ctx(cache, ctx) } NetworkBodyMut::Response(_) => { - self.filter.reply && self.is_ke_affected_from_cache_or_ctx(cache, &ctx) + self.filter.reply && self.is_ke_affected_from_cache_or_ctx(cache, ctx) } NetworkBodyMut::ResponseFinal(_) => false, NetworkBodyMut::Interest(_) => false, diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index bc3491182b..fff9d070f9 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -34,11 +34,7 @@ use crate::{ net::{ primitives::{DummyPrimitives, EPrimitives, Primitives}, routing::{ - dispatcher::{ - face::{Face, FaceState}, - pubsub::SubscriberInfo, - tables::Tables, - }, + dispatcher::{face::Face, pubsub::SubscriberInfo, tables::Tables}, router::*, RoutingContext, }, @@ -596,10 +592,10 @@ fn client_test() { let sub_info = SubscriberInfo; let primitives0 = Arc::new(ClientPrimitives::new()); - let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone()).state); + let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone())); register_expr( &tables, - &mut face0.upgrade().unwrap(), + &mut face0.upgrade().unwrap().state.clone(), 11, &"test/client".into(), ); @@ -619,7 +615,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.upgrade().unwrap(), + &mut face0.upgrade().unwrap().state.clone(), 0, &WireExpr::from(11).with_suffix("/**"), &sub_info, @@ -628,7 +624,7 @@ fn client_test() { ); register_expr( &tables, - &mut face0.upgrade().unwrap(), + &mut face0.upgrade().unwrap().state.clone(), 12, &WireExpr::from(11).with_suffix("/z1_pub1"), ); @@ -647,10 +643,10 @@ fn client_test() { ); let primitives1 = Arc::new(ClientPrimitives::new()); - let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone()).state); + let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone())); register_expr( &tables, - &mut face1.upgrade().unwrap(), + &mut face1.upgrade().unwrap().state.clone(), 21, &"test/client".into(), ); @@ -670,7 +666,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face1.upgrade().unwrap(), + &mut face1.upgrade().unwrap().state.clone(), 0, &WireExpr::from(21).with_suffix("/**"), &sub_info, @@ -679,7 +675,7 @@ fn client_test() { ); register_expr( &tables, - &mut face1.upgrade().unwrap(), + &mut face1.upgrade().unwrap().state.clone(), 22, &WireExpr::from(21).with_suffix("/z2_pub1"), ); @@ -733,7 +729,7 @@ fn client_test() { primitives1.clear_data(); primitives2.clear_data(); - let route_dummy_data = |face: &Weak, wire_expr| { + let route_dummy_data = |face: &Weak, wire_expr| { route_data( &tables, &face.upgrade().unwrap(), From 384329ce2d792c63930f6c71af8a344b62d41718 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 31 Mar 2025 14:50:29 +0200 Subject: [PATCH 13/49] Fix more tests and obscure features --- zenoh/src/net/routing/dispatcher/pubsub.rs | 10 ++++++++-- zenoh/src/tests.rs | 12 ++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 5c8d760ed0..2286b3fc8d 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -312,6 +312,8 @@ pub fn route_data( let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, + #[cfg(feature = "stats")] + size: None, }); if !interceptor.intercept(ctx, cache) { @@ -325,9 +327,9 @@ pub fn route_data( let admin = expr.full_expr().starts_with("@/"); #[cfg(feature = "stats")] if !admin { - inc_stats!(face, rx, user, msg.payload); + inc_stats!(face.state, rx, user, msg.payload); } else { - inc_stats!(face, rx, admin, msg.payload); + inc_stats!(face.state, rx, admin, msg.payload); } if tables @@ -376,6 +378,8 @@ pub fn route_data( let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, + #[cfg(feature = "stats")] + size: None, }); if !interceptor.intercept(ctx, cache) { @@ -429,6 +433,8 @@ pub fn route_data( let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, + #[cfg(feature = "stats")] + size: None, }); if !interceptor.intercept(ctx, cache) { diff --git a/zenoh/src/tests.rs b/zenoh/src/tests.rs index 48f12c39e9..93b3fcb35f 100644 --- a/zenoh/src/tests.rs +++ b/zenoh/src/tests.rs @@ -17,7 +17,7 @@ use std::str::FromStr; use zenoh_buffers::ZBuf; use zenoh_keyexpr::keyexpr; use zenoh_protocol::{ - network::{NetworkBody, NetworkMessage, Push}, + network::{NetworkBodyMut, NetworkMessageMut, Push}, zenoh::PushBody, }; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; @@ -94,18 +94,18 @@ impl InterceptorTrait for TestInterceptor { fn intercept( &self, - mut ctx: RoutingContext, + ctx: &mut RoutingContext>, cache: Option<&Box>, - ) -> Option> { - if let NetworkBody::Push(Push { - payload: PushBody::Put(p), + ) -> bool { + if let NetworkBodyMut::Push(&mut Push { + payload: PushBody::Put(ref mut p), .. }) = &mut ctx.msg.body { let out = format!("Cache hit: {}, data: {}", cache.is_some(), &self.data); p.payload = ZBuf::from(out.as_bytes().to_owned()); } - Some(ctx) + true } } From ac21f8c91b1ce59d9aa1f5965e7623c075a445a3 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 3 Apr 2025 11:56:35 +0200 Subject: [PATCH 14/49] Fix `client_test` --- zenoh/src/net/tests/tables.rs | 39 ++++++++++++++--------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index fff9d070f9..75566f53cb 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -13,7 +13,7 @@ // use std::{ convert::{TryFrom, TryInto}, - sync::{Arc, Weak}, + sync::Arc, }; use uhlc::HLC; @@ -592,10 +592,11 @@ fn client_test() { let sub_info = SubscriberInfo; let primitives0 = Arc::new(ClientPrimitives::new()); - let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone())); + let face0 = router.new_primitives(primitives0.clone()); + let weak_face0 = Arc::downgrade(&face0); register_expr( &tables, - &mut face0.upgrade().unwrap().state.clone(), + &mut weak_face0.upgrade().unwrap().state.clone(), 11, &"test/client".into(), ); @@ -615,7 +616,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.upgrade().unwrap().state.clone(), + &mut weak_face0.upgrade().unwrap().state.clone(), 0, &WireExpr::from(11).with_suffix("/**"), &sub_info, @@ -624,7 +625,7 @@ fn client_test() { ); register_expr( &tables, - &mut face0.upgrade().unwrap().state.clone(), + &mut weak_face0.upgrade().unwrap().state.clone(), 12, &WireExpr::from(11).with_suffix("/z1_pub1"), ); @@ -643,13 +644,8 @@ fn client_test() { ); let primitives1 = Arc::new(ClientPrimitives::new()); - let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone())); - register_expr( - &tables, - &mut face1.upgrade().unwrap().state.clone(), - 21, - &"test/client".into(), - ); + let face1 = router.new_primitives(primitives1.clone()); + register_expr(&tables, &mut face1.state.clone(), 21, &"test/client".into()); Primitives::send_declare( primitives1.as_ref(), &mut Declare { @@ -666,7 +662,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face1.upgrade().unwrap().state.clone(), + &mut face1.state.clone(), 0, &WireExpr::from(21).with_suffix("/**"), &sub_info, @@ -675,7 +671,7 @@ fn client_test() { ); register_expr( &tables, - &mut face1.upgrade().unwrap().state.clone(), + &mut face1.state.clone(), 22, &WireExpr::from(21).with_suffix("/z2_pub1"), ); @@ -694,13 +690,8 @@ fn client_test() { ); let primitives2 = Arc::new(ClientPrimitives::new()); - let face2 = Arc::downgrade(&router.new_primitives(primitives2.clone()).state); - register_expr( - &tables, - &mut face2.upgrade().unwrap(), - 31, - &"test/client".into(), - ); + let face2 = router.new_primitives(primitives2.clone()); + register_expr(&tables, &mut face2.state.clone(), 31, &"test/client".into()); Primitives::send_declare( primitives2.as_ref(), &mut Declare { @@ -717,7 +708,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face2.upgrade().unwrap(), + &mut face2.state.clone(), 0, &WireExpr::from(31).with_suffix("/**"), &sub_info, @@ -729,10 +720,10 @@ fn client_test() { primitives1.clear_data(); primitives2.clear_data(); - let route_dummy_data = |face: &Weak, wire_expr| { + let route_dummy_data = |face: &Arc, wire_expr| { route_data( &tables, - &face.upgrade().unwrap(), + &face, &mut Push { wire_expr, ext_qos: ext::QoSType::DEFAULT, From ce58deeb21f2ceac055b39653bb2c54bce14ad29 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 3 Apr 2025 14:17:47 +0200 Subject: [PATCH 15/49] Clippy error (1) --- zenoh/src/net/tests/tables.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 75566f53cb..9c9b0a9ade 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -723,7 +723,7 @@ fn client_test() { let route_dummy_data = |face: &Arc, wire_expr| { route_data( &tables, - &face, + face, &mut Push { wire_expr, ext_qos: ext::QoSType::DEFAULT, From 494144fe40a8345924906db0c83d3901efc10228 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 3 Apr 2025 14:39:40 +0200 Subject: [PATCH 16/49] Refactoring --- zenoh/src/net/routing/dispatcher/face.rs | 20 +++++++++++ zenoh/src/net/routing/dispatcher/pubsub.rs | 41 ++++------------------ zenoh/src/net/routing/interceptor/mod.rs | 14 ++++++++ 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index c190c4129d..3cd17099f6 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -298,6 +298,26 @@ impl Face { interest.rejection_token.cancel(); } } + + pub(crate) fn load_egress_interceptors( + &self, + ) -> Option>> { + self.state + .eg_interceptors + .as_ref() + .map(|i| i.load()) + .and_then(|i| i.is_empty().not().then_some(i)) + } + + pub(crate) fn load_ingress_interceptors( + &self, + ) -> Option>> { + self.state + .in_interceptors + .as_ref() + .map(|i| i.load()) + .and_then(|i| i.is_empty().not().then_some(i)) + } } impl Primitives for Face { diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 2286b3fc8d..d9946e970b 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -14,7 +14,7 @@ #[zenoh_macros::unstable] use std::collections::HashMap; -use std::{ops::Not, sync::Arc}; +use std::sync::Arc; use zenoh_core::zread; use zenoh_protocol::{ @@ -33,7 +33,6 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ hat::{HatTrait, SendDeclare}, - interceptor::InterceptorTrait, router::get_or_set_route, RoutingContext, }; @@ -300,15 +299,7 @@ pub fn route_data( msg.wire_expr.suffix.as_ref() ); - if let Some(interceptor) = face - .state - .in_interceptors - .as_ref() - .map(|i| i.load()) - .and_then(|i| i.is_empty().not().then_some(i)) - { - let cache_guard = prefix.get_ingress_cache(face, &interceptor); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); + if let Some(interceptor) = face.load_ingress_interceptors() { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -316,7 +307,7 @@ pub fn route_data( size: None, }); - if !interceptor.intercept(ctx, cache) { + if !interceptor.intercept_with_face(ctx, face, &prefix) { return; } }; @@ -365,16 +356,7 @@ pub fn route_data( msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; - if let Some(interceptor) = face - .state - .eg_interceptors - .as_ref() - .map(|i| i.load()) - .and_then(|i| i.is_empty().not().then_some(i)) - { - let cache_guard = prefix.get_ingress_cache(face, &interceptor); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - + if let Some(interceptor) = face.load_egress_interceptors() { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -382,7 +364,7 @@ pub fn route_data( size: None, }); - if !interceptor.intercept(ctx, cache) { + if !interceptor.intercept_with_face(ctx, face, &prefix) { return; } }; @@ -420,16 +402,7 @@ pub fn route_data( payload: msg.payload.clone(), }; - if let Some(interceptor) = face - .state - .eg_interceptors - .as_ref() - .map(|i| i.load()) - .and_then(|i| i.is_empty().not().then_some(i)) - { - let cache_guard = prefix.get_ingress_cache(face, &interceptor); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - + if let Some(interceptor) = face.load_egress_interceptors() { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -437,7 +410,7 @@ pub fn route_data( size: None, }); - if !interceptor.intercept(ctx, cache) { + if !interceptor.intercept_with_face(ctx, face, &prefix) { continue; } }; diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index 9334d50273..aca31b36c7 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -34,6 +34,8 @@ use zenoh_protocol::network::NetworkMessageMut; use zenoh_result::ZResult; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; +use super::dispatcher::face::Face; +use super::router::Resource; use super::RoutingContext; pub mod downsampling; @@ -151,6 +153,18 @@ impl InterceptorsChain { version, } } + + pub(crate) fn intercept_with_face( + &self, + ctx: &mut RoutingContext, + face: &Face, + prefix: &Resource, + ) -> bool { + let cache_guard = prefix.get_ingress_cache(face, self); + let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); + + self.intercept(ctx, cache) + } } impl InterceptorTrait for InterceptorsChain { From 68ef1c78b09830ff858ebada847230121ed9148f Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 8 Apr 2025 15:14:53 +0200 Subject: [PATCH 17/49] Fix epic blunder --- zenoh/src/net/routing/dispatcher/face.rs | 64 ++++++++------------ zenoh/src/net/routing/dispatcher/pubsub.rs | 27 +++++++-- zenoh/src/net/routing/dispatcher/resource.rs | 25 +++++--- zenoh/src/net/routing/interceptor/mod.rs | 12 +++- 4 files changed, 73 insertions(+), 55 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 3cd17099f6..5a25968f55 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -18,10 +18,12 @@ use std::{ ops::Not, sync::{Arc, Weak}, time::Duration, + usize, }; use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; +use zenoh_config::InterceptorFlow; use zenoh_protocol::{ core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ @@ -150,45 +152,47 @@ impl FaceState { id } + pub(crate) fn load_interceptors( + &self, + flow: InterceptorFlow, + ) -> Option>> { + match flow { + InterceptorFlow::Egress => &self.eg_interceptors, + InterceptorFlow::Ingress => &self.in_interceptors, + } + .as_ref() + .map(|iceptors| iceptors.load()) + .and_then(|iceptors| iceptors.is_empty().not().then_some(iceptors)) + } + pub(crate) fn update_interceptors_caches(&self, res: &mut Arc) { - if let Some(interceptor) = self - .in_interceptors - .as_ref() - .map(|itor| itor.load()) - .and_then(|is| is.is_empty().not().then_some(is)) - { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Ingress) { if let Some(expr) = res.keyexpr() { - let cache = interceptor.compute_keyexpr_cache(expr); + let cache = iceptor.compute_keyexpr_cache(&expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs .get_mut(&self.id) .unwrap(), ) - .in_interceptor_cache = InterceptorCache::new(cache, interceptor.version); + .in_interceptor_cache = InterceptorCache::new(cache, iceptor.version); } } - if let Some(interceptor) = self - .primitives - .as_any() - .downcast_ref::() - .map(|mux| mux.interceptor.load()) - .and_then(|is| is.is_empty().not().then_some(is)) - { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { if let Some(expr) = res.keyexpr() { - let cache = interceptor.compute_keyexpr_cache(expr); + let cache = iceptor.compute_keyexpr_cache(&expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs .get_mut(&self.id) .unwrap(), ) - .e_interceptor_cache = InterceptorCache::new(cache, interceptor.version); + .e_interceptor_cache = InterceptorCache::new(cache, iceptor.version); } } - if let Some(interceptor) = self + if let Some(iceptor) = self .primitives .as_any() .downcast_ref::() @@ -196,14 +200,14 @@ impl FaceState { .and_then(|is| is.is_empty().not().then_some(is)) { if let Some(expr) = res.keyexpr() { - let cache = interceptor.compute_keyexpr_cache(expr); + let cache = iceptor.compute_keyexpr_cache(&expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs .get_mut(&self.id) .unwrap(), ) - .e_interceptor_cache = InterceptorCache::new(cache, interceptor.version); + .e_interceptor_cache = InterceptorCache::new(cache, iceptor.version); } } } @@ -298,26 +302,6 @@ impl Face { interest.rejection_token.cancel(); } } - - pub(crate) fn load_egress_interceptors( - &self, - ) -> Option>> { - self.state - .eg_interceptors - .as_ref() - .map(|i| i.load()) - .and_then(|i| i.is_empty().not().then_some(i)) - } - - pub(crate) fn load_ingress_interceptors( - &self, - ) -> Option>> { - self.state - .in_interceptors - .as_ref() - .map(|i| i.load()) - .and_then(|i| i.is_empty().not().then_some(i)) - } } impl Primitives for Face { diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index d9946e970b..3cf1e77b89 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -16,6 +16,7 @@ use std::collections::HashMap; use std::sync::Arc; +use zenoh_config::InterceptorFlow; use zenoh_core::zread; use zenoh_protocol::{ core::{key_expr::keyexpr, Reliability, WireExpr}, @@ -299,7 +300,7 @@ pub fn route_data( msg.wire_expr.suffix.as_ref() ); - if let Some(interceptor) = face.load_ingress_interceptors() { + if let Some(interceptor) = face.state.load_interceptors(InterceptorFlow::Ingress) { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -307,7 +308,7 @@ pub fn route_data( size: None, }); - if !interceptor.intercept_with_face(ctx, face, &prefix) { + if !interceptor.intercept_with_face(ctx, face, &prefix, InterceptorFlow::Ingress) { return; } }; @@ -356,7 +357,9 @@ pub fn route_data( msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; - if let Some(interceptor) = face.load_egress_interceptors() { + if let Some(interceptor) = + face.state.load_interceptors(InterceptorFlow::Egress) + { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -364,7 +367,12 @@ pub fn route_data( size: None, }); - if !interceptor.intercept_with_face(ctx, face, &prefix) { + if !interceptor.intercept_with_face( + ctx, + face, + &prefix, + InterceptorFlow::Egress, + ) { return; } }; @@ -402,7 +410,9 @@ pub fn route_data( payload: msg.payload.clone(), }; - if let Some(interceptor) = face.load_egress_interceptors() { + if let Some(interceptor) = + face.state.load_interceptors(InterceptorFlow::Egress) + { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, @@ -410,7 +420,12 @@ pub fn route_data( size: None, }); - if !interceptor.intercept_with_face(ctx, face, &prefix) { + if !interceptor.intercept_with_face( + ctx, + face, + &prefix, + InterceptorFlow::Egress, + ) { continue; } }; diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index ddecc3002c..e4998c09c7 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -22,7 +22,7 @@ use std::{ }; use zenoh_collections::SingleOrBoxHashSet; -use zenoh_config::WhatAmI; +use zenoh_config::{InterceptorFlow, WhatAmI}; use zenoh_protocol::{ core::{key_expr::keyexpr, ExprId, WireExpr}, network::{ @@ -765,9 +765,7 @@ impl Resource { face: &Face, interceptor: &InterceptorsChain, ) -> Option { - self.session_ctxs - .get(&face.state.id) - .and_then(|ctx| ctx.in_interceptor_cache.value(interceptor, self)) + self.interceptor_cache(face, interceptor, InterceptorFlow::Ingress) } pub(crate) fn get_egress_cache( @@ -775,9 +773,22 @@ impl Resource { face: &Face, interceptor: &InterceptorsChain, ) -> Option { - self.session_ctxs - .get(&face.state.id) - .and_then(|ctx| ctx.e_interceptor_cache.value(interceptor, self)) + self.interceptor_cache(face, interceptor, InterceptorFlow::Egress) + } + + pub(crate) fn interceptor_cache( + &self, + face: &Face, + interceptor: &InterceptorsChain, + flow: InterceptorFlow, + ) -> Option { + self.session_ctxs.get(&face.state.id).and_then(|ctx| { + match flow { + InterceptorFlow::Egress => &ctx.e_interceptor_cache, + InterceptorFlow::Ingress => &ctx.in_interceptor_cache, + } + .value(interceptor, self) + }) } } diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index aca31b36c7..03aceb7973 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -25,6 +25,7 @@ use zenoh_link::LinkAuthId; mod authorization; use std::any::Any; +use std::ops::Not; mod low_pass; use low_pass::low_pass_interceptor_factories; @@ -159,10 +160,17 @@ impl InterceptorsChain { ctx: &mut RoutingContext, face: &Face, prefix: &Resource, + flow: InterceptorFlow, ) -> bool { - let cache_guard = prefix.get_ingress_cache(face, self); + // NOTE: the cache should be empty if the wire expr has no suffix, i.e. when the prefix + // doesn't represent a full keyexpr. + let prefix = ctx + .wire_expr() + .and_then(|we| we.has_suffix().not().then(|| prefix)); + let cache_guard = prefix + .as_ref() + .and_then(|p| p.interceptor_cache(face, self, flow)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - self.intercept(ctx, cache) } } From 08411159862df85140e801449a3be06750e54f96 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 8 Apr 2025 15:46:55 +0200 Subject: [PATCH 18/49] Fix imports (thanks @wyfo) --- zenoh/src/net/routing/interceptor/mod.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index 03aceb7973..b89fefc89d 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -24,8 +24,7 @@ use nonempty_collections::NEVec; use zenoh_link::LinkAuthId; mod authorization; -use std::any::Any; -use std::ops::Not; +use std::{any::Any, ops::Not}; mod low_pass; use low_pass::low_pass_interceptor_factories; @@ -35,9 +34,7 @@ use zenoh_protocol::network::NetworkMessageMut; use zenoh_result::ZResult; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; -use super::dispatcher::face::Face; -use super::router::Resource; -use super::RoutingContext; +use super::{dispatcher::face::Face, router::Resource, RoutingContext}; pub mod downsampling; use crate::net::routing::interceptor::downsampling::downsampling_interceptor_factories; From 42f3f5f694fd6c891e92e4b2db2d7c892f8229f7 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 8 Apr 2025 16:40:20 +0200 Subject: [PATCH 19/49] We can't live without Clippy --- zenoh/src/net/routing/dispatcher/face.rs | 7 +++---- zenoh/src/net/routing/interceptor/mod.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 5a25968f55..7ca342afdd 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -18,7 +18,6 @@ use std::{ ops::Not, sync::{Arc, Weak}, time::Duration, - usize, }; use arc_swap::ArcSwap; @@ -168,7 +167,7 @@ impl FaceState { pub(crate) fn update_interceptors_caches(&self, res: &mut Arc) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Ingress) { if let Some(expr) = res.keyexpr() { - let cache = iceptor.compute_keyexpr_cache(&expr); + let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs @@ -181,7 +180,7 @@ impl FaceState { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { if let Some(expr) = res.keyexpr() { - let cache = iceptor.compute_keyexpr_cache(&expr); + let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs @@ -200,7 +199,7 @@ impl FaceState { .and_then(|is| is.is_empty().not().then_some(is)) { if let Some(expr) = res.keyexpr() { - let cache = iceptor.compute_keyexpr_cache(&expr); + let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( get_mut_unchecked(res) .session_ctxs diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index b89fefc89d..28ea273196 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -163,7 +163,7 @@ impl InterceptorsChain { // doesn't represent a full keyexpr. let prefix = ctx .wire_expr() - .and_then(|we| we.has_suffix().not().then(|| prefix)); + .and_then(|we| we.has_suffix().not().then_some(prefix)); let cache_guard = prefix .as_ref() .and_then(|p| p.interceptor_cache(face, self, flow)); From fbeb06a9aa3a9cf27e36e6a8274126907f381a2f Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 10 Apr 2025 17:43:36 +0200 Subject: [PATCH 20/49] Handle `REQUEST`, `RESPONSE` & `RESPONSE_FINAL` --- zenoh/src/net/primitives/demux.rs | 10 +- zenoh/src/net/primitives/mux.rs | 55 ++--- zenoh/src/net/routing/dispatcher/face.rs | 236 ++++++++++++++++++- zenoh/src/net/routing/dispatcher/pubsub.rs | 124 ++++------ zenoh/src/net/routing/dispatcher/queries.rs | 104 +++++--- zenoh/src/net/routing/dispatcher/resource.rs | 9 +- zenoh/src/net/routing/interceptor/mod.rs | 30 +-- zenoh/src/net/tests/tables.rs | 2 +- 8 files changed, 384 insertions(+), 186 deletions(-) diff --git a/zenoh/src/net/primitives/demux.rs b/zenoh/src/net/primitives/demux.rs index 6aeaa82703..e614194666 100644 --- a/zenoh/src/net/primitives/demux.rs +++ b/zenoh/src/net/primitives/demux.rs @@ -53,7 +53,13 @@ impl TransportPeerEventHandler for DeMux { #[inline] fn handle_message(&self, mut msg: NetworkMessageMut) -> ZResult<()> { let interceptor = self.interceptor.load(); - if !interceptor.interceptors.is_empty() && !matches!(msg.body, NetworkBodyMut::Push(..)) { + if !interceptor.interceptors.is_empty() + // NOTE: we ignore message types already handled inside the routing. + && !matches!( + msg.body, + NetworkBodyMut::Push(..) | NetworkBodyMut::Request(..) + ) + { let mut ctx = RoutingContext::new_in(msg.as_mut(), self.face.clone()); let prefix = ctx .wire_expr() @@ -62,7 +68,7 @@ impl TransportPeerEventHandler for DeMux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_ingress_cache(&self.face, &interceptor)); + .and_then(|p| p.get_ingress_cache(&self.face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); match &ctx.msg.body { diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index 30c5f3dbee..afc292bad0 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -17,13 +17,13 @@ use arc_swap::ArcSwap; use zenoh_protocol::{ core::Reliability, network::{ - interest::Interest, response, Declare, NetworkBodyMut, NetworkMessageMut, Push, Request, - Response, ResponseFinal, + interest::Interest, Declare, NetworkBodyMut, NetworkMessageMut, Push, Request, Response, + ResponseFinal, }, }; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; -use super::{EPrimitives, Primitives}; +use super::EPrimitives; use crate::net::routing::{ dispatcher::face::{Face, WeakFace}, interceptor::{InterceptorTrait, InterceptorsChain}, @@ -69,7 +69,7 @@ impl EPrimitives for Mux { let interceptor = self.interceptor.load(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); + .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); @@ -104,7 +104,7 @@ impl EPrimitives for Mux { let interceptor = self.interceptor.load(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); + .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if self.interceptor.load().intercept(&mut ctx, cache) { @@ -124,41 +124,14 @@ impl EPrimitives for Mux { } fn send_request(&self, msg: &mut Request) { - let request_id = msg.id; let msg = NetworkMessageMut { body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } else { - // request was blocked by an interceptor, we need to send response final to avoid timeout error - face.send_response_final(&mut ResponseFinal { - rid: request_id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }) - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_response(&self, msg: &mut Response) { @@ -180,7 +153,7 @@ impl EPrimitives for Mux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(&face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { @@ -210,7 +183,7 @@ impl EPrimitives for Mux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(&face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -263,7 +236,7 @@ impl EPrimitives for McastMux { let interceptor = self.interceptor.load(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); + .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if self.interceptor.load().intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -291,7 +264,7 @@ impl EPrimitives for McastMux { let interceptor = self.interceptor.load(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(ctx.outface.get().unwrap(), &interceptor)); + .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if self.interceptor.load().intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -317,7 +290,7 @@ impl EPrimitives for McastMux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -346,7 +319,7 @@ impl EPrimitives for McastMux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -375,7 +348,7 @@ impl EPrimitives for McastMux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); @@ -404,7 +377,7 @@ impl EPrimitives for McastMux { .cloned(); let cache_guard = prefix .as_ref() - .and_then(|p| p.get_egress_cache(face, &interceptor)); + .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); if interceptor.intercept(&mut ctx, cache) { let _ = self.handler.schedule(ctx.msg); diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 7ca342afdd..93e8a19271 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -22,12 +22,13 @@ use std::{ use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; -use zenoh_config::InterceptorFlow; +use zenoh_config::InterceptorFlow::{self, *}; use zenoh_protocol::{ core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ interest::{InterestId, InterestMode, InterestOptions}, - Mapping, Push, Request, RequestId, Response, ResponseFinal, + response, Mapping, NetworkBodyMut, NetworkMessageMut, Push, Request, RequestId, Response, + ResponseFinal, }, zenoh::RequestBody, }; @@ -51,6 +52,7 @@ use crate::net::{ EgressInterceptor, IngressInterceptor, InterceptorFactory, InterceptorTrait, InterceptorsChain, }, + RoutingContext, }, }; @@ -164,8 +166,27 @@ impl FaceState { .and_then(|iceptors| iceptors.is_empty().not().then_some(iceptors)) } + pub(crate) fn run_interceptors( + &self, + flow: InterceptorFlow, + prefix: Option<&Resource>, + iceptor: &InterceptorsChain, + ctx: &mut RoutingContext>, + ) -> bool { + // NOTE: the cache should be empty if the wire expr has no suffix, i.e. when the prefix + // doesn't represent a full keyexpr. + let prefix = ctx + .wire_expr() + .and_then(|we| if !we.has_suffix() { prefix } else { None }); + let cache_guard = prefix + .as_ref() + .and_then(|p| p.interceptor_cache(self, iceptor, flow)); + let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); + iceptor.intercept(ctx, cache) + } + pub(crate) fn update_interceptors_caches(&self, res: &mut Arc) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Ingress) { + if let Some(iceptor) = self.load_interceptors(Ingress) { if let Some(expr) = res.keyexpr() { let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( @@ -178,7 +199,7 @@ impl FaceState { } } - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.load_interceptors(Egress) { if let Some(expr) = res.keyexpr() { let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( @@ -471,10 +492,84 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { - route_data(&self.tables, self, msg, reliability); + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let Some(prefix) = + tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + else { + tracing::error!( + "Received Response with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + }; + + if let Some(iceptor) = self.state.load_interceptors(Ingress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + #[cfg(feature = "stats")] + size: None, + }); + + if !self + .state + .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + { + return; + } + } + + route_data(&self.tables, &self.state, msg, reliability); } fn send_request(&self, msg: &mut Request) { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let Some(prefix) = + tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + else { + tracing::error!( + "Received Response with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + }; + + if let Some(iceptor) = self.state.load_interceptors(Ingress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }); + + if !self + .state + .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + { + // NOTE: this request was blocked by an ingress interceptor, we need to send + // response final to avoid timeout error. We don't go through the egress + // interceptors because this message is not supposed to be filtered anyway. + self.state.intercept_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); + return; + } + } + match msg.payload { RequestBody::Query(_) => { route_query(&self.tables, &self.state, msg); @@ -483,10 +578,57 @@ impl Primitives for Face { } fn send_response(&self, msg: &mut Response) { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let Some(prefix) = + tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + else { + tracing::error!( + "Received Response with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + }; + + if let Some(iceptor) = self.state.load_interceptors(Ingress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Response(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }); + + if !self + .state + .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + { + return; + } + } + route_send_response(&self.tables, &mut self.state.clone(), msg); } fn send_response_final(&self, msg: &mut ResponseFinal) { + if let Some(iceptor) = self.state.load_interceptors(Ingress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::ResponseFinal(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }); + + // NOTE: ResponseFinal messages have no keyexpr + if !self.state.run_interceptors(Ingress, None, &iceptor, ctx) { + return; + } + } + route_send_response_final(&self.tables, &mut self.state.clone(), msg.rid); } @@ -522,3 +664,87 @@ impl fmt::Display for Face { self.state.fmt(f) } } + +impl FaceState { + pub(crate) fn intercept_push( + &self, + msg: &mut Push, + reliability: Reliability, + prefix: &Resource, + ) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + #[cfg(feature = "stats")] + size: None, + }); + + if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + return; + } + } + + self.primitives.send_push(msg, reliability); + } + + pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: &Resource) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, + }); + + if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + // NOTE: this request was blocked by an egress interceptor, we need to send + // response final to avoid timeout error. We don't go through the egress + // interceptors because this message is not supposed to be filtered anyway. + self.intercept_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); + return; + } + } + + self.primitives.send_request(msg); + } + + pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: &Resource) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::Response(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }); + + if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + return; + } + } + + self.primitives.send_response(msg); + } + + pub(crate) fn intercept_response_final(&self, msg: &mut ResponseFinal) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::ResponseFinal(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }); + + // NOTE: ResponseFinal messages have no keyexpr + if !self.run_interceptors(InterceptorFlow::Egress, None, &iceptor, ctx) { + return; + } + } + + self.primitives.send_response_final(msg); + } +} diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 3cf1e77b89..5340ae5b46 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -16,17 +16,16 @@ use std::collections::HashMap; use std::sync::Arc; -use zenoh_config::InterceptorFlow; use zenoh_core::zread; use zenoh_protocol::{ core::{key_expr::keyexpr, Reliability, WireExpr}, - network::{declare::SubscriberId, push::ext, NetworkBodyMut, NetworkMessageMut, Push}, + network::{declare::SubscriberId, push::ext, Push}, zenoh::PushBody, }; use zenoh_sync::get_mut_unchecked; use super::{ - face::{Face, FaceState}, + face::FaceState, resource::{Direction, Resource}, tables::{NodeId, Route, RoutingExpr, Tables, TablesLock}, }; @@ -35,7 +34,6 @@ use crate::key_expr::KeyExpr; use crate::net::routing::{ hat::{HatTrait, SendDeclare}, router::get_or_set_route, - RoutingContext, }; #[derive(Copy, Clone)] @@ -283,13 +281,13 @@ macro_rules! inc_stats { #[allow(clippy::too_many_arguments)] pub fn route_data( tables_ref: &Arc, - face: &Face, + face: &Arc, msg: &mut Push, reliability: Reliability, ) { let tables = zread!(tables_ref.tables); match tables - .get_mapping(&face.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => { @@ -300,19 +298,6 @@ pub fn route_data( msg.wire_expr.suffix.as_ref() ); - if let Some(interceptor) = face.state.load_interceptors(InterceptorFlow::Ingress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Push(msg), - reliability, - #[cfg(feature = "stats")] - size: None, - }); - - if !interceptor.intercept_with_face(ctx, face, &prefix, InterceptorFlow::Ingress) { - return; - } - }; - let mut expr = RoutingExpr::new(&prefix, msg.wire_expr.suffix.as_ref()); #[cfg(feature = "stats")] @@ -324,19 +309,10 @@ pub fn route_data( inc_stats!(face.state, rx, admin, msg.payload); } - if tables - .hat_code - .ingress_filter(&tables, &face.state, &mut expr) - { + if tables.hat_code.ingress_filter(&tables, face, &mut expr) { let res = Resource::get_resource(&prefix, expr.suffix); - let route = get_data_route( - &tables, - &face.state, - &res, - &mut expr, - msg.ext_nodeid.node_id, - ); + let route = get_data_route(&tables, face, &res, &mut expr, msg.ext_nodeid.node_id); if !route.is_empty() { treat_timestamp!(&tables.hlc, msg.payload, tables.drop_future_timestamp); @@ -345,7 +321,7 @@ pub fn route_data( let (outface, key_expr, context) = route.values().next().unwrap(); if tables .hat_code - .egress_filter(&tables, &face.state, outface, &mut expr) + .egress_filter(&tables, face, outface, &mut expr) { drop(tables); #[cfg(feature = "stats")] @@ -357,38 +333,35 @@ pub fn route_data( msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; - if let Some(interceptor) = - face.state.load_interceptors(InterceptorFlow::Egress) - { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Push(msg), - reliability, - #[cfg(feature = "stats")] - size: None, - }); - - if !interceptor.intercept_with_face( - ctx, - face, - &prefix, - InterceptorFlow::Egress, - ) { - return; + let prefix = { + let tables = tables_ref + .tables + .read() + .expect("reading Tables should not fail"); + match tables + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got Push with unknown scope {} from {}", + msg.wire_expr.scope, + face, + ); + return; + } } }; - - outface.primitives.send_push(msg, reliability) + outface.intercept_push(msg, reliability, &prefix) } } else { let route = route .values() - .filter(|(outface, _key_expr, _context)| { - tables.hat_code.egress_filter( - &tables, - &face.state, - outface, - &mut expr, - ) + .filter(|(outface, _key_expr, _context)| -> bool { + tables + .hat_code + .egress_filter(&tables, face, outface, &mut expr) }) .cloned() .collect::>(); @@ -410,27 +383,26 @@ pub fn route_data( payload: msg.payload.clone(), }; - if let Some(interceptor) = - face.state.load_interceptors(InterceptorFlow::Egress) - { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Push(msg), - reliability, - #[cfg(feature = "stats")] - size: None, - }); - - if !interceptor.intercept_with_face( - ctx, - face, - &prefix, - InterceptorFlow::Egress, - ) { - continue; + let prefix = { + let tables = tables_ref + .tables + .read() + .expect("reading Tables should not fail"); + if let Some(prefix) = tables + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + prefix + } else { + tracing::error!( + "Got Push with unknown scope {} from {}", + msg.wire_expr.scope, + face, + ); + return; } }; - - outface.primitives.send_push(msg, reliability) + outface.intercept_push(msg, reliability, &prefix) } } } diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index a0b6f3e354..65797c5992 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -453,12 +453,13 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu match rtables.get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) { Some(prefix) => { tracing::debug!( - "{}:{} Route query for res {}{}", + "{}:{} Route query for resource {}{}", face, msg.id, prefix.expr(), msg.wire_expr.suffix.as_ref(), ); + let prefix = prefix.clone(); let mut expr = RoutingExpr::new(&prefix, msg.wire_expr.suffix.as_ref()); @@ -495,13 +496,11 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu face, msg.id ); - face.primitives - .clone() - .send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.intercept_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } else { for ((outface, key_expr, context), outqid) in route.values() { QueryCleanup::spawn_query_clean_up_task( @@ -521,7 +520,8 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu outface, outqid ); - outface.primitives.send_request(&mut Request { + + let msg = &mut Request { id: *outqid, wire_expr: key_expr.into(), ext_qos: msg.ext_qos, @@ -531,19 +531,39 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu ext_budget: msg.ext_budget, ext_timeout: msg.ext_timeout, payload: msg.payload.clone(), - }); + }; + + let prefix = { + let tables = tables_ref + .tables + .read() + .expect("reading Tables should not fail"); + match tables + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got Request with unknown scope {} from {}", + msg.wire_expr.scope, + face, + ); + return; + } + } + }; + outface.intercept_request(msg, &prefix); } } } else { tracing::debug!("{}:{} Send final reply (not master)", face, msg.id); drop(rtables); - face.primitives - .clone() - .send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.intercept_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } } None => { @@ -554,18 +574,15 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu msg.wire_expr.scope, ); drop(rtables); - face.primitives - .clone() - .send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + face.intercept_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } } } -#[allow(clippy::too_many_arguments)] pub(crate) fn route_send_response( tables_ref: &Arc, face: &mut Arc, @@ -602,7 +619,28 @@ pub(crate) fn route_send_response( } msg.rid = query.src_qid; - query.src_face.primitives.send_response(msg); + + let prefix = { + let tables = tables_ref + .tables + .read() + .expect("reading Tables should not fail"); + match tables + .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got Responde with unknown scope {} from {}", + msg.wire_expr.scope, + face, + ); + return; + } + } + }; + query.src_face.intercept_response(msg, &prefix); } None => tracing::warn!("{}:{} Route reply: Query not found!", face, msg.rid), } @@ -643,14 +681,10 @@ pub(crate) fn finalize_pending_query(query: (Arc, CancellationToken)) { cancellation_token.cancel(); if let Some(query) = Arc::into_inner(query) { tracing::debug!("{}:{} Propagate final reply", query.src_face, query.src_qid); - query - .src_face - .primitives - .clone() - .send_response_final(&mut ResponseFinal { - rid: query.src_qid, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + query.src_face.intercept_response_final(&mut ResponseFinal { + rid: query.src_qid, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); } } diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index e4998c09c7..37caacb743 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -39,7 +39,6 @@ use super::{ tables::{Tables, TablesLock}, }; use crate::net::routing::{ - dispatcher::face::Face, interceptor::{InterceptorTrait, InterceptorsChain}, router::{disable_matches_data_routes, disable_matches_query_routes}, RoutingContext, @@ -762,7 +761,7 @@ impl Resource { pub(crate) fn get_ingress_cache( &self, - face: &Face, + face: &FaceState, interceptor: &InterceptorsChain, ) -> Option { self.interceptor_cache(face, interceptor, InterceptorFlow::Ingress) @@ -770,7 +769,7 @@ impl Resource { pub(crate) fn get_egress_cache( &self, - face: &Face, + face: &FaceState, interceptor: &InterceptorsChain, ) -> Option { self.interceptor_cache(face, interceptor, InterceptorFlow::Egress) @@ -778,11 +777,11 @@ impl Resource { pub(crate) fn interceptor_cache( &self, - face: &Face, + face: &FaceState, interceptor: &InterceptorsChain, flow: InterceptorFlow, ) -> Option { - self.session_ctxs.get(&face.state.id).and_then(|ctx| { + self.session_ctxs.get(&face.id).and_then(|ctx| { match flow { InterceptorFlow::Egress => &ctx.e_interceptor_cache, InterceptorFlow::Ingress => &ctx.in_interceptor_cache, diff --git a/zenoh/src/net/routing/interceptor/mod.rs b/zenoh/src/net/routing/interceptor/mod.rs index 28ea273196..1a30355d6e 100644 --- a/zenoh/src/net/routing/interceptor/mod.rs +++ b/zenoh/src/net/routing/interceptor/mod.rs @@ -24,7 +24,7 @@ use nonempty_collections::NEVec; use zenoh_link::LinkAuthId; mod authorization; -use std::{any::Any, ops::Not}; +use std::any::Any; mod low_pass; use low_pass::low_pass_interceptor_factories; @@ -34,7 +34,7 @@ use zenoh_protocol::network::NetworkMessageMut; use zenoh_result::ZResult; use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; -use super::{dispatcher::face::Face, router::Resource, RoutingContext}; +use super::RoutingContext; pub mod downsampling; use crate::net::routing::interceptor::downsampling::downsampling_interceptor_factories; @@ -83,6 +83,13 @@ impl From<&LinkAuthId> for InterceptorLinkWrapper { } } +/// Interceptor interface. +/// +/// # Requirements +/// +/// - Implementors SHOULD NOT filter out [`zenoh_protocol::network::ResponseFinal`] messages since +/// the router relies on them to respond to queries that get filtered out; this is because Zenoh +/// returns empty replies when no queryable matching a query exists. pub(crate) trait InterceptorTrait { fn compute_keyexpr_cache(&self, key_expr: &keyexpr) -> Option>; @@ -151,25 +158,6 @@ impl InterceptorsChain { version, } } - - pub(crate) fn intercept_with_face( - &self, - ctx: &mut RoutingContext, - face: &Face, - prefix: &Resource, - flow: InterceptorFlow, - ) -> bool { - // NOTE: the cache should be empty if the wire expr has no suffix, i.e. when the prefix - // doesn't represent a full keyexpr. - let prefix = ctx - .wire_expr() - .and_then(|we| we.has_suffix().not().then_some(prefix)); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.interceptor_cache(face, self, flow)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - self.intercept(ctx, cache) - } } impl InterceptorTrait for InterceptorsChain { diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 9c9b0a9ade..8013de06e5 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -723,7 +723,7 @@ fn client_test() { let route_dummy_data = |face: &Arc, wire_expr| { route_data( &tables, - face, + &face.state, &mut Push { wire_expr, ext_qos: ext::QoSType::DEFAULT, From 6874e91e2719eae4cdd1a131253de864c8df76c2 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 11:06:40 +0200 Subject: [PATCH 21/49] Update Mux & DeMux --- zenoh/src/net/primitives/demux.rs | 33 +++----- zenoh/src/net/primitives/mux.rs | 43 +--------- zenoh/src/net/routing/dispatcher/face.rs | 90 ++++++++++++--------- zenoh/src/net/routing/dispatcher/pubsub.rs | 4 +- zenoh/src/net/routing/dispatcher/queries.rs | 4 +- 5 files changed, 66 insertions(+), 108 deletions(-) diff --git a/zenoh/src/net/primitives/demux.rs b/zenoh/src/net/primitives/demux.rs index e614194666..5a0db688de 100644 --- a/zenoh/src/net/primitives/demux.rs +++ b/zenoh/src/net/primitives/demux.rs @@ -16,8 +16,7 @@ use std::{any::Any, sync::Arc}; use arc_swap::ArcSwap; use zenoh_link::Link; use zenoh_protocol::network::{ - ext, response, Declare, DeclareBody, DeclareFinal, NetworkBodyMut, NetworkMessageMut, - ResponseFinal, + ext, Declare, DeclareBody, DeclareFinal, NetworkBodyMut, NetworkMessageMut, }; use zenoh_result::ZResult; use zenoh_transport::{unicast::TransportUnicast, TransportPeerEventHandler}; @@ -57,7 +56,10 @@ impl TransportPeerEventHandler for DeMux { // NOTE: we ignore message types already handled inside the routing. && !matches!( msg.body, - NetworkBodyMut::Push(..) | NetworkBodyMut::Request(..) + NetworkBodyMut::Push(..) + | NetworkBodyMut::Request(..) + | NetworkBodyMut::Response(..) + | NetworkBodyMut::ResponseFinal(..) ) { let mut ctx = RoutingContext::new_in(msg.as_mut(), self.face.clone()); @@ -72,21 +74,6 @@ impl TransportPeerEventHandler for DeMux { let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); match &ctx.msg.body { - NetworkBodyMut::Request(request) => { - let request_id = request.id; - if !interceptor.intercept(&mut ctx, cache) { - // request was blocked by an interceptor, we need to send response final to avoid timeout error - self.face - .state - .primitives - .send_response_final(&mut ResponseFinal { - rid: request_id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); - return Ok(()); - } - } NetworkBodyMut::Interest(interest) => { let interest_id = interest.id; if !interceptor.intercept(&mut ctx, cache) { @@ -107,11 +94,11 @@ impl TransportPeerEventHandler for DeMux { return Ok(()); } } - NetworkBodyMut::Push(..) => unreachable!(), - NetworkBodyMut::Response(..) - | NetworkBodyMut::ResponseFinal(..) - | NetworkBodyMut::Declare(..) - | NetworkBodyMut::OAM(..) => { + NetworkBodyMut::Push(..) + | NetworkBodyMut::Request(..) + | NetworkBodyMut::Response(..) + | NetworkBodyMut::ResponseFinal(..) => unreachable!(), + NetworkBodyMut::Declare(..) | NetworkBodyMut::OAM(..) => { if !interceptor.intercept(&mut ctx, cache) { return Ok(()); } diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index afc292bad0..2728b2f6b4 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -141,27 +141,7 @@ impl EPrimitives for Mux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_response_final(&self, msg: &mut ResponseFinal) { @@ -171,26 +151,7 @@ impl EPrimitives for Mux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 93e8a19271..7923e79298 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -166,7 +166,7 @@ impl FaceState { .and_then(|iceptors| iceptors.is_empty().not().then_some(iceptors)) } - pub(crate) fn run_interceptors( + pub(crate) fn exec_interceptors( &self, flow: InterceptorFlow, prefix: Option<&Resource>, @@ -502,7 +502,7 @@ impl Primitives for Face { tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) else { tracing::error!( - "Received Response with unknown scope {} from {}", + "Received WireExpr with unknown scope {} from {}", msg.wire_expr.scope, self, ); @@ -519,7 +519,7 @@ impl Primitives for Face { if !self .state - .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + .exec_interceptors(Ingress, Some(prefix), &iceptor, ctx) { return; } @@ -529,21 +529,26 @@ impl Primitives for Face { } fn send_request(&self, msg: &mut Request) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let Some(prefix) = - tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - else { - tracing::error!( - "Received Response with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + if let Some(prefix) = tables + .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + prefix + } else { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } }; if let Some(iceptor) = self.state.load_interceptors(Ingress) { @@ -556,7 +561,7 @@ impl Primitives for Face { if !self .state - .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + .exec_interceptors(Ingress, Some(&prefix), &iceptor, ctx) { // NOTE: this request was blocked by an ingress interceptor, we need to send // response final to avoid timeout error. We don't go through the egress @@ -578,21 +583,26 @@ impl Primitives for Face { } fn send_response(&self, msg: &mut Response) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let Some(prefix) = - tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - else { - tracing::error!( - "Received Response with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + if let Some(prefix) = tables + .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + prefix + } else { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } }; if let Some(iceptor) = self.state.load_interceptors(Ingress) { @@ -605,7 +615,7 @@ impl Primitives for Face { if !self .state - .run_interceptors(Ingress, Some(prefix), &iceptor, ctx) + .exec_interceptors(Ingress, Some(&prefix), &iceptor, ctx) { return; } @@ -624,7 +634,7 @@ impl Primitives for Face { }); // NOTE: ResponseFinal messages have no keyexpr - if !self.state.run_interceptors(Ingress, None, &iceptor, ctx) { + if !self.state.exec_interceptors(Ingress, None, &iceptor, ctx) { return; } } @@ -680,7 +690,7 @@ impl FaceState { size: None, }); - if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { return; } } @@ -697,7 +707,7 @@ impl FaceState { size: None, }); - if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { // NOTE: this request was blocked by an egress interceptor, we need to send // response final to avoid timeout error. We don't go through the egress // interceptors because this message is not supposed to be filtered anyway. @@ -722,7 +732,7 @@ impl FaceState { size: None, }); - if !self.run_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { return; } } @@ -740,7 +750,7 @@ impl FaceState { }); // NOTE: ResponseFinal messages have no keyexpr - if !self.run_interceptors(InterceptorFlow::Egress, None, &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, None, &iceptor, ctx) { return; } } diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index bb344a8dda..6b636a097d 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -344,7 +344,7 @@ pub fn route_data( Some(prefix) => prefix, None => { tracing::error!( - "Got Push with unknown scope {} from {}", + "Got WireExpr with unknown scope {} from {}", msg.wire_expr.scope, face, ); @@ -394,7 +394,7 @@ pub fn route_data( prefix } else { tracing::error!( - "Got Push with unknown scope {} from {}", + "Got WireExpr with unknown scope {} from {}", msg.wire_expr.scope, face, ); diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index 65797c5992..b14fe990da 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -545,7 +545,7 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu Some(prefix) => prefix, None => { tracing::error!( - "Got Request with unknown scope {} from {}", + "Got WireExpr with unknown scope {} from {}", msg.wire_expr.scope, face, ); @@ -632,7 +632,7 @@ pub(crate) fn route_send_response( Some(prefix) => prefix, None => { tracing::error!( - "Got Responde with unknown scope {} from {}", + "Got WireExpr with unknown scope {} from {}", msg.wire_expr.scope, face, ); From ff66265da85630ef1d4bed3a006ec1eccb3654a0 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 11:14:30 +0200 Subject: [PATCH 22/49] Thanks `rustfmt` --- zenoh/src/net/tests/tables.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 93ba7c393b..8013de06e5 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -20,10 +20,10 @@ use uhlc::HLC; use zenoh_buffers::ZBuf; use zenoh_config::Config; use zenoh_core::zlock; -use zenoh_protocol::core::Encoding; use zenoh_protocol::{ core::{ - key_expr::keyexpr, ExprId, Reliability, WhatAmI, WireExpr, ZenohIdProto, EMPTY_EXPR_ID, + key_expr::keyexpr, Encoding, ExprId, Reliability, WhatAmI, WireExpr, ZenohIdProto, + EMPTY_EXPR_ID, }, network::{ext, Declare, DeclareBody, DeclareKeyExpr, Push}, zenoh::{PushBody, Put}, From a428dbad95729f98f8460bfe490eabebefe77997 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 11:25:24 +0200 Subject: [PATCH 23/49] Fix `client_test` --- zenoh/src/net/tests/tables.rs | 45 ++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 8013de06e5..bc3491182b 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -13,7 +13,7 @@ // use std::{ convert::{TryFrom, TryInto}, - sync::Arc, + sync::{Arc, Weak}, }; use uhlc::HLC; @@ -34,7 +34,11 @@ use crate::{ net::{ primitives::{DummyPrimitives, EPrimitives, Primitives}, routing::{ - dispatcher::{face::Face, pubsub::SubscriberInfo, tables::Tables}, + dispatcher::{ + face::{Face, FaceState}, + pubsub::SubscriberInfo, + tables::Tables, + }, router::*, RoutingContext, }, @@ -592,11 +596,10 @@ fn client_test() { let sub_info = SubscriberInfo; let primitives0 = Arc::new(ClientPrimitives::new()); - let face0 = router.new_primitives(primitives0.clone()); - let weak_face0 = Arc::downgrade(&face0); + let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone()).state); register_expr( &tables, - &mut weak_face0.upgrade().unwrap().state.clone(), + &mut face0.upgrade().unwrap(), 11, &"test/client".into(), ); @@ -616,7 +619,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut weak_face0.upgrade().unwrap().state.clone(), + &mut face0.upgrade().unwrap(), 0, &WireExpr::from(11).with_suffix("/**"), &sub_info, @@ -625,7 +628,7 @@ fn client_test() { ); register_expr( &tables, - &mut weak_face0.upgrade().unwrap().state.clone(), + &mut face0.upgrade().unwrap(), 12, &WireExpr::from(11).with_suffix("/z1_pub1"), ); @@ -644,8 +647,13 @@ fn client_test() { ); let primitives1 = Arc::new(ClientPrimitives::new()); - let face1 = router.new_primitives(primitives1.clone()); - register_expr(&tables, &mut face1.state.clone(), 21, &"test/client".into()); + let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone()).state); + register_expr( + &tables, + &mut face1.upgrade().unwrap(), + 21, + &"test/client".into(), + ); Primitives::send_declare( primitives1.as_ref(), &mut Declare { @@ -662,7 +670,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face1.state.clone(), + &mut face1.upgrade().unwrap(), 0, &WireExpr::from(21).with_suffix("/**"), &sub_info, @@ -671,7 +679,7 @@ fn client_test() { ); register_expr( &tables, - &mut face1.state.clone(), + &mut face1.upgrade().unwrap(), 22, &WireExpr::from(21).with_suffix("/z2_pub1"), ); @@ -690,8 +698,13 @@ fn client_test() { ); let primitives2 = Arc::new(ClientPrimitives::new()); - let face2 = router.new_primitives(primitives2.clone()); - register_expr(&tables, &mut face2.state.clone(), 31, &"test/client".into()); + let face2 = Arc::downgrade(&router.new_primitives(primitives2.clone()).state); + register_expr( + &tables, + &mut face2.upgrade().unwrap(), + 31, + &"test/client".into(), + ); Primitives::send_declare( primitives2.as_ref(), &mut Declare { @@ -708,7 +721,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face2.state.clone(), + &mut face2.upgrade().unwrap(), 0, &WireExpr::from(31).with_suffix("/**"), &sub_info, @@ -720,10 +733,10 @@ fn client_test() { primitives1.clear_data(); primitives2.clear_data(); - let route_dummy_data = |face: &Arc, wire_expr| { + let route_dummy_data = |face: &Weak, wire_expr| { route_data( &tables, - &face.state, + &face.upgrade().unwrap(), &mut Push { wire_expr, ext_qos: ext::QoSType::DEFAULT, From 1dffc570ac295497a3efcbe5489c4dd62d96ecdf Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 12:05:52 +0200 Subject: [PATCH 24/49] Fix egress prefix mapping --- zenoh/src/net/routing/dispatcher/pubsub.rs | 34 +++++++++++++-------- zenoh/src/net/routing/dispatcher/queries.rs | 8 +++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 6b636a097d..e73d9d6746 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -338,13 +338,17 @@ pub fn route_data( .read() .expect("reading Tables should not fail"); match tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_sent_mapping( + outface, + &msg.wire_expr.scope, + msg.wire_expr.mapping, + ) .cloned() { Some(prefix) => prefix, None => { tracing::error!( - "Got WireExpr with unknown scope {} from {}", + "Got WireExpr with unknown scope {} from {} (A)", msg.wire_expr.scope, face, ); @@ -387,18 +391,24 @@ pub fn route_data( .tables .read() .expect("reading Tables should not fail"); - if let Some(prefix) = tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + + match tables + .get_sent_mapping( + &outface, + &msg.wire_expr.scope, + msg.wire_expr.mapping, + ) .cloned() { - prefix - } else { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - face, - ); - return; + Some(prefix) => prefix, + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {} (B)", + msg.wire_expr.scope, + face, + ); + return; + } } }; outface.intercept_push(msg, reliability, &prefix) diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index b14fe990da..638585c051 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -539,7 +539,11 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu .read() .expect("reading Tables should not fail"); match tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_sent_mapping( + outface, + &msg.wire_expr.scope, + msg.wire_expr.mapping, + ) .cloned() { Some(prefix) => prefix, @@ -626,7 +630,7 @@ pub(crate) fn route_send_response( .read() .expect("reading Tables should not fail"); match tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_sent_mapping(&query.src_face, &msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => prefix, From 489c87185b03815c58253c61537ec936898d0c6b Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 13:25:25 +0200 Subject: [PATCH 25/49] Set `RoutingContext:prefix` --- zenoh/src/net/routing/dispatcher/face.rs | 266 +++++++++++--------- zenoh/src/net/routing/dispatcher/pubsub.rs | 4 +- zenoh/src/net/routing/dispatcher/queries.rs | 4 +- zenoh/src/net/routing/mod.rs | 21 +- 4 files changed, 173 insertions(+), 122 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 7923e79298..3688f664ca 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -22,7 +22,7 @@ use std::{ use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; -use zenoh_config::InterceptorFlow::{self, *}; +use zenoh_config::InterceptorFlow; use zenoh_protocol::{ core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ @@ -169,15 +169,18 @@ impl FaceState { pub(crate) fn exec_interceptors( &self, flow: InterceptorFlow, - prefix: Option<&Resource>, iceptor: &InterceptorsChain, ctx: &mut RoutingContext>, ) -> bool { // NOTE: the cache should be empty if the wire expr has no suffix, i.e. when the prefix // doesn't represent a full keyexpr. - let prefix = ctx - .wire_expr() - .and_then(|we| if !we.has_suffix() { prefix } else { None }); + let prefix = ctx.wire_expr().and_then(|we| { + if we.has_suffix() { + None + } else { + ctx.prefix.get() + } + }); let cache_guard = prefix .as_ref() .and_then(|p| p.interceptor_cache(self, iceptor, flow)); @@ -186,7 +189,7 @@ impl FaceState { } pub(crate) fn update_interceptors_caches(&self, res: &mut Arc) { - if let Some(iceptor) = self.load_interceptors(Ingress) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Ingress) { if let Some(expr) = res.keyexpr() { let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( @@ -199,7 +202,7 @@ impl FaceState { } } - if let Some(iceptor) = self.load_interceptors(Egress) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { if let Some(expr) = res.keyexpr() { let cache = iceptor.compute_keyexpr_cache(expr); get_mut_unchecked( @@ -492,34 +495,43 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let Some(prefix) = - tables.get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - else { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + } }; - if let Some(iceptor) = self.state.load_interceptors(Ingress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Push(msg), - reliability, - #[cfg(feature = "stats")] - size: None, - }); + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); if !self .state - .exec_interceptors(Ingress, Some(prefix), &iceptor, ctx) + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { return; } @@ -529,39 +541,43 @@ impl Primitives for Face { } fn send_request(&self, msg: &mut Request) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - if let Some(prefix) = tables - .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - prefix - } else { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } - }; - - if let Some(iceptor) = self.state.load_interceptors(Ingress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Request(msg), - reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, - }); + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + } + }; + + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); if !self .state - .exec_interceptors(Ingress, Some(&prefix), &iceptor, ctx) + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { // NOTE: this request was blocked by an ingress interceptor, we need to send // response final to avoid timeout error. We don't go through the egress @@ -583,39 +599,43 @@ impl Primitives for Face { } fn send_response(&self, msg: &mut Response) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - if let Some(prefix) = tables - .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - prefix - } else { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } - }; - - if let Some(iceptor) = self.state.load_interceptors(Ingress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Response(msg), - reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, - }); + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + } + }; + + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Response(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); if !self .state - .exec_interceptors(Ingress, Some(&prefix), &iceptor, ctx) + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { return; } @@ -625,7 +645,7 @@ impl Primitives for Face { } fn send_response_final(&self, msg: &mut ResponseFinal) { - if let Some(iceptor) = self.state.load_interceptors(Ingress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable @@ -634,7 +654,10 @@ impl Primitives for Face { }); // NOTE: ResponseFinal messages have no keyexpr - if !self.state.exec_interceptors(Ingress, None, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) + { return; } } @@ -680,17 +703,20 @@ impl FaceState { &self, msg: &mut Push, reliability: Reliability, - prefix: &Resource, + prefix: Arc, ) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Push(msg), - reliability, - #[cfg(feature = "stats")] - size: None, - }); + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Push(msg), + reliability, + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); - if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { return; } } @@ -698,16 +724,19 @@ impl FaceState { self.primitives.send_push(msg, reliability); } - pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: &Resource) { + pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: Arc) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Request(msg), - reliability: Reliability::Reliable, - #[cfg(feature = "stats")] - size: None, - }); + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); - if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { // NOTE: this request was blocked by an egress interceptor, we need to send // response final to avoid timeout error. We don't go through the egress // interceptors because this message is not supposed to be filtered anyway. @@ -723,16 +752,19 @@ impl FaceState { self.primitives.send_request(msg); } - pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: &Resource) { + pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: Arc) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::Response(msg), - reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, - }); + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Response(msg), + reliability: Reliability::Reliable, // NOTE: queries are always reliable + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); - if !self.exec_interceptors(InterceptorFlow::Egress, Some(prefix), &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { return; } } @@ -750,7 +782,7 @@ impl FaceState { }); // NOTE: ResponseFinal messages have no keyexpr - if !self.exec_interceptors(InterceptorFlow::Egress, None, &iceptor, ctx) { + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { return; } } diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index e73d9d6746..09ab1749e1 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -356,7 +356,7 @@ pub fn route_data( } } }; - outface.intercept_push(msg, reliability, &prefix) + outface.intercept_push(msg, reliability, prefix) } } else { let route = route @@ -411,7 +411,7 @@ pub fn route_data( } } }; - outface.intercept_push(msg, reliability, &prefix) + outface.intercept_push(msg, reliability, prefix) } } } diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index 638585c051..2932e21c6a 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -557,7 +557,7 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu } } }; - outface.intercept_request(msg, &prefix); + outface.intercept_request(msg, prefix); } } } else { @@ -644,7 +644,7 @@ pub(crate) fn route_send_response( } } }; - query.src_face.intercept_response(msg, &prefix); + query.src_face.intercept_response(msg, prefix); } None => tracing::warn!("{}:{} Route reply: Query not found!", face, msg.rid), } diff --git a/zenoh/src/net/routing/mod.rs b/zenoh/src/net/routing/mod.rs index 290be7043d..5089bfd65e 100644 --- a/zenoh/src/net/routing/mod.rs +++ b/zenoh/src/net/routing/mod.rs @@ -87,6 +87,16 @@ impl RoutingContext { } } + pub(crate) fn with_prefix(msg: Msg, prefix: Arc) -> Self { + Self { + msg, + inface: OnceCell::new(), + outface: OnceCell::new(), + prefix: OnceCell::from(prefix), + full_expr: OnceCell::new(), + } + } + #[allow(dead_code)] pub(crate) fn inface(&self) -> Option<&Face> { self.inface.get() @@ -152,12 +162,21 @@ impl RoutingContext> { if self.full_expr.get().is_some() { return Some(self.full_expr.get().as_ref().unwrap()); } - if let Some(prefix) = self.prefix() { + + if let Some(prefix) = self.prefix.get() { let _ = self .full_expr .set(prefix.expr().to_string() + self.wire_expr().unwrap().suffix.as_ref()); return Some(self.full_expr.get().as_ref().unwrap()); } + + // if let Some(prefix) = self.prefix() { + // let _ = self + // .full_expr + // .set(prefix.expr().to_string() + self.wire_expr().unwrap().suffix.as_ref()); + // return Some(self.full_expr.get().as_ref().unwrap()); + // } + None } From 4118761fbee9fc4d9ddf474b2c2035fb42756fe2 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Fri, 11 Apr 2025 17:14:03 +0200 Subject: [PATCH 26/49] Handle `INTEREST` & `DECLARE` --- commons/zenoh-protocol/src/network/declare.rs | 15 + zenoh/src/net/primitives/demux.rs | 89 +---- zenoh/src/net/primitives/mux.rs | 231 ++---------- zenoh/src/net/routing/dispatcher/face.rs | 336 +++++++++++------ zenoh/src/net/routing/dispatcher/interests.rs | 17 +- zenoh/src/net/routing/dispatcher/pubsub.rs | 13 +- zenoh/src/net/routing/dispatcher/queries.rs | 13 +- zenoh/src/net/routing/dispatcher/resource.rs | 33 +- zenoh/src/net/routing/dispatcher/tables.rs | 4 +- zenoh/src/net/routing/dispatcher/token.rs | 7 +- zenoh/src/net/routing/hat/client/interests.rs | 41 +-- zenoh/src/net/routing/hat/client/pubsub.rs | 79 ++-- zenoh/src/net/routing/hat/client/queries.rs | 81 ++-- zenoh/src/net/routing/hat/client/token.rs | 197 +++++----- .../routing/hat/linkstate_peer/interests.rs | 12 +- .../net/routing/hat/linkstate_peer/pubsub.rs | 250 ++++++------- .../net/routing/hat/linkstate_peer/queries.rs | 230 ++++++------ .../net/routing/hat/linkstate_peer/token.rs | 234 ++++++------ zenoh/src/net/routing/hat/mod.rs | 14 +- .../src/net/routing/hat/p2p_peer/interests.rs | 34 +- zenoh/src/net/routing/hat/p2p_peer/mod.rs | 16 +- zenoh/src/net/routing/hat/p2p_peer/pubsub.rs | 263 ++++++------- zenoh/src/net/routing/hat/p2p_peer/queries.rs | 218 +++++------ zenoh/src/net/routing/hat/p2p_peer/token.rs | 305 +++++++-------- zenoh/src/net/routing/hat/router/interests.rs | 8 +- zenoh/src/net/routing/hat/router/pubsub.rs | 300 +++++++-------- zenoh/src/net/routing/hat/router/queries.rs | 310 ++++++++-------- zenoh/src/net/routing/hat/router/token.rs | 346 ++++++++---------- zenoh/src/net/routing/mod.rs | 29 +- zenoh/src/net/routing/router.rs | 33 +- zenoh/src/net/tests/tables.rs | 32 +- 31 files changed, 1705 insertions(+), 2085 deletions(-) diff --git a/commons/zenoh-protocol/src/network/declare.rs b/commons/zenoh-protocol/src/network/declare.rs index 6efd69d31f..7f9e7a11a9 100644 --- a/commons/zenoh-protocol/src/network/declare.rs +++ b/commons/zenoh-protocol/src/network/declare.rs @@ -148,6 +148,21 @@ impl Declare { body, } } + + #[inline] + pub fn wire_expr(&self) -> Option<&WireExpr> { + match &self.body { + DeclareBody::DeclareKeyExpr(m) => Some(&m.wire_expr), + DeclareBody::UndeclareKeyExpr(_) => None, + DeclareBody::DeclareSubscriber(m) => Some(&m.wire_expr), + DeclareBody::UndeclareSubscriber(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareQueryable(m) => Some(&m.wire_expr), + DeclareBody::UndeclareQueryable(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareToken(m) => Some(&m.wire_expr), + DeclareBody::UndeclareToken(m) => Some(&m.ext_wire_expr.wire_expr), + DeclareBody::DeclareFinal(_) => None, + } + } } pub mod common { diff --git a/zenoh/src/net/primitives/demux.rs b/zenoh/src/net/primitives/demux.rs index 5a0db688de..f918f99bc4 100644 --- a/zenoh/src/net/primitives/demux.rs +++ b/zenoh/src/net/primitives/demux.rs @@ -11,101 +11,30 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::{any::Any, sync::Arc}; +use std::any::Any; -use arc_swap::ArcSwap; use zenoh_link::Link; -use zenoh_protocol::network::{ - ext, Declare, DeclareBody, DeclareFinal, NetworkBodyMut, NetworkMessageMut, -}; +use zenoh_protocol::network::{NetworkBodyMut, NetworkMessageMut}; use zenoh_result::ZResult; use zenoh_transport::{unicast::TransportUnicast, TransportPeerEventHandler}; use super::Primitives; -use crate::net::routing::{ - dispatcher::face::Face, - interceptor::{InterceptorTrait, InterceptorsChain}, - RoutingContext, -}; +use crate::net::routing::dispatcher::face::Face; pub struct DeMux { face: Face, pub(crate) transport: Option, - pub(crate) interceptor: Arc>, } impl DeMux { - pub(crate) fn new( - face: Face, - transport: Option, - interceptor: Arc>, - ) -> Self { - Self { - face, - transport, - interceptor, - } + pub(crate) fn new(face: Face, transport: Option) -> Self { + Self { face, transport } } } impl TransportPeerEventHandler for DeMux { #[inline] - fn handle_message(&self, mut msg: NetworkMessageMut) -> ZResult<()> { - let interceptor = self.interceptor.load(); - if !interceptor.interceptors.is_empty() - // NOTE: we ignore message types already handled inside the routing. - && !matches!( - msg.body, - NetworkBodyMut::Push(..) - | NetworkBodyMut::Request(..) - | NetworkBodyMut::Response(..) - | NetworkBodyMut::ResponseFinal(..) - ) - { - let mut ctx = RoutingContext::new_in(msg.as_mut(), self.face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_ingress_cache(&self.face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - - match &ctx.msg.body { - NetworkBodyMut::Interest(interest) => { - let interest_id = interest.id; - if !interceptor.intercept(&mut ctx, cache) { - // request was blocked by an interceptor, we need to send declare final to avoid timeout error - self.face - .state - .primitives - .send_declare(RoutingContext::new_in( - &mut Declare { - interest_id: Some(interest_id), - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareFinal(DeclareFinal), - }, - self.face.clone(), - )); - return Ok(()); - } - } - NetworkBodyMut::Push(..) - | NetworkBodyMut::Request(..) - | NetworkBodyMut::Response(..) - | NetworkBodyMut::ResponseFinal(..) => unreachable!(), - NetworkBodyMut::Declare(..) | NetworkBodyMut::OAM(..) => { - if !interceptor.intercept(&mut ctx, cache) { - return Ok(()); - } - } - }; - } - + fn handle_message(&self, msg: NetworkMessageMut) -> ZResult<()> { match msg.body { NetworkBodyMut::Push(m) => self.face.send_push(m, msg.reliability), NetworkBodyMut::Declare(m) => self.face.send_declare(m), @@ -123,12 +52,12 @@ impl TransportPeerEventHandler for DeMux { &self.face.tables, m, transport, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), )?; drop(tables); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()); } } } diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index 2728b2f6b4..2fda08e8d5 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -11,7 +11,7 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::sync::{Arc, OnceLock}; +use std::sync::OnceLock; use arc_swap::ArcSwap; use zenoh_protocol::{ @@ -24,92 +24,37 @@ use zenoh_protocol::{ use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; use super::EPrimitives; -use crate::net::routing::{ - dispatcher::face::{Face, WeakFace}, - interceptor::{InterceptorTrait, InterceptorsChain}, - RoutingContext, -}; +use crate::net::routing::{dispatcher::face::Face, interceptor::InterceptorsChain, RoutingContext}; pub struct Mux { pub handler: TransportUnicast, - pub(crate) face: OnceLock, - pub(crate) interceptor: Arc>, } impl Mux { - pub(crate) fn new(handler: TransportUnicast, interceptor: InterceptorsChain) -> Mux { - Mux { - handler, - face: OnceLock::new(), - interceptor: Arc::new(ArcSwap::new(interceptor.into())), - } + pub(crate) fn new(handler: TransportUnicast) -> Mux { + Mux { handler } } } impl EPrimitives for Mux { fn send_interest(&self, ctx: RoutingContext<&mut Interest>) { - let interest_id = ctx.msg.id; - let mut ctx = RoutingContext { - msg: NetworkMessageMut { - body: NetworkBodyMut::Interest(ctx.msg), - reliability: Reliability::Reliable, - #[cfg(feature = "stats")] - size: None, - }, - inface: ctx.inface, - outface: ctx.outface, - prefix: ctx.prefix, - full_expr: ctx.full_expr, + let msg = NetworkMessageMut { + body: NetworkBodyMut::Interest(ctx.msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, }; - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let interceptor = self.interceptor.load(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); - - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - - if self.interceptor.load().intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } else { - // send declare final to avoid timeout on blocked interest - if let Some(face) = self.face.get().and_then(|f| f.upgrade()) { - face.reject_interest(interest_id); - } - } + let _ = self.handler.schedule(msg); } fn send_declare(&self, ctx: RoutingContext<&mut Declare>) { - let mut ctx = RoutingContext { - msg: NetworkMessageMut { - body: NetworkBodyMut::Declare(ctx.msg), - reliability: Reliability::Reliable, - #[cfg(feature = "stats")] - size: None, - }, - inface: ctx.inface, - outface: ctx.outface, - prefix: ctx.prefix, - full_expr: ctx.full_expr, + let msg = NetworkMessageMut { + body: NetworkBodyMut::Declare(ctx.msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, }; - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let interceptor = self.interceptor.load(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - - if self.interceptor.load().intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } + let _ = self.handler.schedule(msg); } fn send_push(&self, msg: &mut Push, reliability: Reliability) { @@ -177,59 +122,23 @@ impl McastMux { impl EPrimitives for McastMux { fn send_interest(&self, ctx: RoutingContext<&mut Interest>) { - let mut ctx = RoutingContext { - msg: NetworkMessageMut { - body: NetworkBodyMut::Interest(ctx.msg), - reliability: Reliability::Reliable, - #[cfg(feature = "stats")] - size: None, - }, - inface: ctx.inface, - outface: ctx.outface, - prefix: ctx.prefix, - full_expr: ctx.full_expr, + let msg = NetworkMessageMut { + body: NetworkBodyMut::Interest(ctx.msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, }; - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let interceptor = self.interceptor.load(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if self.interceptor.load().intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } + let _ = self.handler.schedule(msg); } fn send_declare(&self, ctx: RoutingContext<&mut Declare>) { - let mut ctx = RoutingContext { - msg: NetworkMessageMut { - body: NetworkBodyMut::Declare(ctx.msg), - reliability: Reliability::Reliable, - #[cfg(feature = "stats")] - size: None, - }, - inface: ctx.inface, - outface: ctx.outface, - prefix: ctx.prefix, - full_expr: ctx.full_expr, + let msg = NetworkMessageMut { + body: NetworkBodyMut::Declare(ctx.msg), + reliability: Reliability::Reliable, + #[cfg(feature = "stats")] + size: None, }; - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let interceptor = self.interceptor.load(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&ctx.outface.get().unwrap().state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if self.interceptor.load().intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } + let _ = self.handler.schedule(msg); } fn send_push(&self, msg: &mut Push, reliability: Reliability) { @@ -239,26 +148,7 @@ impl EPrimitives for McastMux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get() { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_request(&self, msg: &mut Request) { @@ -268,26 +158,7 @@ impl EPrimitives for McastMux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get() { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_response(&self, msg: &mut Response) { @@ -297,26 +168,7 @@ impl EPrimitives for McastMux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get() { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn send_response_final(&self, msg: &mut ResponseFinal) { @@ -326,26 +178,7 @@ impl EPrimitives for McastMux { #[cfg(feature = "stats")] size: None, }; - let interceptor = self.interceptor.load(); - if interceptor.interceptors.is_empty() { - let _ = self.handler.schedule(msg); - } else if let Some(face) = self.face.get() { - let mut ctx = RoutingContext::new_out(msg, face.clone()); - let prefix = ctx - .wire_expr() - .and_then(|we| (!we.has_suffix()).then(|| ctx.prefix())) - .flatten() - .cloned(); - let cache_guard = prefix - .as_ref() - .and_then(|p| p.get_egress_cache(&face.state, &interceptor)); - let cache = cache_guard.as_ref().and_then(|c| c.get_ref().as_ref()); - if interceptor.intercept(&mut ctx, cache) { - let _ = self.handler.schedule(ctx.msg); - } - } else { - tracing::error!("Uninitialized multiplexer!"); - } + let _ = self.handler.schedule(msg); } fn as_any(&self) -> &dyn std::any::Any { diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 3688f664ca..3c80c27fd0 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -11,14 +11,7 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::{ - any::Any, - collections::HashMap, - fmt, - ops::Not, - sync::{Arc, Weak}, - time::Duration, -}; +use std::{any::Any, collections::HashMap, fmt, ops::Not, sync::Arc, time::Duration}; use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; @@ -27,8 +20,8 @@ use zenoh_protocol::{ core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ interest::{InterestId, InterestMode, InterestOptions}, - response, Mapping, NetworkBodyMut, NetworkMessageMut, Push, Request, RequestId, Response, - ResponseFinal, + response, Declare, Interest, Mapping, NetworkBodyMut, NetworkMessageMut, Push, Request, + RequestId, Response, ResponseFinal, }, zenoh::RequestBody, }; @@ -77,8 +70,8 @@ pub struct FaceState { pub(crate) next_qid: RequestId, pub(crate) pending_queries: HashMap, CancellationToken)>, pub(crate) mcast_group: Option, - pub(crate) in_interceptors: Option>>, - pub(crate) eg_interceptors: Option>>, + pub(crate) in_interceptors: Option>, + pub(crate) eg_interceptors: Option>, pub(crate) hat: Box, pub(crate) task_controller: TaskController, pub(crate) is_local: bool, @@ -93,8 +86,8 @@ impl FaceState { #[cfg(feature = "stats")] stats: Option>, primitives: Arc, mcast_group: Option, - in_interceptors: Option>>, - eg_interceptors: Option>>, + in_interceptors: Option>, + eg_interceptors: Option>, hat: Box, is_local: bool, ) -> Arc { @@ -124,24 +117,24 @@ impl FaceState { #[inline] pub(crate) fn get_mapping( &self, - prefixid: &ExprId, + prefixid: ExprId, mapping: Mapping, ) -> Option<&std::sync::Arc> { match mapping { - Mapping::Sender => self.remote_mappings.get(prefixid), - Mapping::Receiver => self.local_mappings.get(prefixid), + Mapping::Sender => self.remote_mappings.get(&prefixid), + Mapping::Receiver => self.local_mappings.get(&prefixid), } } #[inline] pub(crate) fn get_sent_mapping( &self, - prefixid: &ExprId, + prefixid: ExprId, mapping: Mapping, ) -> Option<&std::sync::Arc> { match mapping { - Mapping::Sender => self.local_mappings.get(prefixid), - Mapping::Receiver => self.remote_mappings.get(prefixid), + Mapping::Sender => self.local_mappings.get(&prefixid), + Mapping::Receiver => self.remote_mappings.get(&prefixid), } } @@ -172,7 +165,7 @@ impl FaceState { iceptor: &InterceptorsChain, ctx: &mut RoutingContext>, ) -> bool { - // NOTE: the cache should be empty if the wire expr has no suffix, i.e. when the prefix + // NOTE: the cache should be empty if the wire expr has a suffix, i.e. when the prefix // doesn't represent a full keyexpr. let prefix = ctx.wire_expr().and_then(|we| { if we.has_suffix() { @@ -249,8 +242,6 @@ impl FaceState { InterceptorsChain::new(ingress.into_iter().flatten().collect::>(), version), InterceptorsChain::new(egress.into_iter().flatten().collect::>(), version), ); - let egress = Arc::new(egress); - mux.interceptor.store(egress.clone()); self.in_interceptors .as_ref() .expect("face in_interceptors should not be None when primitives are Mux") @@ -258,7 +249,7 @@ impl FaceState { self.eg_interceptors .as_ref() .expect("face eg_interceptors should not be None when primitives are Mux") - .store(egress.clone()); + .store(Arc::new(egress)); } else if let Some(mux) = self.primitives.as_any().downcast_ref::() { let interceptor = InterceptorsChain::new( factories @@ -283,6 +274,12 @@ impl FaceState { .store(interceptor.into()); } } + + pub(crate) fn reject_interest(&self, interest_id: u32) { + if let Some(interest) = self.pending_current_interests.get(&interest_id) { + interest.rejection_token.cancel(); + } + } } impl fmt::Display for FaceState { @@ -291,44 +288,62 @@ impl fmt::Display for FaceState { } } -#[derive(Clone, Debug)] -pub struct WeakFace { - pub(crate) tables: Weak, - pub(crate) state: Weak, -} - -impl WeakFace { - pub fn upgrade(&self) -> Option { - Some(Face { - tables: self.tables.upgrade()?, - state: self.state.upgrade()?, - }) - } -} - #[derive(Clone)] pub struct Face { pub(crate) tables: Arc, pub(crate) state: Arc, } -impl Face { - pub fn downgrade(&self) -> WeakFace { - WeakFace { - tables: Arc::downgrade(&self.tables), - state: Arc::downgrade(&self.state), - } - } +impl Primitives for Face { + fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); - pub(crate) fn reject_interest(&self, interest_id: u32) { - if let Some(interest) = self.state.pending_current_interests.get(&interest_id) { - interest.rejection_token.cancel(); + match &msg.wire_expr { + Some(we) => { + match tables + .get_mapping(&self.state, we.scope, we.mapping) + .cloned() + { + Some(prefix) => Some(prefix), + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + we.scope, + self, + ); + return; + } + } + } + None => None, + } + }; + + let msg = NetworkMessageMut { + body: NetworkBodyMut::Interest(msg), + reliability: Reliability::Reliable, // Interest is always reliable + #[cfg(feature = "stats")] + size: None, + }; + let ctx = match prefix { + Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), + None => &mut RoutingContext::new(msg), + }; + + if !self + .state + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) + { + return; + } } - } -} -impl Primitives for Face { - fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { let ctrl_lock = zlock!(self.tables.ctrl_lock); if msg.mode != InterestMode::Final { let mut declares = vec![]; @@ -340,11 +355,11 @@ impl Primitives for Face { msg.wire_expr.as_ref(), msg.mode, msg.options, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()); } } else { undeclare_interest( @@ -357,6 +372,55 @@ impl Primitives for Face { } fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match msg.wire_expr() { + Some(we) => { + match tables + .get_mapping(&self.state, we.scope, we.mapping) + .cloned() + { + Some(prefix) => Some(prefix), + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + we.scope, + self, + ); + return; + } + } + } + None => None, + } + }; + + let msg = NetworkMessageMut { + body: NetworkBodyMut::Declare(msg), + reliability: Reliability::Reliable, // Declare is always reliable + #[cfg(feature = "stats")] + size: None, + }; + + let ctx = match prefix { + Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), + None => &mut RoutingContext::new(msg), + }; + + if !self + .state + .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) + { + return; + } + } + let ctrl_lock = zlock!(self.tables.ctrl_lock); match &mut msg.body { zenoh_protocol::network::DeclareBody::DeclareKeyExpr(m) => { @@ -375,11 +439,11 @@ impl Primitives for Face { &m.wire_expr, &SubscriberInfo, msg.ext_nodeid.node_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()); } } zenoh_protocol::network::DeclareBody::UndeclareSubscriber(m) => { @@ -391,11 +455,11 @@ impl Primitives for Face { m.id, &m.ext_wire_expr.wire_expr, msg.ext_nodeid.node_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } zenoh_protocol::network::DeclareBody::DeclareQueryable(m) => { @@ -408,11 +472,11 @@ impl Primitives for Face { &m.wire_expr, &m.ext_info, msg.ext_nodeid.node_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } zenoh_protocol::network::DeclareBody::UndeclareQueryable(m) => { @@ -424,11 +488,11 @@ impl Primitives for Face { m.id, &m.ext_wire_expr.wire_expr, msg.ext_nodeid.node_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } zenoh_protocol::network::DeclareBody::DeclareToken(m) => { @@ -441,11 +505,11 @@ impl Primitives for Face { &m.wire_expr, msg.ext_nodeid.node_id, msg.interest_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } zenoh_protocol::network::DeclareBody::UndeclareToken(m) => { @@ -457,11 +521,11 @@ impl Primitives for Face { m.id, &m.ext_wire_expr, msg.ext_nodeid.node_id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } zenoh_protocol::network::DeclareBody::DeclareFinal(_) => { @@ -478,15 +542,15 @@ impl Primitives for Face { &mut wtables, &mut self.state.clone(), id, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); wtables.disable_all_routes(); drop(wtables); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } } @@ -495,30 +559,30 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match tables - .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { + let prefix = { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } } - } - }; + }; - if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Push(msg), @@ -550,7 +614,7 @@ impl Primitives for Face { .expect("reading Tables should not fail"); match tables - .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => prefix, @@ -608,7 +672,7 @@ impl Primitives for Face { .expect("reading Tables should not fail"); match tables - .get_mapping(&self.state, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => prefix, @@ -672,18 +736,18 @@ impl Primitives for Face { finalize_pending_queries(&self.tables, &mut state); let mut declares = vec![]; let ctrl_lock = zlock!(self.tables.ctrl_lock); - finalize_pending_interests(&self.tables, &mut state, &mut |p, m| { - declares.push((p.clone(), m)) + finalize_pending_interests(&self.tables, &mut state, &mut |p, m, r| { + declares.push((p.clone(), m, r)) }); ctrl_lock.close_face( &self.tables, &self.tables.clone(), &mut state, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), ); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()) } } @@ -699,6 +763,60 @@ impl fmt::Display for Face { } impl FaceState { + pub(crate) fn intercept_interest(&self, msg: &mut Interest, prefix: Option<&Arc>) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let interest_id = msg.id; + let msg = NetworkMessageMut { + body: NetworkBodyMut::Interest(msg), + reliability: Reliability::Reliable, // NOTE: Interest is always reliable + #[cfg(feature = "stats")] + size: None, + }; + + let ctx = match prefix { + Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), + None => &mut RoutingContext::new(msg), + }; + + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + // FIXME(fuzzypixelz): I don't understand this comment, there is no DeclareFinal being sent... + // NOTE: send declare final to avoid timeout on blocked interest + self.reject_interest(interest_id); + return; + } + } + + self.primitives.send_interest(RoutingContext::with_expr( + msg, + prefix.map(|res| res.expr().to_string()).unwrap_or_default(), + )); + } + + pub(crate) fn intercept_declare(&self, msg: &mut Declare, prefix: Option<&Arc>) { + if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Declare(msg), + reliability: Reliability::Reliable, // NOTE: Declare is always reliable + #[cfg(feature = "stats")] + size: None, + }; + + let ctx = match prefix { + Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), + None => &mut RoutingContext::new(msg), + }; + + if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + return; + } + } + + self.primitives.send_declare(RoutingContext::with_expr( + msg, + prefix.map(|res| res.expr().to_string()).unwrap_or_default(), + )); + } + pub(crate) fn intercept_push( &self, msg: &mut Push, @@ -729,7 +847,7 @@ impl FaceState { let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Request(msg), - reliability: Reliability::Reliable, + reliability: Reliability::Reliable, // NOTE: Request is always reliable #[cfg(feature = "stats")] size: None, }, @@ -757,7 +875,7 @@ impl FaceState { let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Response(msg), - reliability: Reliability::Reliable, // NOTE: queries are always reliable + reliability: Reliability::Reliable, // NOTE: Response is always reliable #[cfg(feature = "stats")] size: None, }, @@ -776,7 +894,7 @@ impl FaceState { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::ResponseFinal(msg), - reliability: Reliability::Reliable, // NOTE: queries are always reliable + reliability: Reliability::Reliable, // NOTE: ResponseFinal is always reliable #[cfg(feature = "stats")] size: None, }); diff --git a/zenoh/src/net/routing/dispatcher/interests.rs b/zenoh/src/net/routing/dispatcher/interests.rs index 9511c1d82a..e6fe641a81 100644 --- a/zenoh/src/net/routing/dispatcher/interests.rs +++ b/zenoh/src/net/routing/dispatcher/interests.rs @@ -39,7 +39,6 @@ use super::{ use crate::net::routing::{ hat::{HatTrait, SendDeclare}, router::{unregister_expr_interest, Resource}, - RoutingContext, }; pub(crate) struct CurrentInterest { @@ -116,14 +115,15 @@ pub(crate) fn finalize_pending_interest( interest.src_interest_id ); send_declare( - &interest.src_face.primitives, - RoutingContext::new(Declare { + &interest.src_face, + Declare { interest_id: Some(interest.src_interest_id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } @@ -181,7 +181,9 @@ impl CurrentInterestCleanup { self.interests_timeout, ); } - finalize_pending_interest(interest, &mut |p, m| m.with_mut(|m| p.send_declare(m))); + finalize_pending_interest(interest, &mut |p, mut m, r| { + p.intercept_declare(&mut m, r.as_ref()) + }); } } } @@ -211,10 +213,7 @@ pub(crate) fn declare_interest( if let Some(expr) = expr { let rtables = zread!(tables_ref.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => { tracing::debug!( "{} Declare interest {} ({}{})", diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 09ab1749e1..0419558b0d 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -51,10 +51,7 @@ pub(crate) fn declare_subscription( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => { tracing::debug!( "{} Declare subscriber {} ({}{})", @@ -119,7 +116,7 @@ pub(crate) fn undeclare_subscription( None } else { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, &expr.scope, expr.mapping) { + match rtables.get_mapping(face, expr.scope, expr.mapping) { Some(prefix) => match Resource::get_resource(prefix, expr.suffix.as_ref()) { Some(res) => Some(res), None => { @@ -287,7 +284,7 @@ pub fn route_data( ) { let tables = zread!(tables_ref.tables); match tables - .get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_mapping(face, msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => { @@ -340,7 +337,7 @@ pub fn route_data( match tables .get_sent_mapping( outface, - &msg.wire_expr.scope, + msg.wire_expr.scope, msg.wire_expr.mapping, ) .cloned() @@ -395,7 +392,7 @@ pub fn route_data( match tables .get_sent_mapping( &outface, - &msg.wire_expr.scope, + msg.wire_expr.scope, msg.wire_expr.mapping, ) .cloned() diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index 2932e21c6a..31c732615c 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -75,10 +75,7 @@ pub(crate) fn declare_queryable( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => { tracing::debug!( "{} Declare queryable {} ({}{})", @@ -143,7 +140,7 @@ pub(crate) fn undeclare_queryable( None } else { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, &expr.scope, expr.mapping) { + match rtables.get_mapping(face, expr.scope, expr.mapping) { Some(prefix) => match Resource::get_resource(prefix, expr.suffix.as_ref()) { Some(res) => Some(res), None => { @@ -450,7 +447,7 @@ macro_rules! inc_res_stats { #[allow(clippy::too_many_arguments)] pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mut Request) { let rtables = zread!(tables_ref.tables); - match rtables.get_mapping(face, &msg.wire_expr.scope, msg.wire_expr.mapping) { + match rtables.get_mapping(face, msg.wire_expr.scope, msg.wire_expr.mapping) { Some(prefix) => { tracing::debug!( "{}:{} Route query for resource {}{}", @@ -541,7 +538,7 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu match tables .get_sent_mapping( outface, - &msg.wire_expr.scope, + msg.wire_expr.scope, msg.wire_expr.mapping, ) .cloned() @@ -630,7 +627,7 @@ pub(crate) fn route_send_response( .read() .expect("reading Tables should not fail"); match tables - .get_sent_mapping(&query.src_face, &msg.wire_expr.scope, msg.wire_expr.mapping) + .get_sent_mapping(&query.src_face, msg.wire_expr.scope, msg.wire_expr.mapping) .cloned() { Some(prefix) => prefix, diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index 37caacb743..92c2b3073a 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -41,7 +41,6 @@ use super::{ use crate::net::routing::{ interceptor::{InterceptorTrait, InterceptorsChain}, router::{disable_matches_data_routes, disable_matches_query_routes}, - RoutingContext, }; pub(crate) type NodeId = u16; @@ -539,7 +538,7 @@ impl Resource { get_mut_unchecked(face) .local_mappings .insert(expr_id, nonwild_prefix.clone()); - face.primitives.send_declare(RoutingContext::with_expr( + face.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -550,8 +549,8 @@ impl Resource { wire_expr: nonwild_prefix.expr().to_string().into(), }), }, - nonwild_prefix.expr().to_string(), - )); + Some(&nonwild_prefix), + ); face.update_interceptors_caches(&mut nonwild_prefix); WireExpr { scope: expr_id, @@ -759,22 +758,6 @@ impl Resource { } } - pub(crate) fn get_ingress_cache( - &self, - face: &FaceState, - interceptor: &InterceptorsChain, - ) -> Option { - self.interceptor_cache(face, interceptor, InterceptorFlow::Ingress) - } - - pub(crate) fn get_egress_cache( - &self, - face: &FaceState, - interceptor: &InterceptorsChain, - ) -> Option { - self.interceptor_cache(face, interceptor, InterceptorFlow::Egress) - } - pub(crate) fn interceptor_cache( &self, face: &FaceState, @@ -798,10 +781,7 @@ pub(crate) fn register_expr( expr: &WireExpr, ) { let rtables = zread!(tables.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => match face.remote_mappings.get(&expr_id) { Some(res) => { let mut fullexpr = prefix.expr().to_string(); @@ -879,10 +859,7 @@ pub(crate) fn register_expr_interest( ) { if let Some(expr) = expr { let rtables = zread!(tables.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => { let res = Resource::get_resource(&prefix, &expr.suffix); let (res, wtables) = if res.as_ref().map(|r| r.context.is_some()).unwrap_or(false) { diff --git a/zenoh/src/net/routing/dispatcher/tables.rs b/zenoh/src/net/routing/dispatcher/tables.rs index a3ab28c4b8..af68e1deec 100644 --- a/zenoh/src/net/routing/dispatcher/tables.rs +++ b/zenoh/src/net/routing/dispatcher/tables.rs @@ -136,7 +136,7 @@ impl Tables { pub(crate) fn get_mapping<'a>( &'a self, face: &'a FaceState, - expr_id: &ExprId, + expr_id: ExprId, mapping: Mapping, ) -> Option<&'a Arc> { match expr_id { @@ -149,7 +149,7 @@ impl Tables { pub(crate) fn get_sent_mapping<'a>( &'a self, face: &'a FaceState, - expr_id: &ExprId, + expr_id: ExprId, mapping: Mapping, ) -> Option<&'a Arc> { match expr_id { diff --git a/zenoh/src/net/routing/dispatcher/token.rs b/zenoh/src/net/routing/dispatcher/token.rs index 23625ff8ef..0bd9cf60a5 100644 --- a/zenoh/src/net/routing/dispatcher/token.rs +++ b/zenoh/src/net/routing/dispatcher/token.rs @@ -44,10 +44,7 @@ pub(crate) fn declare_token( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables - .get_mapping(face, &expr.scope, expr.mapping) - .cloned() - { + match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { Some(mut prefix) => { tracing::debug!( "{} Declare token {} ({}{})", @@ -111,7 +108,7 @@ pub(crate) fn undeclare_token( } else { let rtables = zread!(tables.tables); match rtables - .get_mapping(face, &expr.wire_expr.scope, expr.wire_expr.mapping) + .get_mapping(face, expr.wire_expr.scope, expr.wire_expr.mapping) .cloned() { Some(mut prefix) => { diff --git a/zenoh/src/net/routing/hat/client/interests.rs b/zenoh/src/net/routing/hat/client/interests.rs index 3256278469..d93208a368 100644 --- a/zenoh/src/net/routing/hat/client/interests.rs +++ b/zenoh/src/net/routing/hat/client/interests.rs @@ -34,7 +34,6 @@ use crate::net::routing::{ tables::{Tables, TablesLock}, }, hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, - RoutingContext, }; pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) { @@ -58,7 +57,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) }, ); let wire_expr = res.as_ref().map(|res| Resource::decl_key(res, face, true)); - face.primitives.send_interest(RoutingContext::with_expr( + face.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -68,10 +67,8 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - res.as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + res.as_ref(), + ); } } } @@ -151,7 +148,7 @@ impl HatInterestTrait for HatCode { let wire_expr = res .as_ref() .map(|res| Resource::decl_key(res, dst_face, true)); - dst_face.primitives.send_interest(RoutingContext::with_expr( + dst_face.intercept_interest( &mut Interest { id, mode, @@ -161,10 +158,8 @@ impl HatInterestTrait for HatCode { ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - res.as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + res.as_deref(), + ); } if mode.current() { @@ -176,26 +171,28 @@ impl HatInterestTrait for HatCode { interest.src_interest_id ); send_declare( - &interest.src_face.primitives, - RoutingContext::new(Declare { + &interest.src_face, + Declare { interest_id: Some(interest.src_interest_id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } else { send_declare( - &face.primitives, - RoutingContext::new(Declare { + face, + Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } @@ -225,7 +222,7 @@ impl HatInterestTrait for HatCode { if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.primitives.send_interest(RoutingContext::with_expr( + dst_face.intercept_interest( &mut Interest { id, mode: InterestMode::Final, @@ -237,12 +234,8 @@ impl HatInterestTrait for HatCode { ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - local_interest - .res - .as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + local_interest.res.as_ref(), + ); get_mut_unchecked(dst_face).local_interests.remove(&id); } } diff --git a/zenoh/src/net/routing/hat/client/pubsub.rs b/zenoh/src/net/routing/hat/client/pubsub.rs index 8e1a6a43a7..c43d4daeb8 100644 --- a/zenoh/src/net/routing/hat/client/pubsub.rs +++ b/zenoh/src/net/routing/hat/client/pubsub.rs @@ -37,7 +37,6 @@ use crate::{ tables::{Route, RoutingExpr, Tables}, }, hat::{HatPubSubTrait, SendDeclare, Sources}, - RoutingContext, }, }; @@ -58,20 +57,18 @@ fn propagate_simple_subscription_to( face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -163,20 +160,18 @@ fn propagate_forget_simple_subscription( for face in tables.faces.values_mut() { if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -201,20 +196,18 @@ pub(super) fn undeclare_simple_subscription( let face = &mut simple_subs[0]; if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/client/queries.rs b/zenoh/src/net/routing/hat/client/queries.rs index 855207cd53..3fd135aed9 100644 --- a/zenoh/src/net/routing/hat/client/queries.rs +++ b/zenoh/src/net/routing/hat/client/queries.rs @@ -42,7 +42,6 @@ use crate::{ tables::{QueryTargetQabl, QueryTargetQablSet, RoutingExpr, Tables}, }, hat::{HatQueriesTrait, SendDeclare, Sources}, - RoutingContext, }, }; @@ -107,21 +106,19 @@ fn propagate_simple_queryable( .insert(res.clone(), (id, info)); let key_expr = Resource::decl_key(res, &mut dst_face, true); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(res.clone()), ); } } @@ -181,20 +178,18 @@ fn propagate_forget_simple_queryable( for face in tables.faces.values_mut() { if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -225,20 +220,18 @@ pub(super) fn undeclare_simple_queryable( let face = &mut simple_qabls[0]; if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/client/token.rs b/zenoh/src/net/routing/hat/client/token.rs index 613f7af94d..7c629aae92 100644 --- a/zenoh/src/net/routing/hat/client/token.rs +++ b/zenoh/src/net/routing/hat/client/token.rs @@ -12,7 +12,10 @@ // ZettaScale Zenoh Team, // -use std::sync::{atomic::Ordering, Arc}; +use std::{ + ops::Deref, + sync::{atomic::Ordering, Arc}, +}; use zenoh_config::WhatAmI; use zenoh_protocol::network::{ @@ -28,7 +31,6 @@ use crate::net::routing::{ dispatcher::{face::FaceState, tables::Tables}, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, - RoutingContext, }; #[inline] @@ -47,20 +49,18 @@ fn propagate_simple_token_to( face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -128,17 +128,15 @@ fn declare_simple_token( let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); send_declare( - &interest.src_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: Some(interest.src_interest_id), - ext_qos: ext::QoSType::default(), - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + &interest.src_face, + Declare { + interest_id: Some(interest.src_interest_id), + ext_qos: ext::QoSType::default(), + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.clone()), ); return; } else if !face.local_interests.contains_key(&interest_id) { @@ -177,20 +175,18 @@ fn propagate_forget_simple_token( for face in tables.faces.values_mut() { if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } else if face_hat!(face) .remote_interests @@ -200,22 +196,20 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), - ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), - }, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + ext_wire_expr: WireExprType { + wire_expr: Resource::get_best_key(res, "", face.id), + }, + }), + }, + Some(res.clone()), ); } } @@ -245,20 +239,18 @@ pub(super) fn undeclare_simple_token( if face.whatami != WhatAmI::Client { if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -338,17 +330,15 @@ pub(crate) fn declare_token_interest( let id = make_token_id(res, face, mode); let wire_expr = Resource::decl_key(res, face, true); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.deref().clone()), ); } } else { @@ -364,20 +354,15 @@ pub(crate) fn declare_token_interest( let id = make_token_id(token, face, mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::default(), - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::default(), + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.deref().clone()), ) } } @@ -395,17 +380,15 @@ pub(crate) fn declare_token_interest( let id = make_token_id(token, face, mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs index c97fc1960f..b13a867072 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs @@ -11,7 +11,7 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::sync::Arc; +use std::{ops::Deref, sync::Arc}; use zenoh_protocol::network::{ declare::ext, @@ -32,7 +32,6 @@ use crate::net::routing::{ tables::{Tables, TablesLock}, }, hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, - RoutingContext, }; impl HatInterestTrait for HatCode { @@ -84,7 +83,7 @@ impl HatInterestTrait for HatCode { face_hat_mut!(face).remote_interests.insert( id, RemoteInterest { - res: res.cloned(), + res: res.as_ref().map(|res| res.deref().clone()), options, mode, }, @@ -92,14 +91,15 @@ impl HatInterestTrait for HatCode { } if mode.current() { send_declare( - &face.primitives, - RoutingContext::new(Declare { + face, + Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs index 74bd7e1933..5f1258ae3c 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::{HashMap, HashSet}, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -46,7 +47,6 @@ use crate::net::routing::{ }, hat::{CurrentFutureTrait, HatPubSubTrait, SendDeclare, Sources}, router::disable_matches_data_routes, - RoutingContext, }; #[inline] @@ -70,7 +70,7 @@ fn send_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(&someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -83,8 +83,8 @@ fn send_sourced_subscription_to_net_children( wire_expr: key_expr, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -111,20 +111,18 @@ fn propagate_simple_subscription_to( face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } else { let matching_interests = face_hat!(dst_face) @@ -151,20 +149,18 @@ fn propagate_simple_subscription_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -358,7 +354,7 @@ fn send_forget_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(&someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -371,8 +367,8 @@ fn send_forget_sourced_subscription_to_net_children( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -389,20 +385,18 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -419,20 +413,18 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -545,20 +537,18 @@ pub(super) fn undeclare_simple_subscription( if face.whatami != WhatAmI::Client { if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -576,22 +566,18 @@ pub(super) fn undeclare_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber( - UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }, - ), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -709,20 +695,18 @@ pub(super) fn declare_sub_interest( let id = make_sub_id(res, face, mode); let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -735,20 +719,18 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } @@ -761,20 +743,18 @@ pub(super) fn declare_sub_interest( let id = make_sub_id(sub, face, mode); let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs index 367c6ecce0..bf48c7cf4c 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::HashMap, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -50,7 +51,6 @@ use crate::net::routing::{ }, hat::{CurrentFutureTrait, HatQueriesTrait, SendDeclare, Sources}, router::disable_matches_query_routes, - RoutingContext, }; #[inline] @@ -141,7 +141,7 @@ fn send_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(&someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -155,8 +155,8 @@ fn send_sourced_queryable_to_net_children( ext_info: *qabl_info, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -195,21 +195,19 @@ fn propagate_simple_queryable( let push_declaration = push_declaration_profile(&dst_face); let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(res.clone()), ); } } @@ -374,7 +372,7 @@ fn send_forget_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(&someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -387,8 +385,8 @@ fn send_forget_sourced_queryable_to_net_children( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -405,20 +403,18 @@ fn propagate_forget_simple_queryable( for mut face in tables.faces.values().cloned() { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(&mut face) @@ -436,20 +432,18 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -568,20 +562,18 @@ pub(super) fn undeclare_simple_queryable( let mut face = &mut simple_qabls[0]; if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -599,20 +591,18 @@ pub(super) fn undeclare_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -781,21 +771,19 @@ pub(super) fn declare_qabl_interest( let id = make_qabl_id(res, face, mode, info); let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr, + ext_info: info, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -810,21 +798,19 @@ pub(super) fn declare_qabl_interest( let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } @@ -838,21 +824,19 @@ pub(super) fn declare_qabl_interest( let id = make_qabl_id(qabl, face, mode, info); let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/token.rs b/zenoh/src/net/routing/hat/linkstate_peer/token.rs index 853a711ece..f55d59f5fe 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/token.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/token.rs @@ -12,7 +12,10 @@ // ZettaScale Zenoh Team, // -use std::sync::{atomic::Ordering, Arc}; +use std::{ + ops::Deref, + sync::{atomic::Ordering, Arc}, +}; use petgraph::graph::NodeIndex; use zenoh_protocol::{ @@ -34,7 +37,6 @@ use crate::net::routing::{ dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, - RoutingContext, }; #[inline] @@ -57,7 +59,7 @@ fn send_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(&someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -70,8 +72,8 @@ fn send_sourced_token_to_net_clildren( wire_expr: key_expr, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -97,20 +99,18 @@ fn propagate_simple_token_to( face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } else { let matching_interests = face_hat!(dst_face) @@ -137,20 +137,18 @@ fn propagate_simple_token_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -330,7 +328,7 @@ fn send_forget_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(&someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -343,8 +341,8 @@ fn send_forget_sourced_token_to_net_clildren( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -361,20 +359,18 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -392,20 +388,18 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -516,20 +510,18 @@ pub(super) fn undeclare_simple_token( if face.whatami != WhatAmI::Client { if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -547,20 +539,18 @@ pub(super) fn undeclare_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -675,17 +665,15 @@ pub(crate) fn declare_token_interest( let id = make_token_id(res, face, mode); let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.deref().clone()), ); } } else { @@ -699,17 +687,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } @@ -723,17 +709,15 @@ pub(crate) fn declare_token_interest( let id = make_token_id(token, face, mode); let wire_expr = Resource::decl_key(token, face, push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/mod.rs b/zenoh/src/net/routing/hat/mod.rs index 00f74721d6..34488baf5e 100644 --- a/zenoh/src/net/routing/hat/mod.rs +++ b/zenoh/src/net/routing/hat/mod.rs @@ -33,13 +33,10 @@ use zenoh_transport::unicast::TransportUnicast; #[cfg(feature = "unstable")] use {crate::key_expr::KeyExpr, std::collections::HashMap}; -use super::{ - dispatcher::{ - face::{Face, FaceState}, - pubsub::SubscriberInfo, - tables::{NodeId, QueryTargetQablSet, Resource, Route, RoutingExpr, Tables, TablesLock}, - }, - RoutingContext, +use super::dispatcher::{ + face::{Face, FaceState}, + pubsub::SubscriberInfo, + tables::{NodeId, QueryTargetQablSet, Resource, Route, RoutingExpr, Tables, TablesLock}, }; use crate::net::runtime::Runtime; @@ -69,8 +66,7 @@ impl Sources { } } -pub(crate) type SendDeclare<'a> = dyn FnMut(&Arc, RoutingContext) - + 'a; +pub(crate) type SendDeclare<'a> = dyn FnMut(&Arc, Declare, Option>) + 'a; pub(crate) trait HatTrait: HatBaseTrait + HatInterestTrait + HatPubSubTrait + HatQueriesTrait + HatTokenTrait { diff --git a/zenoh/src/net/routing/hat/p2p_peer/interests.rs b/zenoh/src/net/routing/hat/p2p_peer/interests.rs index adb3ea683a..85f9de6b65 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/interests.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/interests.rs @@ -38,7 +38,6 @@ use crate::net::routing::{ tables::{Tables, TablesLock}, }, hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, - RoutingContext, }; pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) { @@ -65,7 +64,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) let wire_expr = res.as_ref().map(|res| { Resource::decl_key(res, face, super::push_declaration_profile(face)) }); - face.primitives.send_interest(RoutingContext::with_expr( + face.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -75,10 +74,8 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - res.as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + res.as_ref(), + ); } } } @@ -189,7 +186,7 @@ impl HatInterestTrait for HatCode { let wire_expr = res.as_ref().map(|res| { Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)) }); - dst_face.primitives.send_interest(RoutingContext::with_expr( + dst_face.intercept_interest( &mut Interest { id, mode: propagated_mode, @@ -199,10 +196,8 @@ impl HatInterestTrait for HatCode { ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - res.as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + res.as_deref(), + ); } } @@ -214,14 +209,15 @@ impl HatInterestTrait for HatCode { interest.src_interest_id ); send_declare( - &interest.src_face.primitives, - RoutingContext::new(Declare { + &interest.src_face, + Declare { interest_id: Some(interest.src_interest_id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } @@ -251,7 +247,7 @@ impl HatInterestTrait for HatCode { if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.primitives.send_interest(RoutingContext::with_expr( + dst_face.intercept_interest( &mut Interest { id, mode: InterestMode::Final, @@ -263,12 +259,8 @@ impl HatInterestTrait for HatCode { ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, }, - local_interest - .res - .as_ref() - .map(|res| res.expr().to_string()) - .unwrap_or_default(), - )); + local_interest.res.as_ref(), + ); get_mut_unchecked(dst_face).local_interests.remove(&id); } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/mod.rs b/zenoh/src/net/routing/hat/p2p_peer/mod.rs index 03b9455270..44cc3a3500 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/mod.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/mod.rs @@ -59,12 +59,9 @@ use super::{ use crate::net::{ codec::Zenoh080Routing, protocol::linkstate::LinkStateList, - routing::{ - dispatcher::{ - face::{Face, InterestState}, - interests::RemoteInterest, - }, - RoutingContext, + routing::dispatcher::{ + face::{Face, InterestState}, + interests::RemoteInterest, }, runtime::Runtime, }; @@ -206,14 +203,15 @@ impl HatBaseTrait for HatCode { if face.state.whatami == WhatAmI::Peer { send_declare( - &face.state.primitives, - RoutingContext::new(Declare { + &face.state, + Declare { interest_id: Some(0), ext_qos: QoSType::default(), ext_tstamp: None, ext_nodeid: NodeIdType::default(), body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } Ok(()) diff --git a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs index 8a84906c3c..f9e24e9aa5 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::HashMap, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -43,7 +44,6 @@ use crate::{ hat::{ p2p_peer::initial_interest, CurrentFutureTrait, HatPubSubTrait, SendDeclare, Sources, }, - RoutingContext, }, }; @@ -66,20 +66,18 @@ fn propagate_simple_subscription_to( let key_expr = Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } else { let matching_interests = face_hat!(dst_face) @@ -109,20 +107,18 @@ fn propagate_simple_subscription_to( super::push_declaration_profile(dst_face), ); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -199,21 +195,19 @@ fn declare_simple_subscription( if face.whatami == WhatAmI::Client { for mcast_group in &tables.mcast_groups { if mcast_group.mcast_group != face.mcast_group { - mcast_group - .primitives - .send_declare(RoutingContext::with_expr( - &mut Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id: 0, // @TODO use proper SubscriberId - wire_expr: res.expr().to_string().into(), - }), - }, - res.expr().to_string(), - )) + mcast_group.intercept_declare( + &mut Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id: 0, // @TODO use proper SubscriberId + wire_expr: res.expr().to_string().into(), + }), + }, + Some(res), + ) } } } @@ -248,20 +242,18 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -276,20 +268,18 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -317,20 +307,18 @@ pub(super) fn undeclare_simple_subscription( let mut face = &mut simple_subs[0]; if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -345,20 +333,18 @@ pub(super) fn undeclare_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -447,20 +433,18 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -480,19 +464,18 @@ pub(super) fn declare_sub_interest( super::push_declaration_profile(face), ); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber( - DeclareSubscriber { id, wire_expr }, - ), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } @@ -512,20 +495,18 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, super::push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/queries.rs b/zenoh/src/net/routing/hat/p2p_peer/queries.rs index 0119cfdaf8..ff50a3a9b2 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/queries.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/queries.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::HashMap, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -47,7 +48,6 @@ use crate::{ hat::{ p2p_peer::initial_interest, CurrentFutureTrait, HatQueriesTrait, SendDeclare, Sources, }, - RoutingContext, }, }; @@ -117,21 +117,19 @@ fn propagate_simple_queryable_to( .insert(res.clone(), (id, info)); let key_expr = Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(res.clone()), ); } } @@ -213,20 +211,18 @@ fn propagate_forget_simple_queryable( for face in tables.faces.values_mut() { if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -241,20 +237,18 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res), ); } } @@ -287,20 +281,18 @@ pub(super) fn undeclare_simple_queryable( let mut face = &mut simple_qabls[0]; if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -315,20 +307,18 @@ pub(super) fn undeclare_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res), ); } } @@ -427,21 +417,19 @@ pub(super) fn declare_qabl_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr, + ext_info: info, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -462,21 +450,19 @@ pub(super) fn declare_qabl_interest( super::push_declaration_profile(face), ); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } @@ -501,21 +487,19 @@ pub(super) fn declare_qabl_interest( super::push_declaration_profile(face), ); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/token.rs b/zenoh/src/net/routing/hat/p2p_peer/token.rs index d4dd1cfdc4..f7bbf06b60 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/token.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/token.rs @@ -12,7 +12,10 @@ // ZettaScale Zenoh Team, // -use std::sync::{atomic::Ordering, Arc}; +use std::{ + ops::Deref, + sync::{atomic::Ordering, Arc}, +}; use zenoh_config::WhatAmI; use zenoh_protocol::network::{ @@ -28,7 +31,6 @@ use crate::net::routing::{ dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, - RoutingContext, }; fn new_token( @@ -68,20 +70,18 @@ fn propagate_simple_token_to( let key_expr = Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: dst_interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: dst_interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } else { let matching_interests = face_hat!(dst_face) @@ -115,20 +115,18 @@ fn propagate_simple_token_to( super::push_declaration_profile(dst_face), ); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: dst_interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: dst_interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -208,17 +206,15 @@ fn declare_simple_token( let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); send_declare( - &interest.src_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: Some(interest.src_interest_id), - ext_qos: ext::QoSType::default(), - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + &interest.src_face, + Declare { + interest_id: Some(interest.src_interest_id), + ext_qos: ext::QoSType::default(), + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.clone()), ); return; } else if !face.local_interests.contains_key(&interest_id) { @@ -265,20 +261,18 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } else if src_face.id != face.id && face_hat!(face) @@ -289,22 +283,20 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), - ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), - }, - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + ext_wire_expr: WireExprType { + wire_expr: Resource::get_best_key(res, "", face.id), + }, + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -319,20 +311,18 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } else if face_hat!(face) .remote_interests @@ -342,22 +332,20 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), - ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(&res, "", face.id), - }, - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + ext_wire_expr: WireExprType { + wire_expr: Resource::get_best_key(&res, "", face.id), + }, + }), + }, + Some(res.clone()), ); } } @@ -390,20 +378,18 @@ pub(super) fn undeclare_simple_token( if face.whatami != WhatAmI::Client { if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -419,20 +405,18 @@ pub(super) fn undeclare_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -525,17 +509,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.deref().clone()), ); } } else { @@ -555,20 +537,15 @@ pub(crate) fn declare_token_interest( super::push_declaration_profile(face), ); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr, - }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } @@ -587,17 +564,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, super::push_declaration_profile(face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/router/interests.rs b/zenoh/src/net/routing/hat/router/interests.rs index 4e8ee3c7f3..ceb5c03dd9 100644 --- a/zenoh/src/net/routing/hat/router/interests.rs +++ b/zenoh/src/net/routing/hat/router/interests.rs @@ -35,7 +35,6 @@ use crate::net::routing::{ tables::{Tables, TablesLock}, }, hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, - RoutingContext, }; impl HatInterestTrait for HatCode { @@ -102,14 +101,15 @@ impl HatInterestTrait for HatCode { } if mode.current() { send_declare( - &face.primitives, - RoutingContext::new(Declare { + face, + Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::DeclareFinal(DeclareFinal), - }), + }, + None, ); } } diff --git a/zenoh/src/net/routing/hat/router/pubsub.rs b/zenoh/src/net/routing/hat/router/pubsub.rs index d6da037c5c..e841f0630e 100644 --- a/zenoh/src/net/routing/hat/router/pubsub.rs +++ b/zenoh/src/net/routing/hat/router/pubsub.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::{HashMap, HashSet}, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -46,7 +47,6 @@ use crate::net::routing::{ }, hat::{CurrentFutureTrait, HatPubSubTrait, SendDeclare, Sources}, router::disable_matches_data_routes, - RoutingContext, }; #[inline] @@ -70,7 +70,7 @@ fn send_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(tables, &someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -83,8 +83,8 @@ fn send_sourced_subscription_to_net_children( wire_expr: key_expr, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -138,20 +138,18 @@ fn propagate_simple_subscription_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(tables, dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -393,7 +391,7 @@ fn send_forget_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(tables, &someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -406,8 +404,8 @@ fn send_forget_sourced_subscription_to_net_children( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -424,20 +422,18 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(&mut face) @@ -456,20 +452,18 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -504,20 +498,18 @@ fn propagate_forget_simple_subscription_to_peers( { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -670,20 +662,18 @@ pub(super) fn undeclare_simple_subscription( let mut face = &mut simple_subs[0]; if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -702,20 +692,18 @@ pub(super) fn undeclare_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -867,20 +855,18 @@ pub(super) fn pubsub_linkstate_change( if let Some(id) = face_hat_mut!(&mut src_face).local_subs.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.id); send_declare( - &src_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { - id, - ext_wire_expr: WireExprType { wire_expr }, - }), - }, - res.expr().to_string(), - ), + &src_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::UndeclareSubscriber(UndeclareSubscriber { + id, + ext_wire_expr: WireExprType { wire_expr }, + }), + }, + Some(res.clone()), ); } } @@ -898,20 +884,18 @@ pub(super) fn pubsub_linkstate_change( let push_declaration = push_declaration_profile(tables, &dst_face); let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -960,20 +944,18 @@ pub(crate) fn declare_sub_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -999,20 +981,18 @@ pub(crate) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } @@ -1036,20 +1016,18 @@ pub(crate) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareSubscriber(DeclareSubscriber { - id, - wire_expr, - }), - }, - sub.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareSubscriber(DeclareSubscriber { + id, + wire_expr, + }), + }, + Some(sub.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/router/queries.rs b/zenoh/src/net/routing/hat/router/queries.rs index 6b0a6f284b..1a1ebacb69 100644 --- a/zenoh/src/net/routing/hat/router/queries.rs +++ b/zenoh/src/net/routing/hat/router/queries.rs @@ -14,6 +14,7 @@ use std::{ borrow::Cow, collections::HashMap, + ops::Deref, sync::{atomic::Ordering, Arc}, }; @@ -50,7 +51,6 @@ use crate::net::routing::{ }, hat::{CurrentFutureTrait, HatQueriesTrait, SendDeclare, Sources}, router::disable_matches_query_routes, - RoutingContext, }; #[inline] @@ -209,7 +209,7 @@ fn send_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(tables, &someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -223,8 +223,8 @@ fn send_sourced_queryable_to_net_children( ext_info: *qabl_info, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -276,21 +276,19 @@ fn propagate_simple_queryable( let push_declaration = push_declaration_profile(tables, &dst_face); let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(res.clone()), ); } } @@ -520,7 +518,7 @@ fn send_forget_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(tables, &someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -533,8 +531,8 @@ fn send_forget_sourced_queryable_to_net_children( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -551,20 +549,18 @@ fn propagate_forget_simple_queryable( for mut face in tables.faces.values().cloned() { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(&mut face) @@ -583,20 +579,18 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -631,20 +625,18 @@ fn propagate_forget_simple_queryable_to_peers( { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -810,20 +802,18 @@ pub(super) fn undeclare_simple_queryable( let mut face = &mut simple_qabls[0]; if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -842,20 +832,18 @@ pub(super) fn undeclare_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -973,20 +961,18 @@ pub(super) fn queries_linkstate_change( if let Some((id, _)) = face_hat_mut!(&mut src_face).local_qabls.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.id); send_declare( - &src_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::UndeclareQueryable(UndeclareQueryable { - id, - ext_wire_expr: WireExprType { wire_expr }, - }), - }, - res.expr().to_string(), - ), + &src_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::UndeclareQueryable(UndeclareQueryable { + id, + ext_wire_expr: WireExprType { wire_expr }, + }), + }, + Some(res.clone()), ); } } @@ -1005,21 +991,19 @@ pub(super) fn queries_linkstate_change( let push_declaration = push_declaration_profile(tables, &dst_face); let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(res.clone()), ); } } @@ -1177,21 +1161,19 @@ pub(crate) fn declare_qabl_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr, - ext_info: info, - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr, + ext_info: info, + }), + }, + Some(res.deref().clone()), ); } } else { @@ -1215,21 +1197,19 @@ pub(crate) fn declare_qabl_interest( let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } @@ -1246,21 +1226,19 @@ pub(crate) fn declare_qabl_interest( let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareQueryable(DeclareQueryable { - id, - wire_expr: key_expr, - ext_info: info, - }), - }, - qabl.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareQueryable(DeclareQueryable { + id, + wire_expr: key_expr, + ext_info: info, + }), + }, + Some(qabl.clone()), ); } } diff --git a/zenoh/src/net/routing/hat/router/token.rs b/zenoh/src/net/routing/hat/router/token.rs index 172e1c0e6c..52862ed7a0 100644 --- a/zenoh/src/net/routing/hat/router/token.rs +++ b/zenoh/src/net/routing/hat/router/token.rs @@ -12,7 +12,10 @@ // ZettaScale Zenoh Team, // -use std::sync::{atomic::Ordering, Arc}; +use std::{ + ops::Deref, + sync::{atomic::Ordering, Arc}, +}; use petgraph::graph::NodeIndex; use zenoh_protocol::{ @@ -34,7 +37,6 @@ use crate::net::routing::{ dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, - RoutingContext, }; #[inline] @@ -57,7 +59,7 @@ fn send_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(tables, &someface); let key_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -70,8 +72,8 @@ fn send_sourced_token_to_net_clildren( wire_expr: key_expr, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -124,20 +126,18 @@ fn propagate_simple_token_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(tables, dst_face)); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -368,7 +368,7 @@ fn send_forget_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(tables, &someface); let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); - someface.primitives.send_declare(RoutingContext::with_expr( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -381,8 +381,8 @@ fn send_forget_sourced_token_to_net_clildren( ext_wire_expr: WireExprType { wire_expr }, }), }, - res.expr().to_string(), - )); + Some(res), + ); } } None => tracing::trace!("Unable to find face for zid {}", net.graph[*child].zid), @@ -400,20 +400,18 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); // NOTE(fuzzypixelz): We need to check that `face` is not the source Face of the token // undeclaration, otherwise the undeclaration would be duplicated at the source Face. In @@ -432,22 +430,20 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), - ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), - }, - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + ext_wire_expr: WireExprType { + wire_expr: Resource::get_best_key(res, "", face.id), + }, + }), + }, + Some(res.clone()), ); } for res in face_hat!(&mut face) @@ -466,20 +462,18 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } else if face_hat!(face) .remote_interests @@ -494,22 +488,20 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), - ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(&res, "", face.id), - }, - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + ext_wire_expr: WireExprType { + wire_expr: Resource::get_best_key(&res, "", face.id), + }, + }), + }, + Some(res.clone()), ); } } @@ -544,20 +536,18 @@ fn propagate_forget_simple_token_to_peers( { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + &face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -722,20 +712,18 @@ pub(super) fn undeclare_simple_token( if face.whatami != WhatAmI::Client { if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } for res in face_hat!(face) @@ -754,20 +742,18 @@ pub(super) fn undeclare_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType::null(), - }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType::null(), + }), + }, + Some(res.clone()), ); } } @@ -914,20 +900,18 @@ pub(super) fn token_linkstate_change( if let Some(id) = face_hat_mut!(&mut src_face).local_tokens.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.id); send_declare( - &src_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::UndeclareToken(UndeclareToken { - id, - ext_wire_expr: WireExprType { wire_expr }, - }), - }, - res.expr().to_string(), - ), + &src_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::UndeclareToken(UndeclareToken { + id, + ext_wire_expr: WireExprType { wire_expr }, + }), + }, + Some(res.clone()), ); } } @@ -945,20 +929,18 @@ pub(super) fn token_linkstate_change( let push_declaration = push_declaration_profile(tables, &dst_face); let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); send_declare( - &dst_face.primitives, - RoutingContext::with_expr( - Declare { - interest_id: None, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::default(), - body: DeclareBody::DeclareToken(DeclareToken { - id, - wire_expr: key_expr, - }), - }, - res.expr().to_string(), - ), + &dst_face, + Declare { + interest_id: None, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::default(), + body: DeclareBody::DeclareToken(DeclareToken { + id, + wire_expr: key_expr, + }), + }, + Some(res.clone()), ); } } @@ -1010,17 +992,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - res.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(res.deref().clone()), ); } } else { @@ -1049,17 +1029,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } @@ -1086,17 +1064,15 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, push_declaration_profile(tables, face)); send_declare( - &face.primitives, - RoutingContext::with_expr( - Declare { - interest_id, - ext_qos: ext::QoSType::DECLARE, - ext_tstamp: None, - ext_nodeid: ext::NodeIdType::DEFAULT, - body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), - }, - token.expr().to_string(), - ), + face, + Declare { + interest_id, + ext_qos: ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareToken(DeclareToken { id, wire_expr }), + }, + Some(token.clone()), ); } } diff --git a/zenoh/src/net/routing/mod.rs b/zenoh/src/net/routing/mod.rs index 5089bfd65e..17a90a0629 100644 --- a/zenoh/src/net/routing/mod.rs +++ b/zenoh/src/net/routing/mod.rs @@ -88,6 +88,8 @@ impl RoutingContext { } pub(crate) fn with_prefix(msg: Msg, prefix: Arc) -> Self { + // TODO: could this function be replaced by `with_expr`? i.e. is cloning the Resource prefix + // better then allocating the full_expr? Self { msg, inface: OnceCell::new(), @@ -106,16 +108,6 @@ impl RoutingContext { pub(crate) fn outface(&self) -> Option<&Face> { self.outface.get() } - - pub(crate) fn with_mut(mut self, f: impl FnOnce(RoutingContext<&mut Msg>) -> R) -> R { - f(RoutingContext { - msg: &mut self.msg, - inface: self.inface, - outface: self.outface, - prefix: self.prefix, - full_expr: self.full_expr, - }) - } } impl RoutingContext> { @@ -131,7 +123,7 @@ impl RoutingContext> { let wire_expr = wire_expr.to_owned(); if self.prefix.get().is_none() { if let Some(prefix) = zread!(face.tables.tables) - .get_sent_mapping(&face.state, &wire_expr.scope, wire_expr.mapping) + .get_sent_mapping(&face.state, wire_expr.scope, wire_expr.mapping) .cloned() { let _ = self.prefix.set(prefix); @@ -145,7 +137,7 @@ impl RoutingContext> { let wire_expr = wire_expr.to_owned(); if self.prefix.get().is_none() { if let Some(prefix) = zread!(face.tables.tables) - .get_mapping(&face.state, &wire_expr.scope, wire_expr.mapping) + .get_mapping(&face.state, wire_expr.scope, wire_expr.mapping) .cloned() { let _ = self.prefix.set(prefix); @@ -170,12 +162,13 @@ impl RoutingContext> { return Some(self.full_expr.get().as_ref().unwrap()); } - // if let Some(prefix) = self.prefix() { - // let _ = self - // .full_expr - // .set(prefix.expr().to_string() + self.wire_expr().unwrap().suffix.as_ref()); - // return Some(self.full_expr.get().as_ref().unwrap()); - // } + // FIXME(fuzzypixelz): this should likely be removed, alongside outface and inface and prefix() + if let Some(prefix) = self.prefix() { + let _ = self + .full_expr + .set(prefix.expr().to_string() + self.wire_expr().unwrap().suffix.as_ref()); + return Some(self.full_expr.get().as_ref().unwrap()); + } None } diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index 3b60fefbc7..be2900c2ca 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -103,14 +103,14 @@ impl Router { }; let mut declares = vec![]; ctrl_lock - .new_local_face(&mut tables, &self.tables, &mut face, &mut |p, m| { - declares.push((p.clone(), m)) + .new_local_face(&mut tables, &self.tables, &mut face, &mut |p, m, r| { + declares.push((p.clone(), m, r)) }) .unwrap(); drop(tables); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()); } Arc::new(face) } @@ -126,9 +126,9 @@ impl Router { #[cfg(feature = "stats")] let stats = transport.get_stats()?; - let ingress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); - let egress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); - let mux = Arc::new(Mux::new(transport.clone(), InterceptorsChain::empty())); + let ingress = ArcSwap::new(InterceptorsChain::empty().into()); + let egress = ArcSwap::new(InterceptorsChain::empty().into()); + let mux = Arc::new(Mux::new(transport.clone())); let newface = tables .faces .entry(fid) @@ -141,7 +141,7 @@ impl Router { Some(stats), mux.clone(), None, - Some(ingress.clone()), + Some(ingress), Some(egress), ctrl_lock.new_face(), false, @@ -159,23 +159,21 @@ impl Router { state: newface, }; - let _ = mux.face.set(Face::downgrade(&face)); - let mut declares = vec![]; ctrl_lock.new_transport_unicast_face( &mut tables, &self.tables, &mut face, &transport, - &mut |p, m| declares.push((p.clone(), m)), + &mut |p, m, r| declares.push((p.clone(), m, r)), )?; drop(tables); drop(ctrl_lock); - for (p, m) in declares { - m.with_mut(|m| p.send_declare(m)); + for (p, mut m, r) in declares { + p.intercept_declare(&mut m, r.as_ref()); } - Ok(Arc::new(DeMux::new(face, Some(transport), ingress))) + Ok(Arc::new(DeMux::new(face, Some(transport)))) } pub fn new_transport_multicast(&self, transport: TransportMulticast) -> ZResult<()> { @@ -220,8 +218,8 @@ impl Router { let mut tables = zwrite!(self.tables.tables); let fid = tables.face_counter; tables.face_counter += 1; - let ingress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); - let egress = Arc::new(ArcSwap::new(InterceptorsChain::empty().into())); + let ingress = ArcSwap::new(InterceptorsChain::empty().into()); + let egress = ArcSwap::new(InterceptorsChain::empty().into()); let face_state = FaceState::new( fid, peer.zid, @@ -230,7 +228,7 @@ impl Router { Some(transport.get_stats().unwrap()), Arc::new(DummyPrimitives), Some(transport), - Some(ingress.clone()), + Some(ingress), Some(egress), ctrl_lock.new_face(), false, @@ -248,7 +246,6 @@ impl Router { state: face_state, }, None, - ingress, ))) } } diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index bc3491182b..2e982639f8 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -82,7 +82,7 @@ fn base_test() { &WireExpr::from(1).with_suffix("four/five"), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); Tables::print(&zread!(tables.tables)); @@ -204,7 +204,7 @@ fn multisub_test() { &"sub".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); let optres = Resource::get_resource(zread!(tables.tables)._get_root(), "sub") .map(|res| Arc::downgrade(&res)); @@ -220,7 +220,7 @@ fn multisub_test() { &"sub".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); assert!(res.upgrade().is_some()); @@ -231,7 +231,7 @@ fn multisub_test() { 0, &WireExpr::empty(), NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); assert!(res.upgrade().is_some()); @@ -242,7 +242,7 @@ fn multisub_test() { 1, &WireExpr::empty(), NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); assert!(res.upgrade().is_none()); @@ -324,7 +324,7 @@ async fn clean_test() { &"todrop1/todrop11".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); let optres2 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1/todrop11") .map(|res| Arc::downgrade(&res)); @@ -340,7 +340,7 @@ async fn clean_test() { &WireExpr::from(1).with_suffix("/todrop12"), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); let optres3 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1/todrop12") .map(|res| Arc::downgrade(&res)); @@ -356,7 +356,7 @@ async fn clean_test() { 1, &WireExpr::empty(), NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); println!("COUNT2: {}", res3.strong_count()); @@ -372,7 +372,7 @@ async fn clean_test() { 0, &WireExpr::empty(), NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); assert!(res1.upgrade().is_some()); assert!(res2.upgrade().is_none()); @@ -393,7 +393,7 @@ async fn clean_test() { &"todrop3".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop3") .map(|res| Arc::downgrade(&res)); @@ -408,7 +408,7 @@ async fn clean_test() { 2, &WireExpr::empty(), NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); assert!(res1.upgrade().is_some()); @@ -426,7 +426,7 @@ async fn clean_test() { &"todrop5".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); declare_subscription( zlock!(tables.ctrl_lock).as_ref(), @@ -436,7 +436,7 @@ async fn clean_test() { &"todrop6".into(), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop4") @@ -624,7 +624,7 @@ fn client_test() { &WireExpr::from(11).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); register_expr( &tables, @@ -675,7 +675,7 @@ fn client_test() { &WireExpr::from(21).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); register_expr( &tables, @@ -726,7 +726,7 @@ fn client_test() { &WireExpr::from(31).with_suffix("/**"), &sub_info, NodeId::default(), - &mut |p, m| m.with_mut(|m| p.send_declare(m)), + &mut |p, mut m, r| p.intercept_declare(&mut m, r.as_ref()), ); primitives0.clear_data(); From 923e31ddf9a3a0fc3f45f65ae5180d22ea9309e8 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 13:46:16 +0200 Subject: [PATCH 27/49] Fix 1.75 build errors --- zenoh/src/net/routing/dispatcher/face.rs | 30 +++++++++++------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 3c80c27fd0..1cc116e919 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -331,9 +331,9 @@ impl Primitives for Face { #[cfg(feature = "stats")] size: None, }; - let ctx = match prefix { - Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), - None => &mut RoutingContext::new(msg), + let ctx = &mut match prefix { + Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), + None => RoutingContext::new(msg), }; if !self @@ -408,9 +408,9 @@ impl Primitives for Face { size: None, }; - let ctx = match prefix { - Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), - None => &mut RoutingContext::new(msg), + let ctx = &mut match prefix { + Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), + None => RoutingContext::new(msg), }; if !self @@ -644,8 +644,7 @@ impl Primitives for Face { .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { // NOTE: this request was blocked by an ingress interceptor, we need to send - // response final to avoid timeout error. We don't go through the egress - // interceptors because this message is not supposed to be filtered anyway. + // response final to avoid timeout error. self.state.intercept_response_final(&mut ResponseFinal { rid: msg.id, ext_qos: response::ext::QoSType::RESPONSE_FINAL, @@ -773,9 +772,9 @@ impl FaceState { size: None, }; - let ctx = match prefix { - Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), - None => &mut RoutingContext::new(msg), + let ctx = &mut match prefix { + Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), + None => RoutingContext::new(msg), }; if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { @@ -801,9 +800,9 @@ impl FaceState { size: None, }; - let ctx = match prefix { - Some(prefix) => &mut RoutingContext::with_prefix(msg, prefix.clone()), - None => &mut RoutingContext::new(msg), + let ctx = &mut match prefix { + Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), + None => RoutingContext::new(msg), }; if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { @@ -856,8 +855,7 @@ impl FaceState { if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { // NOTE: this request was blocked by an egress interceptor, we need to send - // response final to avoid timeout error. We don't go through the egress - // interceptors because this message is not supposed to be filtered anyway. + // response final to avoid timeout error. self.intercept_response_final(&mut ResponseFinal { rid: msg.id, ext_qos: response::ext::QoSType::RESPONSE_FINAL, From 951a41b720aecd102be10de1bb17166af05834f8 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 13:46:26 +0200 Subject: [PATCH 28/49] Improve ACL logging --- zenoh/src/net/routing/interceptor/access_control.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/zenoh/src/net/routing/interceptor/access_control.rs b/zenoh/src/net/routing/interceptor/access_control.rs index 6b158363cf..71748bc442 100644 --- a/zenoh/src/net/routing/interceptor/access_control.rs +++ b/zenoh/src/net/routing/interceptor/access_control.rs @@ -872,22 +872,24 @@ pub trait AclActionMethods { match policy_enforcer.policy_decision_point(subject.id, self.flow(), action, key_expr) { Ok(Permission::Allow) => { tracing::trace!( - "{} on {} is authorized to {} on {}", + "{} on {} is authorized to {} on {} ({:?})", zid, subject.name, log_msg, - key_expr + key_expr, + self.flow() ); decision = Permission::Allow; break; } Ok(Permission::Deny) => { tracing::trace!( - "{} on {} is unauthorized to {} on {}", + "{} on {} is unauthorized to {} on {} ({:?})", zid, subject.name, log_msg, - key_expr + key_expr, + self.flow() ); decision = Permission::Deny; From 1971d9f7a68e7027e6f8101d4511a54aaa3fc695 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 17:19:14 +0200 Subject: [PATCH 29/49] Move `FaceState::intercept_request` to `Face::intercept_request` `intercept_request` needs access to `Face` because of outstanding `ResponseFinal` messages for blocked egress queries. --- zenoh/src/net/routing/dispatcher/face.rs | 104 ++++--- zenoh/src/net/routing/dispatcher/interests.rs | 11 +- zenoh/src/net/routing/dispatcher/pubsub.rs | 9 +- zenoh/src/net/routing/dispatcher/queries.rs | 63 ++-- zenoh/src/net/routing/dispatcher/resource.rs | 53 ++-- zenoh/src/net/routing/dispatcher/tables.rs | 11 +- zenoh/src/net/routing/dispatcher/token.rs | 9 +- zenoh/src/net/routing/hat/client/interests.rs | 90 +++--- zenoh/src/net/routing/hat/client/mod.rs | 12 +- zenoh/src/net/routing/hat/client/pubsub.rs | 123 ++++---- zenoh/src/net/routing/hat/client/queries.rs | 100 +++---- zenoh/src/net/routing/hat/client/token.rs | 121 ++++---- .../routing/hat/linkstate_peer/interests.rs | 24 +- .../net/routing/hat/linkstate_peer/pubsub.rs | 194 +++++++----- .../net/routing/hat/linkstate_peer/queries.rs | 166 ++++++----- .../net/routing/hat/linkstate_peer/token.rs | 156 +++++----- zenoh/src/net/routing/hat/mod.rs | 8 +- .../src/net/routing/hat/p2p_peer/interests.rs | 122 ++++---- zenoh/src/net/routing/hat/p2p_peer/mod.rs | 16 +- zenoh/src/net/routing/hat/p2p_peer/pubsub.rs | 213 ++++++------- zenoh/src/net/routing/hat/p2p_peer/queries.rs | 191 ++++++------ zenoh/src/net/routing/hat/p2p_peer/token.rs | 191 ++++++------ zenoh/src/net/routing/hat/router/interests.rs | 28 +- zenoh/src/net/routing/hat/router/pubsub.rs | 281 ++++++++++-------- zenoh/src/net/routing/hat/router/queries.rs | 276 +++++++++-------- zenoh/src/net/routing/hat/router/token.rs | 272 +++++++++-------- zenoh/src/net/routing/router.rs | 33 +- zenoh/src/net/tests/tables.rs | 81 +++-- 28 files changed, 1581 insertions(+), 1377 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 1cc116e919..3ac2fed14a 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -11,7 +11,14 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::{any::Any, collections::HashMap, fmt, ops::Not, sync::Arc, time::Duration}; +use std::{ + any::Any, + collections::HashMap, + fmt, + ops::Not, + sync::{Arc, Weak}, + time::Duration, +}; use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; @@ -288,12 +295,36 @@ impl fmt::Display for FaceState { } } +#[derive(Clone, Debug)] +pub struct WeakFace { + pub(crate) tables: Weak, + pub(crate) state: Weak, +} + +impl WeakFace { + pub fn upgrade(&self) -> Option { + Some(Face { + tables: self.tables.upgrade()?, + state: self.state.upgrade()?, + }) + } +} + #[derive(Clone)] pub struct Face { pub(crate) tables: Arc, pub(crate) state: Arc, } +impl Face { + pub fn downgrade(&self) -> WeakFace { + WeakFace { + tables: Arc::downgrade(&self.tables), + state: Arc::downgrade(&self.state), + } + } +} + impl Primitives for Face { fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { @@ -350,7 +381,7 @@ impl Primitives for Face { declare_interest( ctrl_lock.as_ref(), &self.tables, - &mut self.state.clone(), + self, msg.id, msg.wire_expr.as_ref(), msg.mode, @@ -424,7 +455,7 @@ impl Primitives for Face { let ctrl_lock = zlock!(self.tables.ctrl_lock); match &mut msg.body { zenoh_protocol::network::DeclareBody::DeclareKeyExpr(m) => { - register_expr(&self.tables, &mut self.state.clone(), m.id, &m.wire_expr); + register_expr(&self.tables, self, m.id, &m.wire_expr); } zenoh_protocol::network::DeclareBody::UndeclareKeyExpr(m) => { unregister_expr(&self.tables, &mut self.state.clone(), m.id); @@ -434,7 +465,7 @@ impl Primitives for Face { declare_subscription( ctrl_lock.as_ref(), &self.tables, - &mut self.state.clone(), + self, m.id, &m.wire_expr, &SubscriberInfo, @@ -467,7 +498,7 @@ impl Primitives for Face { declare_queryable( ctrl_lock.as_ref(), &self.tables, - &mut self.state.clone(), + self, m.id, &m.wire_expr, &m.ext_info, @@ -500,7 +531,7 @@ impl Primitives for Face { declare_token( ctrl_lock.as_ref(), &self.tables, - &mut self.state.clone(), + self, m.id, &m.wire_expr, msg.ext_nodeid.node_id, @@ -645,7 +676,7 @@ impl Primitives for Face { { // NOTE: this request was blocked by an ingress interceptor, we need to send // response final to avoid timeout error. - self.state.intercept_response_final(&mut ResponseFinal { + self.send_response_final(&mut ResponseFinal { rid: msg.id, ext_qos: response::ext::QoSType::RESPONSE_FINAL, ext_tstamp: None, @@ -841,33 +872,6 @@ impl FaceState { self.primitives.send_push(msg, reliability); } - pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: Arc) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::with_prefix( - NetworkMessageMut { - body: NetworkBodyMut::Request(msg), - reliability: Reliability::Reliable, // NOTE: Request is always reliable - #[cfg(feature = "stats")] - size: None, - }, - prefix, - ); - - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { - // NOTE: this request was blocked by an egress interceptor, we need to send - // response final to avoid timeout error. - self.intercept_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); - return; - } - } - - self.primitives.send_request(msg); - } - pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: Arc) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::with_prefix( @@ -906,3 +910,35 @@ impl FaceState { self.primitives.send_response_final(msg); } } + +impl Face { + pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: Arc) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, // NOTE: Request is always reliable + #[cfg(feature = "stats")] + size: None, + }, + prefix, + ); + + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { + // NOTE: this request was blocked by an egress interceptor, we need to send + // response final to avoid timeout error. + self.send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); + return; + } + } + + self.state.primitives.send_request(msg); + } +} diff --git a/zenoh/src/net/routing/dispatcher/interests.rs b/zenoh/src/net/routing/dispatcher/interests.rs index e6fe641a81..7f9965ded6 100644 --- a/zenoh/src/net/routing/dispatcher/interests.rs +++ b/zenoh/src/net/routing/dispatcher/interests.rs @@ -33,7 +33,7 @@ use zenoh_sync::get_mut_unchecked; use zenoh_util::Timed; use super::{ - face::FaceState, + face::{Face, FaceState}, tables::{register_expr_interest, Tables, TablesLock}, }; use crate::net::routing::{ @@ -200,7 +200,7 @@ impl Timed for CurrentInterestCleanup { pub(crate) fn declare_interest( hat_code: &(dyn HatTrait + Send + Sync), tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, expr: Option<&WireExpr>, mode: InterestMode, @@ -208,12 +208,15 @@ pub(crate) fn declare_interest( send_declare: &mut SendDeclare, ) { if options.keyexprs() && mode != InterestMode::Current { - register_expr_interest(tables_ref, face, id, expr); + register_expr_interest(tables_ref, &mut face.state.clone(), id, expr); } if let Some(expr) = expr { let rtables = zread!(tables_ref.tables); - match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { + match rtables + .get_mapping(&face.state, expr.scope, expr.mapping) + .cloned() + { Some(mut prefix) => { tracing::debug!( "{} Declare interest {} ({}{})", diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 0419558b0d..379c4aca21 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -25,7 +25,7 @@ use zenoh_protocol::{ use zenoh_sync::get_mut_unchecked; use super::{ - face::FaceState, + face::{Face, FaceState}, resource::{Direction, Resource}, tables::{NodeId, Route, RoutingExpr, Tables, TablesLock}, }; @@ -43,7 +43,7 @@ pub(crate) struct SubscriberInfo; pub(crate) fn declare_subscription( hat_code: &(dyn HatTrait + Send + Sync), tables: &TablesLock, - face: &mut Arc, + face: &Face, id: SubscriberId, expr: &WireExpr, sub_info: &SubscriberInfo, @@ -51,7 +51,10 @@ pub(crate) fn declare_subscription( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { + match rtables + .get_mapping(&face.state, expr.scope, expr.mapping) + .cloned() + { Some(mut prefix) => { tracing::debug!( "{} Declare subscriber {} ({}{})", diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index 31c732615c..f08b952bea 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -11,11 +11,7 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::{ - collections::HashMap, - sync::{Arc, Weak}, - time::Duration, -}; +use std::{collections::HashMap, sync::Arc, time::Duration}; use async_trait::async_trait; use tokio_util::sync::CancellationToken; @@ -35,7 +31,7 @@ use zenoh_sync::get_mut_unchecked; use zenoh_util::Timed; use super::{ - face::FaceState, + face::{Face, FaceState, WeakFace}, resource::{QueryRoute, QueryTargetQablSet, Resource}, tables::{NodeId, RoutingExpr, Tables, TablesLock}, }; @@ -67,7 +63,7 @@ pub(crate) fn get_matching_queryables( pub(crate) fn declare_queryable( hat_code: &(dyn HatTrait + Send + Sync), tables: &TablesLock, - face: &mut Arc, + face: &Face, id: QueryableId, expr: &WireExpr, qabl_info: &QueryableInfoType, @@ -75,7 +71,10 @@ pub(crate) fn declare_queryable( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { + match rtables + .get_mapping(&face.state, expr.scope, expr.mapping) + .cloned() + { Some(mut prefix) => { tracing::debug!( "{} Declare queryable {} ({}{})", @@ -210,11 +209,11 @@ fn compute_final_route( for qabl in qabls.iter() { if tables .hat_code - .egress_filter(tables, src_face, &qabl.direction.0, expr) + .egress_filter(tables, src_face, &qabl.direction.0.state, expr) { - route.entry(qabl.direction.0.id).or_insert_with(|| { + route.entry(qabl.direction.0.state.id).or_insert_with(|| { let mut direction = qabl.direction.clone(); - let qid = insert_pending_query(&mut direction.0, query.clone()); + let qid = insert_pending_query(&mut direction.0.state, query.clone()); (direction, qid) }); } @@ -225,13 +224,16 @@ fn compute_final_route( let mut route = HashMap::new(); for qabl in qabls.iter() { if qabl.info.map(|info| info.complete).unwrap_or(true) - && tables - .hat_code - .egress_filter(tables, src_face, &qabl.direction.0, expr) + && tables.hat_code.egress_filter( + tables, + src_face, + &qabl.direction.0.state, + expr, + ) { - route.entry(qabl.direction.0.id).or_insert_with(|| { + route.entry(qabl.direction.0.state.id).or_insert_with(|| { let mut direction = qabl.direction.clone(); - let qid = insert_pending_query(&mut direction.0, query.clone()); + let qid = insert_pending_query(&mut direction.0.state, query.clone()); (direction, qid) }); } @@ -240,13 +242,14 @@ fn compute_final_route( } QueryTarget::BestMatching => { if let Some(qabl) = qabls.iter().find(|qabl| { - qabl.direction.0.id != src_face.id && qabl.info.is_some_and(|info| info.complete) + qabl.direction.0.state.id != src_face.id + && qabl.info.is_some_and(|info| info.complete) }) { let mut route = HashMap::new(); let mut direction = qabl.direction.clone(); - let qid = insert_pending_query(&mut direction.0, query); - route.insert(direction.0.id, (direction, qid)); + let qid = insert_pending_query(&mut direction.0.state, query); + route.insert(direction.0.state.id, (direction, qid)); route } else { @@ -259,27 +262,28 @@ fn compute_final_route( #[derive(Clone)] struct QueryCleanup { tables: Arc, - face: Weak, + face: WeakFace, qid: RequestId, timeout: Duration, } impl QueryCleanup { pub fn spawn_query_clean_up_task( - face: &Arc, + face: &Face, tables_ref: &Arc, qid: u32, timeout: Duration, ) { let mut cleanup = QueryCleanup { tables: tables_ref.clone(), - face: Arc::downgrade(face), + face: face.downgrade(), qid, timeout, }; - if let Some((_, cancellation_token)) = face.pending_queries.get(&qid) { + if let Some((_, cancellation_token)) = face.state.pending_queries.get(&qid) { let c_cancellation_token = cancellation_token.clone(); - face.task_controller + face.state + .task_controller .spawn_with_rt(zenoh_runtime::ZRuntime::Net, async move { tokio::select! { _ = tokio::time::sleep(timeout) => { cleanup.run().await } @@ -293,14 +297,15 @@ impl QueryCleanup { #[async_trait] impl Timed for QueryCleanup { async fn run(&mut self) { - if let Some(mut face) = self.face.upgrade() { + if let Some(face) = self.face.upgrade() { let ext_respid = Some(response::ext::ResponderIdType { - zid: face.zid, + zid: face.state.zid, eid: 0, }); + let mut face_state = face.state.clone(); route_send_response( &self.tables, - &mut face, + &mut face_state, &mut Response { rid: self.qid, wire_expr: WireExpr::empty(), @@ -318,7 +323,7 @@ impl Timed for QueryCleanup { }, ); let queries_lock = zwrite!(self.tables.queries_lock); - if let Some(query) = get_mut_unchecked(&mut face) + if let Some(query) = get_mut_unchecked(&mut face_state) .pending_queries .remove(&self.qid) { @@ -537,7 +542,7 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu .expect("reading Tables should not fail"); match tables .get_sent_mapping( - outface, + &outface.state, msg.wire_expr.scope, msg.wire_expr.mapping, ) diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index 92c2b3073a..86ba346f52 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -34,7 +34,7 @@ use zenoh_protocol::{ use zenoh_sync::{get_mut_unchecked, Cache, CacheValueType}; use super::{ - face::FaceState, + face::{Face, FaceState}, pubsub::SubscriberInfo, tables::{Tables, TablesLock}, }; @@ -48,9 +48,10 @@ pub(crate) type NodeId = u16; pub(crate) type Direction = (Arc, WireExpr<'static>, NodeId); pub(crate) type Route = HashMap; -pub(crate) type QueryRoute = HashMap; +pub(crate) type QueryDirection = (Face, WireExpr<'static>, NodeId); +pub(crate) type QueryRoute = HashMap; pub(crate) struct QueryTargetQabl { - pub(crate) direction: Direction, + pub(crate) direction: QueryDirection, pub(crate) info: Option, } pub(crate) type QueryTargetQablSet = Vec; @@ -84,7 +85,7 @@ impl InterceptorCache { } pub(crate) struct SessionContext { - pub(crate) face: Arc, + pub(crate) face: Face, pub(crate) local_expr_id: Option, pub(crate) remote_expr_id: Option, pub(crate) subs: Option, @@ -95,7 +96,7 @@ pub(crate) struct SessionContext { } impl SessionContext { - pub(crate) fn new(face: Arc) -> Self { + pub(crate) fn new(face: Face) -> Self { Self { face, local_expr_id: None, @@ -491,12 +492,8 @@ impl Resource { } #[inline] - pub fn decl_key( - res: &Arc, - face: &mut Arc, - push: bool, - ) -> WireExpr<'static> { - if face.is_local { + pub fn decl_key(res: &Arc, face: &Face, push: bool) -> WireExpr<'static> { + if face.state.is_local { return res.expr().to_string().into(); } @@ -505,7 +502,7 @@ impl Resource { Some(mut nonwild_prefix) => { if let Some(ctx) = get_mut_unchecked(&mut nonwild_prefix) .session_ctxs - .get(&face.id) + .get(&face.state.id) { if let Some(expr_id) = ctx.remote_expr_id { return WireExpr { @@ -523,7 +520,7 @@ impl Resource { } } if push - || face.remote_key_interests.values().any(|res| { + || face.state.remote_key_interests.values().any(|res| { res.as_ref() .map(|res| res.matches(&nonwild_prefix)) .unwrap_or(true) @@ -531,14 +528,14 @@ impl Resource { { let ctx = get_mut_unchecked(&mut nonwild_prefix) .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); - let expr_id = face.get_next_local_id(); + let expr_id = face.state.get_next_local_id(); get_mut_unchecked(ctx).local_expr_id = Some(expr_id); - get_mut_unchecked(face) + get_mut_unchecked(&mut face.state.clone()) .local_mappings .insert(expr_id, nonwild_prefix.clone()); - face.intercept_declare( + face.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -551,7 +548,7 @@ impl Resource { }, Some(&nonwild_prefix), ); - face.update_interceptors_caches(&mut nonwild_prefix); + face.state.update_interceptors_caches(&mut nonwild_prefix); WireExpr { scope: expr_id, suffix: wildsuffix.into(), @@ -774,15 +771,13 @@ impl Resource { } } -pub(crate) fn register_expr( - tables: &TablesLock, - face: &mut Arc, - expr_id: ExprId, - expr: &WireExpr, -) { +pub(crate) fn register_expr(tables: &TablesLock, face: &Face, expr_id: ExprId, expr: &WireExpr) { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { - Some(mut prefix) => match face.remote_mappings.get(&expr_id) { + match rtables + .get_mapping(&face.state, expr.scope, expr.mapping) + .cloned() + { + Some(mut prefix) => match face.state.remote_mappings.get(&expr_id) { Some(res) => { let mut fullexpr = prefix.expr().to_string(); fullexpr.push_str(expr.suffix.as_ref()); @@ -820,17 +815,17 @@ pub(crate) fn register_expr( }; let ctx = get_mut_unchecked(&mut res) .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).remote_expr_id = Some(expr_id); - get_mut_unchecked(face) + get_mut_unchecked(&mut face.state.clone()) .remote_mappings .insert(expr_id, res.clone()); disable_matches_data_routes(&mut wtables, &mut res); disable_matches_query_routes(&mut wtables, &mut res); - face.update_interceptors_caches(&mut res); + face.state.update_interceptors_caches(&mut res); drop(wtables); } }, diff --git a/zenoh/src/net/routing/dispatcher/tables.rs b/zenoh/src/net/routing/dispatcher/tables.rs index af68e1deec..c1f70d2135 100644 --- a/zenoh/src/net/routing/dispatcher/tables.rs +++ b/zenoh/src/net/routing/dispatcher/tables.rs @@ -29,7 +29,7 @@ use zenoh_protocol::{ }; use zenoh_result::ZResult; -use super::face::FaceState; +use super::face::{Face, FaceState}; pub use super::resource::*; use crate::net::{ routing::{ @@ -75,7 +75,7 @@ pub struct Tables { pub(crate) queries_default_timeout: Duration, pub(crate) interests_timeout: Duration, pub(crate) root_res: Arc, - pub(crate) faces: HashMap>, + pub(crate) faces: HashMap, pub(crate) mcast_groups: Vec>, pub(crate) mcast_faces: Vec>, pub(crate) interceptors: Vec, @@ -159,8 +159,8 @@ impl Tables { } #[inline] - pub(crate) fn get_face(&self, zid: &ZenohIdProto) -> Option<&Arc> { - self.faces.values().find(|face| face.zid == *zid) + pub(crate) fn get_face(&self, zid: &ZenohIdProto) -> Option<&Face> { + self.faces.values().find(|face| face.state.zid == *zid) } pub(crate) fn disable_all_routes(&mut self) { @@ -185,7 +185,8 @@ impl TablesLock { .next_interceptor_version .fetch_add(1, Ordering::SeqCst); tables.faces.values().for_each(|face| { - face.set_interceptors_from_factories(&tables.interceptors, version + 1); + face.state + .set_interceptors_from_factories(&tables.interceptors, version + 1); }); Ok(()) } diff --git a/zenoh/src/net/routing/dispatcher/token.rs b/zenoh/src/net/routing/dispatcher/token.rs index 0bd9cf60a5..54b7641f46 100644 --- a/zenoh/src/net/routing/dispatcher/token.rs +++ b/zenoh/src/net/routing/dispatcher/token.rs @@ -24,7 +24,7 @@ use zenoh_protocol::{ }; use super::{ - face::FaceState, + face::{Face, FaceState}, tables::{NodeId, TablesLock}, }; use crate::net::routing::{ @@ -36,7 +36,7 @@ use crate::net::routing::{ pub(crate) fn declare_token( hat_code: &(dyn HatTrait + Send + Sync), tables: &TablesLock, - face: &mut Arc, + face: &Face, id: TokenId, expr: &WireExpr, node_id: NodeId, @@ -44,7 +44,10 @@ pub(crate) fn declare_token( send_declare: &mut SendDeclare, ) { let rtables = zread!(tables.tables); - match rtables.get_mapping(face, expr.scope, expr.mapping).cloned() { + match rtables + .get_mapping(&face.state, expr.scope, expr.mapping) + .cloned() + { Some(mut prefix) => { tracing::debug!( "{} Declare token {} ({}{})", diff --git a/zenoh/src/net/routing/hat/client/interests.rs b/zenoh/src/net/routing/hat/client/interests.rs index d93208a368..33bcc6883a 100644 --- a/zenoh/src/net/routing/hat/client/interests.rs +++ b/zenoh/src/net/routing/hat/client/interests.rs @@ -26,7 +26,7 @@ use zenoh_sync::get_mut_unchecked; use super::{face_hat, face_hat_mut, token::declare_token_interest, HatCode, HatFace}; use crate::net::routing::{ dispatcher::{ - face::{FaceState, InterestState}, + face::{Face, FaceState, InterestState}, interests::{ CurrentInterest, CurrentInterestCleanup, PendingCurrentInterest, RemoteInterest, }, @@ -36,19 +36,14 @@ use crate::net::routing::{ hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, }; -pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) { - if face.whatami != WhatAmI::Client { - for mut src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { +pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Face) { + if face.state.whatami != WhatAmI::Client { + for mut src_face in tables.faces.values().cloned().collect::>() { for RemoteInterest { res, options, .. } in - face_hat_mut!(&mut src_face).remote_interests.values() + face_hat_mut!(&mut src_face.state).remote_interests.values() { - let id = face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst); - get_mut_unchecked(face).local_interests.insert( + let id = face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst); + get_mut_unchecked(&mut face.state).local_interests.insert( id, InterestState { options: *options, @@ -57,7 +52,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) }, ); let wire_expr = res.as_ref().map(|res| Resource::decl_key(res, face, true)); - face.intercept_interest( + face.state.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -79,7 +74,7 @@ impl HatInterestTrait for HatCode { &self, tables: &mut Tables, tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -97,17 +92,19 @@ impl HatInterestTrait for HatCode { send_declare, ) } - face_hat_mut!(face).remote_interests.insert( - id, - RemoteInterest { - res: res.as_ref().map(|res| (*res).clone()), - options, - mode, - }, - ); + face_hat_mut!(&mut face.state.clone()) + .remote_interests + .insert( + id, + RemoteInterest { + res: res.as_ref().map(|res| (*res).clone()), + options, + mode, + }, + ); let interest = Arc::new(CurrentInterest { - src_face: face.clone(), + src_face: face.state.clone(), src_interest_id: id, mode, }); @@ -115,19 +112,23 @@ impl HatInterestTrait for HatCode { for dst_face in tables .faces .values_mut() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - get_mut_unchecked(dst_face).local_interests.insert( - id, - InterestState { - options, - res: res.as_ref().map(|res| (*res).clone()), - finalized: mode == InterestMode::Future, - }, - ); + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + get_mut_unchecked(&mut dst_face.state) + .local_interests + .insert( + id, + InterestState { + options, + res: res.as_ref().map(|res| (*res).clone()), + finalized: mode == InterestMode::Future, + }, + ); if mode.current() && options.tokens() { - let dst_face_mut = get_mut_unchecked(dst_face); + let dst_face_mut = get_mut_unchecked(&mut dst_face.state); let cancellation_token = dst_face_mut.task_controller.get_cancellation_token(); let rejection_token = dst_face_mut.task_controller.get_cancellation_token(); dst_face_mut.pending_current_interests.insert( @@ -139,7 +140,7 @@ impl HatInterestTrait for HatCode { }, ); CurrentInterestCleanup::spawn_interest_clean_up_task( - dst_face, + &dst_face.state, tables_ref, id, tables.interests_timeout, @@ -148,7 +149,7 @@ impl HatInterestTrait for HatCode { let wire_expr = res .as_ref() .map(|res| Resource::decl_key(res, dst_face, true)); - dst_face.intercept_interest( + dst_face.state.intercept_interest( &mut Interest { id, mode, @@ -184,7 +185,7 @@ impl HatInterestTrait for HatCode { } } else { send_declare( - face, + &face.state, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, @@ -201,8 +202,8 @@ impl HatInterestTrait for HatCode { fn undeclare_interest(&self, tables: &mut Tables, face: &mut Arc, id: InterestId) { if let Some(interest) = face_hat_mut!(face).remote_interests.remove(&id) { if !tables.faces.values().any(|f| { - f.whatami == WhatAmI::Client - && face_hat!(f) + f.state.whatami == WhatAmI::Client + && face_hat!(f.state) .remote_interests .values() .any(|i| *i == interest) @@ -210,19 +211,20 @@ impl HatInterestTrait for HatCode { for dst_face in tables .faces .values_mut() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { for id in dst_face + .state .local_interests .keys() .cloned() .collect::>() { - let local_interest = dst_face.local_interests.get(&id).unwrap(); + let local_interest = dst_face.state.local_interests.get(&id).unwrap(); if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.intercept_interest( + dst_face.state.intercept_interest( &mut Interest { id, mode: InterestMode::Final, @@ -236,7 +238,9 @@ impl HatInterestTrait for HatCode { }, local_interest.res.as_ref(), ); - get_mut_unchecked(dst_face).local_interests.remove(&id); + get_mut_unchecked(&mut dst_face.state) + .local_interests + .remove(&id); } } } diff --git a/zenoh/src/net/routing/hat/client/mod.rs b/zenoh/src/net/routing/hat/client/mod.rs index 2f4331c115..79937b6ea0 100644 --- a/zenoh/src/net/routing/hat/client/mod.rs +++ b/zenoh/src/net/routing/hat/client/mod.rs @@ -104,10 +104,10 @@ impl HatBaseTrait for HatCode { face: &mut Face, send_declare: &mut SendDeclare, ) -> ZResult<()> { - interests_new_face(tables, &mut face.state); - pubsub_new_face(tables, &mut face.state, send_declare); + interests_new_face(tables, face); + pubsub_new_face(tables, face, send_declare); queries_new_face(tables, &mut face.state, send_declare); - token_new_face(tables, &mut face.state, send_declare); + token_new_face(tables, face, send_declare); tables.disable_all_routes(); Ok(()) } @@ -120,10 +120,10 @@ impl HatBaseTrait for HatCode { _transport: &TransportUnicast, send_declare: &mut SendDeclare, ) -> ZResult<()> { - interests_new_face(tables, &mut face.state); - pubsub_new_face(tables, &mut face.state, send_declare); + interests_new_face(tables, face); + pubsub_new_face(tables, face, send_declare); queries_new_face(tables, &mut face.state, send_declare); - token_new_face(tables, &mut face.state, send_declare); + token_new_face(tables, face, send_declare); tables.disable_all_routes(); Ok(()) } diff --git a/zenoh/src/net/routing/hat/client/pubsub.rs b/zenoh/src/net/routing/hat/client/pubsub.rs index c43d4daeb8..7b21388d98 100644 --- a/zenoh/src/net/routing/hat/client/pubsub.rs +++ b/zenoh/src/net/routing/hat/client/pubsub.rs @@ -31,7 +31,7 @@ use crate::{ key_expr::KeyExpr, net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, pubsub::SubscriberInfo, resource::{NodeId, Resource, SessionContext}, tables::{Route, RoutingExpr, Tables}, @@ -43,21 +43,25 @@ use crate::{ #[inline] fn propagate_simple_subscription_to( _tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, _sub_info: &SubscriberInfo, - src_face: &mut Arc, + src_face: &Face, send_declare: &mut SendDeclare, ) { - if src_face.id != dst_face.id - && !face_hat!(dst_face).local_subs.contains_key(res) - && (src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) + if src_face.state.id != dst_face.state.id + && !face_hat!(dst_face.state).local_subs.contains_key(res) + && (src_face.state.whatami == WhatAmI::Client || dst_face.state.whatami == WhatAmI::Client) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -77,15 +81,10 @@ fn propagate_simple_subscription( tables: &mut Tables, res: &Arc, sub_info: &SubscriberInfo, - src_face: &mut Arc, + src_face: &Face, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_subscription_to( tables, &mut dst_face, @@ -99,7 +98,7 @@ fn propagate_simple_subscription( fn register_simple_subscription( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -107,7 +106,7 @@ fn register_simple_subscription( // Register subscription { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if ctx.subs.is_none() { get_mut_unchecked(ctx).subs = Some(*sub_info); @@ -116,18 +115,20 @@ fn register_simple_subscription( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).subs = Some(*sub_info); } } } - face_hat_mut!(face).remote_subs.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_subs + .insert(id, res.clone()); } fn declare_simple_subscription( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -144,7 +145,7 @@ fn simple_subs(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -158,9 +159,9 @@ fn propagate_forget_simple_subscription( send_declare: &mut SendDeclare, ) { for face in tables.faces.values_mut() { - if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -230,25 +231,13 @@ fn forget_simple_subscription( pub(super) fn pubsub_new_face( tables: &mut Tables, - face: &mut Arc, + face: &mut Face, send_declare: &mut SendDeclare, ) { let sub_info = SubscriberInfo; - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for sub in face_hat!(src_face).remote_subs.values() { - propagate_simple_subscription_to( - tables, - face, - sub, - &sub_info, - &mut src_face.clone(), - send_declare, - ); + for src_face in tables.faces.values().cloned().collect::>() { + for sub in face_hat!(src_face.state).remote_subs.values() { + propagate_simple_subscription_to(tables, face, sub, &sub_info, &src_face, send_declare); } } } @@ -257,7 +246,7 @@ impl HatPubSubTrait for HatCode { fn declare_subscription( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -283,14 +272,14 @@ impl HatPubSubTrait for HatCode { // Compute the list of known suscriptions (keys) let mut subs = HashMap::new(); for src_face in tables.faces.values() { - for sub in face_hat!(src_face).remote_subs.values() { + for sub in face_hat!(src_face.state).remote_subs.values() { // Insert the key in the list of known suscriptions let srcs = subs.entry(sub.clone()).or_insert_with(Sources::empty); // Append src_face as a suscription source in the proper list - match src_face.whatami { - WhatAmI::Router => srcs.routers.push(src_face.zid), - WhatAmI::Peer => srcs.peers.push(src_face.zid), - WhatAmI::Client => srcs.clients.push(src_face.zid), + match src_face.state.whatami { + WhatAmI::Router => srcs.routers.push(src_face.state.zid), + WhatAmI::Peer => srcs.peers.push(src_face.state.zid), + WhatAmI::Client => srcs.clients.push(src_face.state.zid), } } } @@ -300,14 +289,14 @@ impl HatPubSubTrait for HatCode { fn get_publications(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.subscribers() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -346,9 +335,9 @@ impl HatPubSubTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { - if !face.local_interests.values().any(|interest| { + if !face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.subscribers() && interest @@ -356,15 +345,15 @@ impl HatPubSubTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), expr.full_expr())) .unwrap_or(true) - }) || face_hat!(face) + }) || face_hat!(face.state) .remote_subs .values() .any(|sub| KeyExpr::keyexpr_intersect(sub.expr(), expr.full_expr())) { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.insert( - face.id, - (face.clone(), key_expr.to_owned(), NodeId::default()), + face.state.id, + (face.state.clone(), key_expr.to_owned(), NodeId::default()), ); } } @@ -381,10 +370,14 @@ impl HatPubSubTrait for HatCode { let mres = mres.upgrade().unwrap(); for (sid, context) in &mres.session_ctxs { - if context.subs.is_some() && context.face.whatami == WhatAmI::Client { + if context.subs.is_some() && context.face.state.whatami == WhatAmI::Client { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - (context.face.clone(), key_expr.to_owned(), NodeId::default()) + ( + context.face.state.clone(), + key_expr.to_owned(), + NodeId::default(), + ) }); } } @@ -407,9 +400,9 @@ impl HatPubSubTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { - if face.local_interests.values().any(|interest| { + if face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.subscribers() && interest @@ -417,12 +410,12 @@ impl HatPubSubTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), key_expr)) .unwrap_or(true) - }) && face_hat!(face) + }) && face_hat!(face.state) .remote_subs .values() .any(|sub| KeyExpr::keyexpr_intersect(sub.expr(), key_expr)) { - matching_subscriptions.insert(face.id, face.clone()); + matching_subscriptions.insert(face.state.id, face.state.clone()); } } @@ -437,10 +430,10 @@ impl HatPubSubTrait for HatCode { let mres = mres.upgrade().unwrap(); for (sid, context) in &mres.session_ctxs { - if context.subs.is_some() && context.face.whatami == WhatAmI::Client { + if context.subs.is_some() && context.face.state.whatami == WhatAmI::Client { matching_subscriptions .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/client/queries.rs b/zenoh/src/net/routing/hat/client/queries.rs index 3fd135aed9..d4bfd8e445 100644 --- a/zenoh/src/net/routing/hat/client/queries.rs +++ b/zenoh/src/net/routing/hat/client/queries.rs @@ -37,7 +37,7 @@ use crate::{ key_expr::KeyExpr, net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, resource::{NodeId, Resource, SessionContext}, tables::{QueryTargetQabl, QueryTargetQablSet, RoutingExpr, Tables}, }, @@ -60,7 +60,7 @@ fn local_qabl_info( res.session_ctxs .values() .fold(None, |accu, ctx| { - if ctx.face.id != face.id { + if ctx.face.state.id != face.id { if let Some(info) = ctx.qabl.as_ref() { Some(match accu { Some(accu) => merge_qabl_infos(accu, info), @@ -79,34 +79,37 @@ fn local_qabl_info( fn propagate_simple_queryable( tables: &mut Tables, res: &Arc, - src_face: Option<&mut Arc>, + src_face: Option<&Face>, send_declare: &mut SendDeclare, ) { let faces = tables.faces.values().cloned(); for mut dst_face in faces { - let info = local_qabl_info(tables, res, &dst_face); - let current = face_hat!(dst_face).local_qabls.get(res); + let info = local_qabl_info(tables, res, &dst_face.state); + let current = face_hat!(dst_face.state).local_qabls.get(res); if src_face .as_ref() - .map(|src_face| dst_face.id != src_face.id) + .map(|src_face| dst_face.state.id != src_face.state.id) .unwrap_or(true) && (current.is_none() || current.unwrap().1 != info) && src_face .as_ref() .map(|src_face| { - src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client + src_face.state.whatami == WhatAmI::Client + || dst_face.state.whatami == WhatAmI::Client }) .unwrap_or(true) { - let id = current - .map(|c| c.0) - .unwrap_or(face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst)); - face_hat_mut!(&mut dst_face) + let id = current.map(|c| c.0).unwrap_or( + face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst), + ); + face_hat_mut!(&mut dst_face.state) .local_qabls .insert(res.clone(), (id, info)); - let key_expr = Resource::decl_key(res, &mut dst_face, true); + let key_expr = Resource::decl_key(res, &dst_face, true); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -126,7 +129,7 @@ fn propagate_simple_queryable( fn register_simple_queryable( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -136,17 +139,19 @@ fn register_simple_queryable( let res = get_mut_unchecked(res); get_mut_unchecked( res.session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))), ) .qabl = Some(*qabl_info); } - face_hat_mut!(face).remote_qabls.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_qabls + .insert(id, res.clone()); } fn declare_simple_queryable( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -162,7 +167,7 @@ fn simple_qabls(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -176,9 +181,9 @@ fn propagate_forget_simple_queryable( send_declare: &mut SendDeclare, ) { for face in tables.faces.values_mut() { - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -257,14 +262,9 @@ pub(super) fn queries_new_face( _face: &mut Arc, send_declare: &mut SendDeclare, ) { - for face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for qabl in face_hat!(face).remote_qabls.values() { - propagate_simple_queryable(tables, qabl, Some(&mut face.clone()), send_declare); + for face in tables.faces.values().cloned().collect::>() { + for qabl in face_hat!(face.state).remote_qabls.values() { + propagate_simple_queryable(tables, qabl, Some(&face), send_declare); } } } @@ -277,7 +277,7 @@ impl HatQueriesTrait for HatCode { fn declare_queryable( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -303,14 +303,14 @@ impl HatQueriesTrait for HatCode { // Compute the list of known queryables (keys) let mut qabls = HashMap::new(); for src_face in tables.faces.values() { - for qabl in face_hat!(src_face).remote_qabls.values() { + for qabl in face_hat!(src_face.state).remote_qabls.values() { // Insert the key in the list of known queryables let srcs = qabls.entry(qabl.clone()).or_insert_with(Sources::empty); // Append src_face as a queryable source in the proper list - match src_face.whatami { - WhatAmI::Router => srcs.routers.push(src_face.zid), - WhatAmI::Peer => srcs.peers.push(src_face.zid), - WhatAmI::Client => srcs.clients.push(src_face.zid), + match src_face.state.whatami { + WhatAmI::Router => srcs.routers.push(src_face.state.zid), + WhatAmI::Peer => srcs.peers.push(src_face.state.zid), + WhatAmI::Client => srcs.clients.push(src_face.state.zid), } } } @@ -320,14 +320,14 @@ impl HatQueriesTrait for HatCode { fn get_queriers(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.queryables() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -366,9 +366,9 @@ impl HatQueriesTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { - if !face.local_interests.values().any(|interest| { + if !face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.queryables() && interest @@ -376,12 +376,12 @@ impl HatQueriesTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), expr.full_expr())) .unwrap_or(true) - }) || face_hat!(face) + }) || face_hat!(face.state) .remote_qabls .values() .any(|qbl| KeyExpr::keyexpr_intersect(qbl.expr(), expr.full_expr())) { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.push(QueryTargetQabl { direction: (face.clone(), key_expr.to_owned(), NodeId::default()), info: None, @@ -436,9 +436,9 @@ impl HatQueriesTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Client) + .filter(|f| f.state.whatami != WhatAmI::Client) { - if face.local_interests.values().any(|interest| { + if face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.queryables() && interest @@ -446,13 +446,13 @@ impl HatQueriesTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), key_expr)) .unwrap_or(true) - }) && face_hat!(face) + }) && face_hat!(face.state) .remote_qabls .values() .any(|qbl| match complete { true => { qbl.session_ctxs - .get(&face.id) + .get(&face.state.id) .and_then(|sc| sc.qabl) .is_some_and(|q| q.complete) && KeyExpr::keyexpr_include(qbl.expr(), key_expr) @@ -460,7 +460,7 @@ impl HatQueriesTrait for HatCode { false => KeyExpr::keyexpr_intersect(qbl.expr(), key_expr), }) { - matching_queryables.insert(face.id, face.clone()); + matching_queryables.insert(face.state.id, face.state.clone()); } } @@ -477,7 +477,7 @@ impl HatQueriesTrait for HatCode { continue; } for (sid, context) in &mres.session_ctxs { - if context.face.whatami == WhatAmI::Client + if context.face.state.whatami == WhatAmI::Client && match complete { true => context.qabl.is_some_and(|q| q.complete), false => context.qabl.is_some(), @@ -485,7 +485,7 @@ impl HatQueriesTrait for HatCode { { matching_queryables .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/client/token.rs b/zenoh/src/net/routing/hat/client/token.rs index 7c629aae92..8842ffca49 100644 --- a/zenoh/src/net/routing/hat/client/token.rs +++ b/zenoh/src/net/routing/hat/client/token.rs @@ -28,7 +28,10 @@ use zenoh_sync::get_mut_unchecked; use super::{face_hat, face_hat_mut, HatCode, HatFace}; use crate::net::routing::{ - dispatcher::{face::FaceState, tables::Tables}, + dispatcher::{ + face::{Face, FaceState}, + tables::Tables, + }, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, }; @@ -36,20 +39,24 @@ use crate::net::routing::{ #[inline] fn propagate_simple_token_to( _tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.whatami == WhatAmI::Client) - && !face_hat!(dst_face).local_tokens.contains_key(res) - && (src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) + if (src_face.id != dst_face.state.id || dst_face.state.whatami == WhatAmI::Client) + && !face_hat!(dst_face.state).local_tokens.contains_key(res) + && (src_face.whatami == WhatAmI::Client || dst_face.state.whatami == WhatAmI::Client) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -71,26 +78,16 @@ fn propagate_simple_token( src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_token_to(tables, &mut dst_face, res, src_face, send_declare); } } -fn register_simple_token( - _tables: &mut Tables, - face: &mut Arc, - id: TokenId, - res: &mut Arc, -) { +fn register_simple_token(_tables: &mut Tables, face: &Face, id: TokenId, res: &mut Arc) { // Register liveliness { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if !ctx.token { get_mut_unchecked(ctx).token = true; @@ -99,18 +96,20 @@ fn register_simple_token( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).token = true; } } } - face_hat_mut!(face).remote_tokens.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_tokens + .insert(id, res.clone()); } fn declare_simple_token( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, interest_id: Option, @@ -118,12 +117,13 @@ fn declare_simple_token( ) { if let Some(interest_id) = interest_id { if let Some(interest) = face + .state .pending_current_interests .get(&interest_id) .map(|p| &p.interest) { if interest.mode == InterestMode::CurrentFuture { - register_simple_token(tables, &mut face.clone(), id, res); + register_simple_token(tables, face, id, res); } let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); @@ -139,7 +139,7 @@ fn declare_simple_token( Some(res.clone()), ); return; - } else if !face.local_interests.contains_key(&interest_id) { + } else if !face.state.local_interests.contains_key(&interest_id) { tracing::debug!( "Received DeclareToken for {} from {} with unknown interest_id {}. Ignore.", res.expr(), @@ -150,7 +150,7 @@ fn declare_simple_token( } } register_simple_token(tables, face, id, res); - propagate_simple_token(tables, res, face, send_declare); + propagate_simple_token(tables, res, &mut face.state.clone(), send_declare); } #[inline] @@ -159,7 +159,7 @@ fn simple_tokens(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -173,9 +173,9 @@ fn propagate_forget_simple_token( send_declare: &mut SendDeclare, ) { for face in tables.faces.values_mut() { - if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -188,7 +188,7 @@ fn propagate_forget_simple_token( }, Some(res.clone()), ); - } else if face_hat!(face) + } else if face_hat!(face.state) .remote_interests .values() .any(|i| i.options.tokens() && i.matches(res)) @@ -196,16 +196,16 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + id: face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst), ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), + wire_expr: Resource::get_best_key(res, "", face.state.id), }, }), }, @@ -276,19 +276,16 @@ fn forget_simple_token( } } -pub(super) fn token_new_face( - tables: &mut Tables, - face: &mut Arc, - send_declare: &mut SendDeclare, -) { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for token in face_hat!(src_face).remote_tokens.values() { - propagate_simple_token_to(tables, face, token, &mut src_face.clone(), send_declare); +pub(super) fn token_new_face(tables: &mut Tables, face: &mut Face, send_declare: &mut SendDeclare) { + for src_face in tables.faces.values().cloned().collect::>() { + for token in face_hat!(src_face.state).remote_tokens.values() { + propagate_simple_token_to( + tables, + face, + token, + &mut src_face.state.clone(), + send_declare, + ); } } } @@ -310,7 +307,7 @@ fn make_token_id(res: &Arc, face: &mut Arc, mode: InterestM pub(crate) fn declare_token_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -322,15 +319,15 @@ pub(crate) fn declare_token_interest( if let Some(res) = res.as_ref() { if aggregate { if tables.faces.values().any(|src_face| { - face_hat!(src_face) + face_hat!(src_face.state) .remote_tokens .values() .any(|token| token.context.is_some() && token.matches(res)) }) { - let id = make_token_id(res, face, mode); + let id = make_token_id(res, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(res, face, true); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -345,16 +342,16 @@ pub(crate) fn declare_token_interest( for src_face in tables .faces .values() - .filter(|f| f.whatami == WhatAmI::Client) + .filter(|f| f.state.whatami == WhatAmI::Client) .cloned() - .collect::>>() + .collect::>() { - for token in face_hat!(src_face).remote_tokens.values() { + for token in face_hat!(src_face.state).remote_tokens.values() { if token.context.is_some() && token.matches(res) { - let id = make_token_id(token, face, mode); + let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::default(), @@ -372,15 +369,15 @@ pub(crate) fn declare_token_interest( for src_face in tables .faces .values() - .filter(|f| f.whatami == WhatAmI::Client) + .filter(|f| f.state.whatami == WhatAmI::Client) .cloned() - .collect::>>() + .collect::>() { - for token in face_hat!(src_face).remote_tokens.values() { - let id = make_token_id(token, face, mode); + for token in face_hat!(src_face.state).remote_tokens.values() { + let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -400,7 +397,7 @@ impl HatTokenTrait for HatCode { fn declare_token( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, _node_id: NodeId, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs index b13a867072..34417a174c 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs @@ -26,7 +26,7 @@ use super::{ }; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, interests::RemoteInterest, resource::Resource, tables::{Tables, TablesLock}, @@ -39,7 +39,7 @@ impl HatInterestTrait for HatCode { &self, tables: &mut Tables, _tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -80,18 +80,20 @@ impl HatInterestTrait for HatCode { ) } if mode.future() { - face_hat_mut!(face).remote_interests.insert( - id, - RemoteInterest { - res: res.as_ref().map(|res| res.deref().clone()), - options, - mode, - }, - ); + face_hat_mut!(&mut face.state.clone()) + .remote_interests + .insert( + id, + RemoteInterest { + res: res.as_ref().map(|res| res.deref().clone()), + options, + mode, + }, + ); } if mode.current() { send_declare( - face, + &face.state, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs index 5f1258ae3c..ede9817687 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs @@ -39,7 +39,7 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, interests::RemoteInterest, pubsub::SubscriberInfo, resource::{NodeId, Resource, SessionContext}, @@ -62,15 +62,15 @@ fn send_sourced_subscription_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -96,22 +96,27 @@ fn send_sourced_subscription_to_net_children( #[inline] fn propagate_simple_subscription_to( _tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, _sub_info: &SubscriberInfo, src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id) - && !face_hat!(dst_face).local_subs.contains_key(res) - && dst_face.whatami == WhatAmI::Client + if (src_face.id != dst_face.state.id) + && !face_hat!(dst_face.state).local_subs.contains_key(res) + && dst_face.state.whatami == WhatAmI::Client { - if dst_face.whatami != WhatAmI::Client { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); - let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); + if dst_face.state.whatami != WhatAmI::Client { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); + let key_expr = + Resource::decl_key(res, dst_face, push_declaration_profile(&dst_face.state)); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -125,7 +130,7 @@ fn propagate_simple_subscription_to( Some(res.clone()), ); } else { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| i.options.subscribers() && i.matches(res)) @@ -143,13 +148,20 @@ fn propagate_simple_subscription_to( } else { res }; - if !face_hat!(dst_face).local_subs.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); - send_declare( + if !face_hat!(dst_face.state).local_subs.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + push_declaration_profile(&dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -175,12 +187,7 @@ fn propagate_simple_subscription( src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_subscription_to( tables, &mut dst_face, @@ -265,7 +272,7 @@ fn declare_linkstatepeer_subscription( fn register_simple_subscription( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -273,7 +280,7 @@ fn register_simple_subscription( // Register subscription { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if ctx.subs.is_none() { get_mut_unchecked(ctx).subs = Some(*sub_info); @@ -282,18 +289,20 @@ fn register_simple_subscription( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).subs = Some(*sub_info); } } } - face_hat_mut!(face).remote_subs.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_subs + .insert(id, res.clone()); } fn declare_simple_subscription( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -301,7 +310,14 @@ fn declare_simple_subscription( ) { register_simple_subscription(tables, face, id, res, sub_info); let zid = tables.zid; - register_linkstatepeer_subscription(tables, face, res, sub_info, zid, send_declare); + register_linkstatepeer_subscription( + tables, + &mut face.state.clone(), + res, + sub_info, + zid, + send_declare, + ); } #[inline] @@ -319,7 +335,7 @@ fn simple_subs(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -331,7 +347,7 @@ fn simple_subs(res: &Arc) -> Vec> { fn remote_simple_subs(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.subs.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.subs.is_some()) } #[inline] @@ -346,15 +362,15 @@ fn send_forget_sourced_subscription_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -383,9 +399,9 @@ fn propagate_forget_simple_subscription( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -399,7 +415,7 @@ fn propagate_forget_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_subs .keys() .cloned() @@ -408,12 +424,13 @@ fn propagate_forget_simple_subscription( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_subs(&m, &face) || remote_linkstatepeer_subs(tables, &m)) + && (remote_simple_subs(&m, &face.state) + || remote_linkstatepeer_subs(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -676,26 +693,28 @@ fn make_sub_id(res: &Arc, face: &mut Arc, mode: InterestMod pub(super) fn declare_sub_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, aggregate: bool, send_declare: &mut SendDeclare, ) { - if mode.current() && face.whatami == WhatAmI::Client { + if mode.current() && face.state.whatami == WhatAmI::Client { let interest_id = Some(id); if let Some(res) = res.as_ref() { if aggregate { if hat!(tables).linkstatepeer_subs.iter().any(|sub| { sub.context.is_some() && sub.matches(res) - && (remote_simple_subs(sub, face) || remote_linkstatepeer_subs(tables, sub)) + && (remote_simple_subs(sub, &face.state.clone()) + || remote_linkstatepeer_subs(tables, sub)) }) { - let id = make_sub_id(res, face, mode); - let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); + let id = make_sub_id(res, &mut face.state.clone(), mode); + let wire_expr = + Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -713,13 +732,14 @@ pub(super) fn declare_sub_interest( for sub in &hat!(tables).linkstatepeer_subs { if sub.context.is_some() && sub.matches(res) - && (remote_simple_subs(sub, face) || remote_linkstatepeer_subs(tables, sub)) + && (remote_simple_subs(sub, &face.state) + || remote_linkstatepeer_subs(tables, sub)) { - let id = make_sub_id(sub, face, mode); + let id = make_sub_id(sub, &mut face.state.clone(), mode); let wire_expr = - Resource::decl_key(sub, face, push_declaration_profile(face)); + Resource::decl_key(sub, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -738,12 +758,14 @@ pub(super) fn declare_sub_interest( } else { for sub in &hat!(tables).linkstatepeer_subs { if sub.context.is_some() - && (remote_simple_subs(sub, face) || remote_linkstatepeer_subs(tables, sub)) + && (remote_simple_subs(sub, &face.state) + || remote_linkstatepeer_subs(tables, sub)) { - let id = make_sub_id(sub, face, mode); - let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(face)); + let id = make_sub_id(sub, &mut face.state.clone(), mode); + let wire_expr = + Resource::decl_key(sub, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -766,16 +788,23 @@ impl HatPubSubTrait for HatCode { fn declare_subscription( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, node_id: NodeId, send_declare: &mut SendDeclare, ) { - if face.whatami != WhatAmI::Client { - if let Some(peer) = get_peer(tables, face, node_id) { - declare_linkstatepeer_subscription(tables, face, res, sub_info, peer, send_declare) + if face.state.whatami != WhatAmI::Client { + if let Some(peer) = get_peer(tables, &face.state, node_id) { + declare_linkstatepeer_subscription( + tables, + &mut face.state.clone(), + res, + sub_info, + peer, + send_declare, + ) } } else { declare_simple_subscription(tables, face, id, res, sub_info, send_declare) @@ -824,8 +853,8 @@ impl HatPubSubTrait for HatCode { .session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Client && f.subs.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Client && f.subs.is_some()) + .then_some(f.face.state.zid) }) .collect(), }, @@ -837,14 +866,14 @@ impl HatPubSubTrait for HatCode { fn get_publications(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.subscribers() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -878,13 +907,13 @@ impl HatPubSubTrait for HatCode { { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| { + route.entry(face.state.id).or_insert_with(|| { let key_expr = Resource::get_best_key( expr.prefix, expr.suffix, - face.id, + face.state.id, ); - (face.clone(), key_expr.to_owned(), source) + (face.state.clone(), key_expr.to_owned(), source) }); } } @@ -941,11 +970,16 @@ impl HatPubSubTrait for HatCode { for (sid, context) in &mres.session_ctxs { if context.subs.is_some() - && (source_type == WhatAmI::Client || context.face.whatami == WhatAmI::Client) + && (source_type == WhatAmI::Client + || context.face.state.whatami == WhatAmI::Client) { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - (context.face.clone(), key_expr.to_owned(), NodeId::default()) + ( + context.face.state.clone(), + key_expr.to_owned(), + NodeId::default(), + ) }); } } @@ -984,7 +1018,9 @@ impl HatPubSubTrait for HatCode { if let Some(direction) = net.trees[source].directions[sub_idx.index()] { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| face.clone()); + route + .entry(face.state.id) + .or_insert_with(|| face.state.clone()); } } } @@ -1025,7 +1061,7 @@ impl HatPubSubTrait for HatCode { if context.subs.is_some() { matching_subscriptions .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs index bf48c7cf4c..07eae0f36c 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs @@ -45,7 +45,7 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, resource::{NodeId, Resource, SessionContext}, tables::{QueryTargetQabl, QueryTargetQablSet, RoutingExpr, Tables}, }, @@ -101,7 +101,7 @@ fn local_qabl_info( res.session_ctxs .values() .fold(info, |accu, ctx| { - if ctx.face.id != face.id && ctx.face.whatami != WhatAmI::Peer + if ctx.face.state.id != face.id && ctx.face.state.whatami != WhatAmI::Peer || face.whatami != WhatAmI::Peer { if let Some(info) = ctx.qabl.as_ref() { @@ -132,16 +132,16 @@ fn send_sourced_queryable_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face .as_ref() - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -173,29 +173,31 @@ fn propagate_simple_queryable( ) { let faces = tables.faces.values().cloned(); for mut dst_face in faces { - let info = local_qabl_info(tables, res, &dst_face); - let current = face_hat!(dst_face).local_qabls.get(res); + let info = local_qabl_info(tables, res, &dst_face.state); + let current = face_hat!(dst_face.state).local_qabls.get(res); if src_face .as_ref() - .map(|src_face| dst_face.id != src_face.id) + .map(|src_face| dst_face.state.id != src_face.id) .unwrap_or(true) && (current.is_none() || current.unwrap().1 != info) - && dst_face.whatami == WhatAmI::Client - && face_hat!(dst_face) + && dst_face.state.whatami == WhatAmI::Client + && face_hat!(dst_face.state) .remote_interests .values() .any(|i| i.options.queryables() && i.matches(res)) { - let id = current - .map(|c| c.0) - .unwrap_or(face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst)); - face_hat_mut!(&mut dst_face) + let id = current.map(|c| c.0).unwrap_or( + face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst), + ); + face_hat_mut!(&mut dst_face.state) .local_qabls .insert(res.clone(), (id, info)); - let push_declaration = push_declaration_profile(&dst_face); - let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); + let push_declaration = push_declaration_profile(&dst_face.state); + let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -290,7 +292,7 @@ fn declare_linkstatepeer_queryable( fn register_simple_queryable( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -300,17 +302,19 @@ fn register_simple_queryable( let res = get_mut_unchecked(res); get_mut_unchecked( res.session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))), ) .qabl = Some(*qabl_info); } - face_hat_mut!(face).remote_qabls.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_qabls + .insert(id, res.clone()); } fn declare_simple_queryable( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -319,7 +323,14 @@ fn declare_simple_queryable( register_simple_queryable(tables, face, id, res, qabl_info); let local_details = local_peer_qabl_info(tables, res); let zid = tables.zid; - register_linkstatepeer_queryable(tables, Some(face), res, &local_details, zid, send_declare); + register_linkstatepeer_queryable( + tables, + Some(&mut face.state.clone()), + res, + &local_details, + zid, + send_declare, + ); } #[inline] @@ -337,7 +348,7 @@ fn simple_qabls(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -349,7 +360,7 @@ fn simple_qabls(res: &Arc) -> Vec> { fn remote_simple_qabls(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.qabl.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.qabl.is_some()) } #[inline] @@ -364,15 +375,15 @@ fn send_forget_sourced_queryable_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -401,9 +412,9 @@ fn propagate_forget_simple_queryable( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -417,7 +428,7 @@ fn propagate_forget_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(&mut face) + for res in face_hat!(&mut face.state) .local_qabls .keys() .cloned() @@ -426,13 +437,13 @@ fn propagate_forget_simple_queryable( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_qabls(&m, &face) + && (remote_simple_qabls(&m, &face.state) || remote_linkstatepeer_qabls(tables, &m)) }) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -701,8 +712,11 @@ fn insert_target_for_qabls( if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { if net.distances.len() > qabl_idx.index() { - let key_expr = - Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key( + expr.prefix, + expr.suffix, + face.state.id, + ); route.push(QueryTargetQabl { direction: (face.clone(), key_expr.to_owned(), source), info: Some(QueryableInfoType { @@ -750,28 +764,29 @@ fn make_qabl_id( pub(super) fn declare_qabl_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, aggregate: bool, send_declare: &mut SendDeclare, ) { - if mode.current() && face.whatami == WhatAmI::Client { + if mode.current() && face.state.whatami == WhatAmI::Client { let interest_id = Some(id); if let Some(res) = res.as_ref() { if aggregate { if hat!(tables).linkstatepeer_qabls.iter().any(|qabl| { qabl.context.is_some() && qabl.matches(res) - && (remote_simple_qabls(qabl, face) + && (remote_simple_qabls(qabl, &face.state) || remote_linkstatepeer_qabls(tables, qabl)) }) { - let info = local_qabl_info(tables, res, face); - let id = make_qabl_id(res, face, mode, info); - let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); + let info = local_qabl_info(tables, res, &face.state); + let id = make_qabl_id(res, &mut face.state.clone(), mode, info); + let wire_expr = + Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -790,15 +805,15 @@ pub(super) fn declare_qabl_interest( for qabl in hat!(tables).linkstatepeer_qabls.iter() { if qabl.context.is_some() && qabl.matches(res) - && (remote_simple_qabls(qabl, face) + && (remote_simple_qabls(qabl, &face.state) || remote_linkstatepeer_qabls(tables, qabl)) { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); let key_expr = - Resource::decl_key(qabl, face, push_declaration_profile(face)); + Resource::decl_key(qabl, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -818,13 +833,15 @@ pub(super) fn declare_qabl_interest( } else { for qabl in hat!(tables).linkstatepeer_qabls.iter() { if qabl.context.is_some() - && (remote_simple_qabls(qabl, face) || remote_linkstatepeer_qabls(tables, qabl)) + && (remote_simple_qabls(qabl, &face.state) + || remote_linkstatepeer_qabls(tables, qabl)) { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); - let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(face)); + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); + let key_expr = + Resource::decl_key(qabl, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -848,16 +865,23 @@ impl HatQueriesTrait for HatCode { fn declare_queryable( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, node_id: NodeId, send_declare: &mut SendDeclare, ) { - if face.whatami != WhatAmI::Client { - if let Some(peer) = get_peer(tables, face, node_id) { - declare_linkstatepeer_queryable(tables, face, res, qabl_info, peer, send_declare); + if face.state.whatami != WhatAmI::Client { + if let Some(peer) = get_peer(tables, &face.state, node_id) { + declare_linkstatepeer_queryable( + tables, + &mut face.state.clone(), + res, + qabl_info, + peer, + send_declare, + ); } } else { declare_simple_queryable(tables, face, id, res, qabl_info, send_declare); @@ -906,8 +930,8 @@ impl HatQueriesTrait for HatCode { .session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Client && f.qabl.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Client && f.qabl.is_some()) + .then_some(f.face.state.zid) }) .collect(), }, @@ -919,14 +943,14 @@ impl HatQueriesTrait for HatCode { fn get_queriers(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.queryables() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -987,7 +1011,7 @@ impl HatQueriesTrait for HatCode { ); for (sid, context) in &mres.session_ctxs { - if source_type == WhatAmI::Client || context.face.whatami == WhatAmI::Client { + if source_type == WhatAmI::Client || context.face.state.whatami == WhatAmI::Client { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); if let Some(qabl_info) = context.qabl.as_ref() { route.push(QueryTargetQabl { @@ -1055,7 +1079,7 @@ impl HatQueriesTrait for HatCode { } { matching_queryables .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } @@ -1083,7 +1107,9 @@ fn insert_faces_for_qbls( if let Some(direction) = net.trees[source].directions[qbl_idx.index()] { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| face.clone()); + route + .entry(face.state.id) + .or_insert_with(|| face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/token.rs b/zenoh/src/net/routing/hat/linkstate_peer/token.rs index f55d59f5fe..a87a60f831 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/token.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/token.rs @@ -34,7 +34,11 @@ use super::{ res_hat, res_hat_mut, HatCode, HatContext, HatFace, HatTables, }; use crate::net::routing::{ - dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, + dispatcher::{ + face::{Face, FaceState}, + interests::RemoteInterest, + tables::Tables, + }, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, }; @@ -51,15 +55,15 @@ fn send_sourced_token_to_net_clildren( for child in clildren { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -85,21 +89,26 @@ fn send_sourced_token_to_net_clildren( #[inline] fn propagate_simple_token_to( tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.zid == tables.zid) - && !face_hat!(dst_face).local_tokens.contains_key(res) - && dst_face.whatami == WhatAmI::Client + if (src_face.id != dst_face.state.id || dst_face.state.zid == tables.zid) + && !face_hat!(dst_face.state).local_tokens.contains_key(res) + && dst_face.state.whatami == WhatAmI::Client { - if dst_face.whatami != WhatAmI::Client { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); - let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); + if dst_face.state.whatami != WhatAmI::Client { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); + let key_expr = + Resource::decl_key(res, dst_face, push_declaration_profile(&dst_face.state)); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -113,7 +122,7 @@ fn propagate_simple_token_to( Some(res.clone()), ); } else { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| i.options.tokens() && i.matches(res)) @@ -131,13 +140,20 @@ fn propagate_simple_token_to( } else { res }; - if !face_hat!(dst_face).local_tokens.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, push_declaration_profile(dst_face)); - send_declare( + if !face_hat!(dst_face.state).local_tokens.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + push_declaration_profile(&dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -162,12 +178,7 @@ fn propagate_simple_token( src_face: &mut Arc, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_token_to(tables, &mut dst_face, res, src_face, send_declare); } } @@ -239,16 +250,11 @@ fn declare_linkstatepeer_token( register_linkstatepeer_token(tables, face, res, peer, send_declare); } -fn register_simple_token( - _tables: &mut Tables, - face: &mut Arc, - id: TokenId, - res: &mut Arc, -) { +fn register_simple_token(_tables: &mut Tables, face: &Face, id: TokenId, res: &mut Arc) { // Register liveliness { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if !ctx.token { get_mut_unchecked(ctx).token = true; @@ -257,25 +263,27 @@ fn register_simple_token( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).token = true; } } } - face_hat_mut!(face).remote_tokens.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_tokens + .insert(id, res.clone()); } fn declare_simple_token( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, send_declare: &mut SendDeclare, ) { register_simple_token(tables, face, id, res); let zid = tables.zid; - register_linkstatepeer_token(tables, face, res, zid, send_declare); + register_linkstatepeer_token(tables, &mut face.state.clone(), res, zid, send_declare); } #[inline] @@ -293,7 +301,7 @@ fn simple_tokens(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -305,7 +313,7 @@ fn simple_tokens(res: &Arc) -> Vec> { fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) + .any(|ctx| (ctx.face.state.id != face.id || face.zid == tables.zid) && ctx.token) } #[inline] @@ -320,15 +328,15 @@ fn send_forget_sourced_token_to_net_clildren( for child in clildren { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(&someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(&someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -357,9 +365,9 @@ fn propagate_forget_simple_token( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -373,7 +381,7 @@ fn propagate_forget_simple_token( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_tokens .keys() .cloned() @@ -382,13 +390,13 @@ fn propagate_forget_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(tables, &m, &face) + && (remote_simple_tokens(tables, &m, &face.state) || remote_linkstatepeer_tokens(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -645,27 +653,28 @@ fn make_token_id(res: &Arc, face: &mut Arc, mode: InterestM pub(crate) fn declare_token_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, aggregate: bool, send_declare: &mut SendDeclare, ) { - if mode.current() && face.whatami == WhatAmI::Client { + if mode.current() && face.state.whatami == WhatAmI::Client { let interest_id = Some(id); if let Some(res) = res.as_ref() { if aggregate { if hat!(tables).linkstatepeer_tokens.iter().any(|token| { token.context.is_some() && token.matches(res) - && (remote_simple_tokens(tables, token, face) + && (remote_simple_tokens(tables, token, &face.state) || remote_linkstatepeer_tokens(tables, token)) }) { - let id = make_token_id(res, face, mode); - let wire_expr = Resource::decl_key(res, face, push_declaration_profile(face)); + let id = make_token_id(res, &mut face.state.clone(), mode); + let wire_expr = + Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -680,14 +689,14 @@ pub(crate) fn declare_token_interest( for token in &hat!(tables).linkstatepeer_tokens { if token.context.is_some() && token.matches(res) - && (remote_simple_tokens(tables, token, face) + && (remote_simple_tokens(tables, token, &face.state) || remote_linkstatepeer_tokens(tables, token)) { - let id = make_token_id(token, face, mode); + let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = - Resource::decl_key(token, face, push_declaration_profile(face)); + Resource::decl_key(token, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -703,13 +712,14 @@ pub(crate) fn declare_token_interest( } else { for token in &hat!(tables).linkstatepeer_tokens { if token.context.is_some() - && (remote_simple_tokens(tables, token, face) + && (remote_simple_tokens(tables, token, &face.state) || remote_linkstatepeer_tokens(tables, token)) { - let id = make_token_id(token, face, mode); - let wire_expr = Resource::decl_key(token, face, push_declaration_profile(face)); + let id = make_token_id(token, &mut face.state.clone(), mode); + let wire_expr = + Resource::decl_key(token, face, push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -729,16 +739,22 @@ impl HatTokenTrait for HatCode { fn declare_token( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, node_id: NodeId, _interest_id: Option, send_declare: &mut SendDeclare, ) { - if face.whatami != WhatAmI::Client { - if let Some(peer) = get_peer(tables, face, node_id) { - declare_linkstatepeer_token(tables, face, res, peer, send_declare) + if face.state.whatami != WhatAmI::Client { + if let Some(peer) = get_peer(tables, &face.state, node_id) { + declare_linkstatepeer_token( + tables, + &mut face.state.clone(), + res, + peer, + send_declare, + ) } } else { declare_simple_token(tables, face, id, res, send_declare) diff --git a/zenoh/src/net/routing/hat/mod.rs b/zenoh/src/net/routing/hat/mod.rs index 34488baf5e..1283652522 100644 --- a/zenoh/src/net/routing/hat/mod.rs +++ b/zenoh/src/net/routing/hat/mod.rs @@ -141,7 +141,7 @@ pub(crate) trait HatInterestTrait { &self, tables: &mut Tables, tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -157,7 +157,7 @@ pub(crate) trait HatPubSubTrait { fn declare_subscription( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -199,7 +199,7 @@ pub(crate) trait HatQueriesTrait { fn declare_queryable( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -256,7 +256,7 @@ pub(crate) trait HatTokenTrait { fn declare_token( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, node_id: NodeId, diff --git a/zenoh/src/net/routing/hat/p2p_peer/interests.rs b/zenoh/src/net/routing/hat/p2p_peer/interests.rs index 85f9de6b65..81f9742273 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/interests.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/interests.rs @@ -30,7 +30,7 @@ use super::{ }; use crate::net::routing::{ dispatcher::{ - face::{FaceState, InterestState}, + face::{Face, FaceState, InterestState}, interests::{ CurrentInterest, CurrentInterestCleanup, PendingCurrentInterest, RemoteInterest, }, @@ -40,31 +40,28 @@ use crate::net::routing::{ hat::{CurrentFutureTrait, HatInterestTrait, SendDeclare}, }; -pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Arc) { - if face.whatami != WhatAmI::Client { - for mut src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if face.whatami == WhatAmI::Router { +pub(super) fn interests_new_face(tables: &mut Tables, face: &Face) { + if face.state.whatami != WhatAmI::Client { + for mut src_face in tables.faces.values().cloned().collect::>() { + if face.state.whatami == WhatAmI::Router { for RemoteInterest { res, options, .. } in - face_hat_mut!(&mut src_face).remote_interests.values() + face_hat_mut!(&mut src_face.state).remote_interests.values() { - let id = face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst); - get_mut_unchecked(face).local_interests.insert( - id, - InterestState { - options: *options, - res: res.as_ref().map(|res| (*res).clone()), - finalized: false, - }, - ); + let id = face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst); + get_mut_unchecked(&mut face.state.clone()) + .local_interests + .insert( + id, + InterestState { + options: *options, + res: res.as_ref().map(|res| (*res).clone()), + finalized: false, + }, + ); let wire_expr = res.as_ref().map(|res| { - Resource::decl_key(res, face, super::push_declaration_profile(face)) + Resource::decl_key(res, face, super::push_declaration_profile(&face.state)) }); - face.intercept_interest( + face.state.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -87,7 +84,7 @@ impl HatInterestTrait for HatCode { &self, tables: &mut Tables, tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -127,45 +124,53 @@ impl HatInterestTrait for HatCode { send_declare, ) } - face_hat_mut!(face).remote_interests.insert( - id, - RemoteInterest { - res: res.as_ref().map(|res| (*res).clone()), - options, - mode, - }, - ); + face_hat_mut!(&mut face.state.clone()) + .remote_interests + .insert( + id, + RemoteInterest { + res: res.as_ref().map(|res| (*res).clone()), + options, + mode, + }, + ); let interest = Arc::new(CurrentInterest { - src_face: face.clone(), + src_face: face.state.clone(), src_interest_id: id, mode, }); - if face.whatami == WhatAmI::Client { + if face.state.whatami == WhatAmI::Client { let propagated_mode = if mode.future() { InterestMode::CurrentFuture } else { mode }; for dst_face in tables.faces.values_mut().filter(|f| { - f.whatami == WhatAmI::Router - || (f.whatami == WhatAmI::Peer + f.state.whatami == WhatAmI::Router + || (f.state.whatami == WhatAmI::Peer && options.tokens() && mode == InterestMode::Current - && !initial_interest(f).map(|i| i.finalized).unwrap_or(true)) + && !initial_interest(&f.state) + .map(|i| i.finalized) + .unwrap_or(true)) }) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - get_mut_unchecked(dst_face).local_interests.insert( - id, - InterestState { - options, - res: res.as_ref().map(|res| (*res).clone()), - finalized: propagated_mode == InterestMode::Future, - }, - ); + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + get_mut_unchecked(&mut dst_face.state) + .local_interests + .insert( + id, + InterestState { + options, + res: res.as_ref().map(|res| (*res).clone()), + finalized: propagated_mode == InterestMode::Future, + }, + ); if mode.current() { - let dst_face_mut = get_mut_unchecked(dst_face); + let dst_face_mut = get_mut_unchecked(&mut dst_face.state); let cancellation_token = dst_face_mut.task_controller.get_cancellation_token(); let rejection_token = dst_face_mut.task_controller.get_cancellation_token(); dst_face_mut.pending_current_interests.insert( @@ -177,16 +182,20 @@ impl HatInterestTrait for HatCode { }, ); CurrentInterestCleanup::spawn_interest_clean_up_task( - dst_face, + &dst_face.state, tables_ref, id, tables.interests_timeout, ); } let wire_expr = res.as_ref().map(|res| { - Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)) + Resource::decl_key( + res, + dst_face, + super::push_declaration_profile(&dst_face.state), + ) }); - dst_face.intercept_interest( + dst_face.state.intercept_interest( &mut Interest { id, mode: propagated_mode, @@ -226,8 +235,8 @@ impl HatInterestTrait for HatCode { fn undeclare_interest(&self, tables: &mut Tables, face: &mut Arc, id: InterestId) { if let Some(interest) = face_hat_mut!(face).remote_interests.remove(&id) { if !tables.faces.values().any(|f| { - f.whatami == WhatAmI::Client - && face_hat!(f) + f.state.whatami == WhatAmI::Client + && face_hat!(f.state) .remote_interests .values() .any(|i| *i == interest) @@ -235,19 +244,20 @@ impl HatInterestTrait for HatCode { for dst_face in tables .faces .values_mut() - .filter(|f| f.whatami == WhatAmI::Router) + .filter(|f| f.state.whatami == WhatAmI::Router) { for id in dst_face + .state .local_interests .keys() .cloned() .collect::>() { - let local_interest = dst_face.local_interests.get(&id).unwrap(); + let local_interest = dst_face.state.local_interests.get(&id).unwrap(); if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.intercept_interest( + dst_face.state.intercept_interest( &mut Interest { id, mode: InterestMode::Final, @@ -261,7 +271,9 @@ impl HatInterestTrait for HatCode { }, local_interest.res.as_ref(), ); - get_mut_unchecked(dst_face).local_interests.remove(&id); + get_mut_unchecked(&mut dst_face.state) + .local_interests + .remove(&id); } } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/mod.rs b/zenoh/src/net/routing/hat/p2p_peer/mod.rs index 44cc3a3500..1f38c5b4be 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/mod.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/mod.rs @@ -163,10 +163,10 @@ impl HatBaseTrait for HatCode { face: &mut Face, send_declare: &mut SendDeclare, ) -> ZResult<()> { - interests_new_face(tables, &mut face.state); - pubsub_new_face(tables, &mut face.state, send_declare); - queries_new_face(tables, &mut face.state, send_declare); - token_new_face(tables, &mut face.state, send_declare); + interests_new_face(tables, face); + pubsub_new_face(tables, face, send_declare); + queries_new_face(tables, face, send_declare); + token_new_face(tables, face, send_declare); tables.disable_all_routes(); Ok(()) } @@ -195,10 +195,10 @@ impl HatBaseTrait for HatCode { ); } - interests_new_face(tables, &mut face.state); - pubsub_new_face(tables, &mut face.state, send_declare); - queries_new_face(tables, &mut face.state, send_declare); - token_new_face(tables, &mut face.state, send_declare); + interests_new_face(tables, face); + pubsub_new_face(tables, face, send_declare); + queries_new_face(tables, face, send_declare); + token_new_face(tables, face, send_declare); tables.disable_all_routes(); if face.state.whatami == WhatAmI::Peer { diff --git a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs index f9e24e9aa5..95c1c07e4a 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs @@ -35,7 +35,7 @@ use crate::{ key_expr::KeyExpr, net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, interests::RemoteInterest, pubsub::SubscriberInfo, resource::{NodeId, Resource, SessionContext}, @@ -50,23 +50,30 @@ use crate::{ #[inline] fn propagate_simple_subscription_to( _tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, _sub_info: &SubscriberInfo, - src_face: &mut Arc, + src_face: &Face, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id) - && !face_hat!(dst_face).local_subs.contains_key(res) - && (src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) + if (src_face.state.id != dst_face.state.id) + && !face_hat!(dst_face.state).local_subs.contains_key(res) + && (src_face.state.whatami == WhatAmI::Client || dst_face.state.whatami == WhatAmI::Client) { - if dst_face.whatami != WhatAmI::Client { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); - send_declare( + if dst_face.state.whatami != WhatAmI::Client { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + super::push_declaration_profile(&dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -80,7 +87,7 @@ fn propagate_simple_subscription_to( Some(res.clone()), ); } else { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| i.options.subscribers() && i.matches(res)) @@ -98,16 +105,20 @@ fn propagate_simple_subscription_to( } else { res }; - if !face_hat!(dst_face).local_subs.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); + if !face_hat!(dst_face.state).local_subs.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); let key_expr = Resource::decl_key( res, dst_face, - super::push_declaration_profile(dst_face), + super::push_declaration_profile(&dst_face.state), ); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -130,15 +141,10 @@ fn propagate_simple_subscription( tables: &mut Tables, res: &Arc, sub_info: &SubscriberInfo, - src_face: &mut Arc, + src_face: &Face, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_subscription_to( tables, &mut dst_face, @@ -152,7 +158,7 @@ fn propagate_simple_subscription( fn register_simple_subscription( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -160,7 +166,7 @@ fn register_simple_subscription( // Register subscription { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if ctx.subs.is_none() { get_mut_unchecked(ctx).subs = Some(*sub_info); @@ -169,18 +175,20 @@ fn register_simple_subscription( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).subs = Some(*sub_info); } } } - face_hat_mut!(face).remote_subs.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_subs + .insert(id, res.clone()); } fn declare_simple_subscription( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -192,9 +200,9 @@ fn declare_simple_subscription( // This introduced a buffer overflow on windows // TODO: Let's deactivate this on windows until Fixed #[cfg(not(windows))] - if face.whatami == WhatAmI::Client { + if face.state.whatami == WhatAmI::Client { for mcast_group in &tables.mcast_groups { - if mcast_group.mcast_group != face.mcast_group { + if mcast_group.mcast_group != face.state.mcast_group { mcast_group.intercept_declare( &mut Declare { interest_id: None, @@ -219,7 +227,7 @@ fn simple_subs(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -231,7 +239,7 @@ fn simple_subs(res: &Arc) -> Vec> { fn remote_simple_subs(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.subs.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.subs.is_some()) } fn propagate_forget_simple_subscription( @@ -240,9 +248,9 @@ fn propagate_forget_simple_subscription( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -256,7 +264,7 @@ fn propagate_forget_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_subs .keys() .cloned() @@ -264,11 +272,11 @@ fn propagate_forget_simple_subscription( { if !res.context().matches.iter().any(|m| { m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_subs(&m, &face)) + .is_some_and(|m| m.context.is_some() && remote_simple_subs(&m, &face.state)) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -369,24 +377,19 @@ fn forget_simple_subscription( pub(super) fn pubsub_new_face( tables: &mut Tables, - face: &mut Arc, + face: &mut Face, send_declare: &mut SendDeclare, ) { - if face.whatami != WhatAmI::Client { + if face.state.whatami != WhatAmI::Client { let sub_info = SubscriberInfo; - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for sub in face_hat!(src_face).remote_subs.values() { + for src_face in tables.faces.values().cloned().collect::>() { + for sub in face_hat!(src_face.state).remote_subs.values() { propagate_simple_subscription_to( tables, face, sub, &sub_info, - &mut src_face.clone(), + &src_face, send_declare, ); } @@ -411,29 +414,29 @@ fn make_sub_id(res: &Arc, face: &mut Arc, mode: InterestMod pub(super) fn declare_sub_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, aggregate: bool, send_declare: &mut SendDeclare, ) { - if mode.current() && face.whatami == WhatAmI::Client { + if mode.current() && face.state.whatami == WhatAmI::Client { let interest_id = Some(id); if let Some(res) = res.as_ref() { if aggregate { if tables.faces.values().any(|src_face| { - src_face.id != face.id - && face_hat!(src_face) + src_face.state.id != face.state.id + && face_hat!(src_face.state) .remote_subs .values() .any(|sub| sub.context.is_some() && sub.matches(res)) }) { - let id = make_sub_id(res, face, mode); + let id = make_sub_id(res, &mut face.state.clone(), mode); let wire_expr = - Resource::decl_key(res, face, super::push_declaration_profile(face)); + Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -448,23 +451,18 @@ pub(super) fn declare_sub_interest( ); } } else { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if src_face.id != face.id { - for sub in face_hat!(src_face).remote_subs.values() { + for src_face in tables.faces.values().cloned().collect::>() { + if src_face.state.id != face.state.id { + for sub in face_hat!(src_face.state).remote_subs.values() { if sub.context.is_some() && sub.matches(res) { - let id = make_sub_id(sub, face, mode); + let id = make_sub_id(sub, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key( sub, face, - super::push_declaration_profile(face), + super::push_declaration_profile(&face.state), ); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -483,19 +481,17 @@ pub(super) fn declare_sub_interest( } } } else { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if src_face.id != face.id { - for sub in face_hat!(src_face).remote_subs.values() { - let id = make_sub_id(sub, face, mode); - let wire_expr = - Resource::decl_key(sub, face, super::push_declaration_profile(face)); - send_declare( + for src_face in tables.faces.values().cloned().collect::>() { + if src_face.state.id != face.state.id { + for sub in face_hat!(src_face.state).remote_subs.values() { + let id = make_sub_id(sub, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + sub, face, + super::push_declaration_profile(&face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -519,7 +515,7 @@ impl HatPubSubTrait for HatCode { fn declare_subscription( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -545,14 +541,14 @@ impl HatPubSubTrait for HatCode { // Compute the list of known suscriptions (keys) let mut subs = HashMap::new(); for src_face in tables.faces.values() { - for sub in face_hat!(src_face).remote_subs.values() { + for sub in face_hat!(src_face.state).remote_subs.values() { // Insert the key in the list of known suscriptions let srcs = subs.entry(sub.clone()).or_insert_with(Sources::empty); // Append src_face as a suscription source in the proper list - match src_face.whatami { - WhatAmI::Router => srcs.routers.push(src_face.zid), - WhatAmI::Peer => srcs.peers.push(src_face.zid), - WhatAmI::Client => srcs.clients.push(src_face.zid), + match src_face.state.whatami { + WhatAmI::Router => srcs.routers.push(src_face.state.zid), + WhatAmI::Peer => srcs.peers.push(src_face.state.zid), + WhatAmI::Client => srcs.clients.push(src_face.state.zid), } } } @@ -562,14 +558,14 @@ impl HatPubSubTrait for HatCode { fn get_publications(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.subscribers() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -608,9 +604,9 @@ impl HatPubSubTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami == WhatAmI::Router) + .filter(|f| f.state.whatami == WhatAmI::Router) { - if !face.local_interests.values().any(|interest| { + if !face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.subscribers() && interest @@ -618,26 +614,28 @@ impl HatPubSubTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), expr.full_expr())) .unwrap_or(true) - }) || face_hat!(face) + }) || face_hat!(face.state) .remote_subs .values() .any(|sub| KeyExpr::keyexpr_intersect(sub.expr(), expr.full_expr())) { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.insert( - face.id, - (face.clone(), key_expr.to_owned(), NodeId::default()), + face.state.id, + (face.state.clone(), key_expr.to_owned(), NodeId::default()), ); } } for face in tables.faces.values().filter(|f| { - f.whatami == WhatAmI::Peer - && !initial_interest(f).map(|i| i.finalized).unwrap_or(true) + f.state.whatami == WhatAmI::Peer + && !initial_interest(&f.state) + .map(|i| i.finalized) + .unwrap_or(true) }) { - route.entry(face.id).or_insert_with(|| { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); - (face.clone(), key_expr.to_owned(), NodeId::default()) + route.entry(face.state.id).or_insert_with(|| { + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); + (face.state.clone(), key_expr.to_owned(), NodeId::default()) }); } } @@ -654,11 +652,16 @@ impl HatPubSubTrait for HatCode { for (sid, context) in &mres.session_ctxs { if context.subs.is_some() - && (source_type == WhatAmI::Client || context.face.whatami == WhatAmI::Client) + && (source_type == WhatAmI::Client + || context.face.state.whatami == WhatAmI::Client) { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - (context.face.clone(), key_expr.to_owned(), NodeId::default()) + ( + context.face.state.clone(), + key_expr.to_owned(), + NodeId::default(), + ) }); } } @@ -701,7 +704,7 @@ impl HatPubSubTrait for HatCode { if context.subs.is_some() { matching_subscriptions .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/queries.rs b/zenoh/src/net/routing/hat/p2p_peer/queries.rs index ff50a3a9b2..3c95c8cdd6 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/queries.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/queries.rs @@ -41,7 +41,7 @@ use crate::{ key_expr::KeyExpr, net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, resource::{NodeId, Resource, SessionContext}, tables::{QueryTargetQabl, QueryTargetQablSet, RoutingExpr, Tables}, }, @@ -66,7 +66,7 @@ fn local_qabl_info( res.session_ctxs .values() .fold(None, |accu, ctx| { - if ctx.face.id != face.id { + if ctx.face.state.id != face.id { if let Some(info) = ctx.qabl.as_ref() { Some(match accu { Some(accu) => merge_qabl_infos(accu, info), @@ -85,39 +85,46 @@ fn local_qabl_info( #[inline] fn propagate_simple_queryable_to( tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, - src_face: &Option<&mut Arc>, + src_face: &Option<&Face>, send_declare: &mut SendDeclare, ) { - let info = local_qabl_info(tables, res, dst_face); - let current = face_hat!(dst_face).local_qabls.get(res); + let info = local_qabl_info(tables, res, &dst_face.state); + let current = face_hat!(dst_face.state).local_qabls.get(res); if src_face .as_ref() - .map(|src_face| dst_face.id != src_face.id) + .map(|src_face| dst_face.state.id != src_face.state.id) .unwrap_or(true) && (current.is_none() || current.unwrap().1 != info) - && (dst_face.whatami != WhatAmI::Client - || face_hat!(dst_face) + && (dst_face.state.whatami != WhatAmI::Client + || face_hat!(dst_face.state) .remote_interests .values() .any(|i| i.options.queryables() && i.matches(res))) && src_face .as_ref() .map(|src_face| { - src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client + src_face.state.whatami == WhatAmI::Client + || dst_face.state.whatami == WhatAmI::Client }) .unwrap_or(true) { - let id = current - .map(|c| c.0) - .unwrap_or(face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst)); - face_hat_mut!(dst_face) + let id = current.map(|c| c.0).unwrap_or( + face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst), + ); + face_hat_mut!(&mut dst_face.state) .local_qabls .insert(res.clone(), (id, info)); - let key_expr = Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); - send_declare( + let key_expr = Resource::decl_key( + res, dst_face, + super::push_declaration_profile(&dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -137,22 +144,17 @@ fn propagate_simple_queryable_to( fn propagate_simple_queryable( tables: &mut Tables, res: &Arc, - src_face: Option<&mut Arc>, + src_face: Option<&Face>, send_declare: &mut SendDeclare, ) { - let faces = tables - .faces - .values() - .cloned() - .collect::>>(); - for mut dst_face in faces { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_queryable_to(tables, &mut dst_face, res, &src_face, send_declare); } } fn register_simple_queryable( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -162,17 +164,19 @@ fn register_simple_queryable( let res = get_mut_unchecked(res); get_mut_unchecked( res.session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))), ) .qabl = Some(*qabl_info); } - face_hat_mut!(face).remote_qabls.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_qabls + .insert(id, res.clone()); } fn declare_simple_queryable( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -188,7 +192,7 @@ fn simple_qabls(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -200,7 +204,7 @@ fn simple_qabls(res: &Arc) -> Vec> { fn remote_simple_qabls(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.qabl.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.qabl.is_some()) } fn propagate_forget_simple_queryable( @@ -209,9 +213,9 @@ fn propagate_forget_simple_queryable( send_declare: &mut SendDeclare, ) { for face in tables.faces.values_mut() { - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -225,7 +229,7 @@ fn propagate_forget_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_qabls .keys() .cloned() @@ -233,11 +237,11 @@ fn propagate_forget_simple_queryable( { if !res.context().matches.iter().any(|m| { m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_qabls(&m, face)) + .is_some_and(|m| m.context.is_some() && remote_simple_qabls(&m, &face.state)) }) { - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -343,24 +347,13 @@ fn forget_simple_queryable( pub(super) fn queries_new_face( tables: &mut Tables, - face: &mut Arc, + face: &mut Face, send_declare: &mut SendDeclare, ) { - if face.whatami != WhatAmI::Client { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for qabl in face_hat!(src_face).remote_qabls.values() { - propagate_simple_queryable_to( - tables, - face, - qabl, - &Some(&mut src_face.clone()), - send_declare, - ); + if face.state.whatami != WhatAmI::Client { + for src_face in tables.faces.values().cloned().collect::>() { + for qabl in face_hat!(src_face.state).remote_qabls.values() { + propagate_simple_queryable_to(tables, face, qabl, &Some(&src_face), send_declare); } } } @@ -394,30 +387,30 @@ fn make_qabl_id( pub(super) fn declare_qabl_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, aggregate: bool, send_declare: &mut SendDeclare, ) { - if mode.current() && face.whatami == WhatAmI::Client { + if mode.current() && face.state.whatami == WhatAmI::Client { let interest_id = Some(id); if let Some(res) = res.as_ref() { if aggregate { if tables.faces.values().any(|src_face| { - src_face.id != face.id - && face_hat!(src_face) + src_face.state.id != face.state.id + && face_hat!(src_face.state) .remote_qabls .values() .any(|qabl| qabl.context.is_some() && qabl.matches(res)) }) { - let info = local_qabl_info(tables, res, face); - let id = make_qabl_id(res, face, mode, info); + let info = local_qabl_info(tables, res, &face.state); + let id = make_qabl_id(res, &mut face.state.clone(), mode, info); let wire_expr = - Resource::decl_key(res, face, super::push_declaration_profile(face)); + Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -433,24 +426,19 @@ pub(super) fn declare_qabl_interest( ); } } else { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if src_face.id != face.id { - for qabl in face_hat!(src_face).remote_qabls.values() { + for src_face in tables.faces.values().cloned().collect::>() { + if src_face.state.id != face.state.id { + for qabl in face_hat!(src_face.state).remote_qabls.values() { if qabl.context.is_some() && qabl.matches(res) { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); let key_expr = Resource::decl_key( qabl, face, - super::push_declaration_profile(face), + super::push_declaration_profile(&face.state), ); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -470,24 +458,19 @@ pub(super) fn declare_qabl_interest( } } } else { - for src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if src_face.id != face.id { - for qabl in face_hat!(src_face).remote_qabls.values() { + for src_face in tables.faces.values().cloned().collect::>() { + if src_face.state.id != face.state.id { + for qabl in face_hat!(src_face.state).remote_qabls.values() { if qabl.context.is_some() { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); let key_expr = Resource::decl_key( qabl, face, - super::push_declaration_profile(face), + super::push_declaration_profile(&face.state), ); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -513,7 +496,7 @@ impl HatQueriesTrait for HatCode { fn declare_queryable( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -539,14 +522,14 @@ impl HatQueriesTrait for HatCode { // Compute the list of known queryables (keys) let mut qabls = HashMap::new(); for src_face in tables.faces.values() { - for qabl in face_hat!(src_face).remote_qabls.values() { + for qabl in face_hat!(src_face.state).remote_qabls.values() { // Insert the key in the list of known queryables let srcs = qabls.entry(qabl.clone()).or_insert_with(Sources::empty); // Append src_face as a queryable source in the proper list - match src_face.whatami { - WhatAmI::Router => srcs.routers.push(src_face.zid), - WhatAmI::Peer => srcs.peers.push(src_face.zid), - WhatAmI::Client => srcs.clients.push(src_face.zid), + match src_face.state.whatami { + WhatAmI::Router => srcs.routers.push(src_face.state.zid), + WhatAmI::Peer => srcs.peers.push(src_face.state.zid), + WhatAmI::Client => srcs.clients.push(src_face.state.zid), } } } @@ -556,14 +539,14 @@ impl HatQueriesTrait for HatCode { fn get_queriers(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.queryables() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -603,9 +586,9 @@ impl HatQueriesTrait for HatCode { for face in tables .faces .values() - .filter(|f| f.whatami == WhatAmI::Router) + .filter(|f| f.state.whatami == WhatAmI::Router) { - if !face.local_interests.values().any(|interest| { + if !face.state.local_interests.values().any(|interest| { interest.finalized && interest.options.queryables() && interest @@ -613,12 +596,12 @@ impl HatQueriesTrait for HatCode { .as_ref() .map(|res| KeyExpr::keyexpr_include(res.expr(), expr.full_expr())) .unwrap_or(true) - }) || face_hat!(face) + }) || face_hat!(face.state) .remote_qabls .values() .any(|sub| KeyExpr::keyexpr_intersect(sub.expr(), expr.full_expr())) { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.push(QueryTargetQabl { direction: (face.clone(), key_expr.to_owned(), NodeId::default()), info: None, @@ -627,10 +610,12 @@ impl HatQueriesTrait for HatCode { } for face in tables.faces.values().filter(|f| { - f.whatami == WhatAmI::Peer - && !initial_interest(f).map(|i| i.finalized).unwrap_or(true) + f.state.whatami == WhatAmI::Peer + && !initial_interest(&f.state) + .map(|i| i.finalized) + .unwrap_or(true) }) { - let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.push(QueryTargetQabl { direction: (face.clone(), key_expr.to_owned(), NodeId::default()), info: None, @@ -649,7 +634,7 @@ impl HatQueriesTrait for HatCode { let mres = mres.upgrade().unwrap(); let complete = DEFAULT_INCLUDER.includes(mres.expr().as_bytes(), key_expr.as_bytes()); for (sid, context) in &mres.session_ctxs { - if source_type == WhatAmI::Client || context.face.whatami == WhatAmI::Client { + if source_type == WhatAmI::Client || context.face.state.whatami == WhatAmI::Client { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); if let Some(qabl_info) = context.qabl.as_ref() { route.push(QueryTargetQabl { @@ -706,7 +691,7 @@ impl HatQueriesTrait for HatCode { } { matching_queryables .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/p2p_peer/token.rs b/zenoh/src/net/routing/hat/p2p_peer/token.rs index f7bbf06b60..05d2c1b679 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/token.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/token.rs @@ -28,7 +28,11 @@ use zenoh_sync::get_mut_unchecked; use super::{face_hat, face_hat_mut, HatCode, HatFace, INITIAL_INTEREST_ID}; use crate::net::routing::{ - dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, + dispatcher::{ + face::{Face, FaceState}, + interests::RemoteInterest, + tables::Tables, + }, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, }; @@ -42,9 +46,9 @@ fn new_token( // Is there any face that !res.session_ctxs.values().any(|ctx| { ctx.token // declared the token - && (ctx.face.id != src_face.id) // is not the face that just registered it - && (ctx.face.id != dst_face.id || dst_face.zid == tables.zid) // is not the face we are propagating to (except for local) - && (ctx.face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) + && (ctx.face.state.id != src_face.id) // is not the face that just registered it + && (ctx.face.state.id != dst_face.id || dst_face.zid == tables.zid) // is not the face we are propagating to (except for local) + && (ctx.face.state.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) // don't forward from/to router/peers }) } @@ -52,25 +56,32 @@ fn new_token( #[inline] fn propagate_simple_token_to( tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, src_face: &mut Arc, src_interest_id: Option, dst_interest_id: Option, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.zid == tables.zid) - && !face_hat!(dst_face).local_tokens.contains_key(res) - && (src_face.whatami == WhatAmI::Client || dst_face.whatami == WhatAmI::Client) - && new_token(tables, res, src_face, dst_face) + if (src_face.id != dst_face.state.id || dst_face.state.zid == tables.zid) + && !face_hat!(dst_face.state).local_tokens.contains_key(res) + && (src_face.whatami == WhatAmI::Client || dst_face.state.whatami == WhatAmI::Client) + && new_token(tables, res, src_face, &mut dst_face.state) { - if dst_face.whatami != WhatAmI::Client { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, super::push_declaration_profile(dst_face)); - send_declare( + if dst_face.state.whatami != WhatAmI::Client { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + super::push_declaration_profile(&dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: dst_interest_id, ext_qos: ext::QoSType::DECLARE, @@ -84,7 +95,7 @@ fn propagate_simple_token_to( Some(res.clone()), ); } else { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| { @@ -106,16 +117,20 @@ fn propagate_simple_token_to( } else { res }; - if !face_hat!(dst_face).local_tokens.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); + if !face_hat!(dst_face.state).local_tokens.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); let key_expr = Resource::decl_key( res, dst_face, - super::push_declaration_profile(dst_face), + super::push_declaration_profile(&dst_face.state), ); send_declare( - dst_face, + &dst_face.state, Declare { interest_id: dst_interest_id, ext_qos: ext::QoSType::DECLARE, @@ -141,12 +156,7 @@ fn propagate_simple_token( interest_id: Option, send_declare: &mut SendDeclare, ) { - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_token_to( tables, &mut dst_face, @@ -159,16 +169,11 @@ fn propagate_simple_token( } } -fn register_simple_token( - _tables: &mut Tables, - face: &mut Arc, - id: TokenId, - res: &mut Arc, -) { +fn register_simple_token(_tables: &mut Tables, face: &Face, id: TokenId, res: &mut Arc) { // Register liveliness { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if !ctx.token { get_mut_unchecked(ctx).token = true; @@ -177,18 +182,20 @@ fn register_simple_token( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).token = true; } } } - face_hat_mut!(face).remote_tokens.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_tokens + .insert(id, res.clone()); } fn declare_simple_token( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, interest_id: Option, @@ -196,12 +203,13 @@ fn declare_simple_token( ) { if let Some(interest_id) = interest_id { if let Some(interest) = face + .state .pending_current_interests .get(&interest_id) .map(|p| &p.interest) { if interest.mode == InterestMode::CurrentFuture { - register_simple_token(tables, &mut face.clone(), id, res); + register_simple_token(tables, face, id, res); } let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); @@ -217,7 +225,7 @@ fn declare_simple_token( Some(res.clone()), ); return; - } else if !face.local_interests.contains_key(&interest_id) { + } else if !face.state.local_interests.contains_key(&interest_id) { println!( "Received DeclareToken for {} from {} with unknown interest_id {}. Ignore.", res.expr(), @@ -228,7 +236,13 @@ fn declare_simple_token( } } register_simple_token(tables, face, id, res); - propagate_simple_token(tables, res, face, interest_id, send_declare); + propagate_simple_token( + tables, + res, + &mut face.state.clone(), + interest_id, + send_declare, + ); } #[inline] @@ -237,7 +251,7 @@ fn simple_tokens(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -249,7 +263,7 @@ fn simple_tokens(res: &Arc) -> Vec> { fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) + .any(|ctx| (ctx.face.state.id != face.id || face.zid == tables.zid) && ctx.token) } fn propagate_forget_simple_token( @@ -259,9 +273,9 @@ fn propagate_forget_simple_token( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -274,8 +288,8 @@ fn propagate_forget_simple_token( }, Some(res.clone()), ); - } else if src_face.id != face.id - && face_hat!(face) + } else if src_face.id != face.state.id + && face_hat!(face.state) .remote_interests .values() .any(|i| i.options.tokens() && i.matches(res) && !i.options.aggregate()) @@ -283,35 +297,36 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + id: face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst), ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), + wire_expr: Resource::get_best_key(res, "", face.state.id), }, }), }, Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_tokens .keys() .cloned() .collect::>>() { if !res.context().matches.iter().any(|m| { - m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_tokens(tables, &m, &face)) + m.upgrade().is_some_and(|m| { + m.context.is_some() && remote_simple_tokens(tables, &m, &face.state) + }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -324,7 +339,7 @@ fn propagate_forget_simple_token( }, Some(res.clone()), ); - } else if face_hat!(face) + } else if face_hat!(face.state) .remote_interests .values() .any(|i| i.options.tokens() && i.matches(&res) && !i.options.aggregate()) @@ -332,16 +347,16 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + id: face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst), ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(&res, "", face.id), + wire_expr: Resource::get_best_key(&res, "", face.state.id), }, }), }, @@ -444,24 +459,15 @@ fn forget_simple_token( } } -pub(super) fn token_new_face( - tables: &mut Tables, - face: &mut Arc, - send_declare: &mut SendDeclare, -) { - if face.whatami != WhatAmI::Client { - for mut src_face in tables - .faces - .values() - .cloned() - .collect::>>() - { - for token in face_hat!(src_face.clone()).remote_tokens.values() { +pub(super) fn token_new_face(tables: &mut Tables, face: &mut Face, send_declare: &mut SendDeclare) { + if face.state.whatami != WhatAmI::Client { + for mut src_face in tables.faces.values().cloned().collect::>() { + for token in face_hat!(src_face.state.clone()).remote_tokens.values() { propagate_simple_token_to( tables, face, token, - &mut src_face, + &mut src_face.state, None, Some(INITIAL_INTEREST_ID), send_declare, @@ -488,7 +494,7 @@ fn make_token_id(res: &Arc, face: &mut Arc, mode: InterestM pub(crate) fn declare_token_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -500,16 +506,16 @@ pub(crate) fn declare_token_interest( if let Some(res) = res.as_ref() { if aggregate { if tables.faces.values().any(|src_face| { - face_hat!(src_face) + face_hat!(src_face.state) .remote_tokens .values() .any(|token| token.context.is_some() && token.matches(res)) }) { - let id = make_token_id(res, face, mode); + let id = make_token_id(res, &mut face.state.clone(), mode); let wire_expr = - Resource::decl_key(res, face, super::push_declaration_profile(face)); + Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -524,20 +530,20 @@ pub(crate) fn declare_token_interest( for src_face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Router) + .filter(|f| f.state.whatami != WhatAmI::Router) .cloned() - .collect::>>() + .collect::>() { - for token in face_hat!(src_face).remote_tokens.values() { + for token in face_hat!(src_face.state).remote_tokens.values() { if token.context.is_some() && token.matches(res) { - let id = make_token_id(token, face, mode); + let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key( token, face, - super::push_declaration_profile(face), + super::push_declaration_profile(&face.state), ); send_declare( - face, + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -555,16 +561,19 @@ pub(crate) fn declare_token_interest( for src_face in tables .faces .values() - .filter(|f| f.whatami != WhatAmI::Router) + .filter(|f| f.state.whatami != WhatAmI::Router) .cloned() - .collect::>>() + .collect::>() { - for token in face_hat!(src_face).remote_tokens.values() { - let id = make_token_id(token, face, mode); - let wire_expr = - Resource::decl_key(token, face, super::push_declaration_profile(face)); - send_declare( + for token in face_hat!(src_face.state).remote_tokens.values() { + let id = make_token_id(token, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + token, face, + super::push_declaration_profile(&face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -584,7 +593,7 @@ impl HatTokenTrait for HatCode { fn declare_token( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, _node_id: NodeId, diff --git a/zenoh/src/net/routing/hat/router/interests.rs b/zenoh/src/net/routing/hat/router/interests.rs index ceb5c03dd9..1b94f5bc91 100644 --- a/zenoh/src/net/routing/hat/router/interests.rs +++ b/zenoh/src/net/routing/hat/router/interests.rs @@ -29,7 +29,7 @@ use super::{ }; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, interests::RemoteInterest, resource::Resource, tables::{Tables, TablesLock}, @@ -42,17 +42,17 @@ impl HatInterestTrait for HatCode { &self, tables: &mut Tables, _tables_ref: &Arc, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, mut options: InterestOptions, send_declare: &mut SendDeclare, ) { - if options.aggregate() && face.whatami == WhatAmI::Peer { + if options.aggregate() && face.state.whatami == WhatAmI::Peer { tracing::warn!( "Received Interest with aggregate=true from peer {}. Not supported!", - face.zid + face.state.zid ); options -= InterestOptions::AGGREGATE; } @@ -90,18 +90,20 @@ impl HatInterestTrait for HatCode { ) } if mode.future() { - face_hat_mut!(face).remote_interests.insert( - id, - RemoteInterest { - res: res.cloned(), - options, - mode, - }, - ); + face_hat_mut!(&mut face.state.clone()) + .remote_interests + .insert( + id, + RemoteInterest { + res: res.cloned(), + options, + mode, + }, + ); } if mode.current() { send_declare( - face, + &face.state, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/router/pubsub.rs b/zenoh/src/net/routing/hat/router/pubsub.rs index e841f0630e..130f0e0d29 100644 --- a/zenoh/src/net/routing/hat/router/pubsub.rs +++ b/zenoh/src/net/routing/hat/router/pubsub.rs @@ -39,7 +39,7 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, interests::RemoteInterest, pubsub::SubscriberInfo, resource::{NodeId, Resource, SessionContext}, @@ -62,15 +62,15 @@ fn send_sourced_subscription_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -96,25 +96,25 @@ fn send_sourced_subscription_to_net_children( #[inline] fn propagate_simple_subscription_to( tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, _sub_info: &SubscriberInfo, src_face: &mut Arc, full_peer_net: bool, send_declare: &mut SendDeclare, ) { - if src_face.id != dst_face.id - && !face_hat!(dst_face).local_subs.contains_key(res) + if src_face.id != dst_face.state.id + && !face_hat!(dst_face.state).local_subs.contains_key(res) && if full_peer_net { - dst_face.whatami == WhatAmI::Client + dst_face.state.whatami == WhatAmI::Client } else { - dst_face.whatami != WhatAmI::Router + dst_face.state.whatami != WhatAmI::Router && (src_face.whatami != WhatAmI::Peer - || dst_face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(src_face.zid, dst_face.zid)) + || dst_face.state.whatami != WhatAmI::Peer + || hat!(tables).failover_brokering(src_face.zid, dst_face.state.zid)) } { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| i.options.subscribers() && i.matches(res)) @@ -132,13 +132,20 @@ fn propagate_simple_subscription_to( } else { res }; - if !face_hat!(dst_face).local_subs.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_subs.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, push_declaration_profile(tables, dst_face)); - send_declare( + if !face_hat!(dst_face.state).local_subs.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_subs + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + push_declaration_profile(tables, &dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -164,12 +171,7 @@ fn propagate_simple_subscription( send_declare: &mut SendDeclare, ) { let full_peer_net = hat!(tables).full_net(WhatAmI::Peer); - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_subscription_to( tables, &mut dst_face, @@ -293,7 +295,7 @@ fn declare_linkstatepeer_subscription( fn register_simple_subscription( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -301,7 +303,7 @@ fn register_simple_subscription( // Register subscription { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if ctx.subs.is_none() { get_mut_unchecked(ctx).subs = Some(*sub_info); @@ -310,18 +312,20 @@ fn register_simple_subscription( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).subs = Some(*sub_info); } } } - face_hat_mut!(face).remote_subs.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_subs + .insert(id, res.clone()); } fn declare_simple_subscription( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, @@ -329,7 +333,14 @@ fn declare_simple_subscription( ) { register_simple_subscription(tables, face, id, res, sub_info); let zid = tables.zid; - register_router_subscription(tables, face, res, sub_info, zid, send_declare); + register_router_subscription( + tables, + &mut face.state.clone(), + res, + sub_info, + zid, + send_declare, + ); } #[inline] @@ -356,7 +367,7 @@ fn simple_subs(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -368,7 +379,7 @@ fn simple_subs(res: &Arc) -> Vec> { fn remote_simple_subs(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.subs.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.subs.is_some()) } #[inline] @@ -383,15 +394,15 @@ fn send_forget_sourced_subscription_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -420,9 +431,9 @@ fn propagate_forget_simple_subscription( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -436,7 +447,7 @@ fn propagate_forget_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(&mut face) + for res in face_hat!(&mut face.state) .local_subs .keys() .cloned() @@ -445,14 +456,14 @@ fn propagate_forget_simple_subscription( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_subs(&m, &face) + && (remote_simple_subs(&m, &face.state) || remote_linkstatepeer_subs(tables, &m) || remote_router_subs(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -480,25 +491,21 @@ fn propagate_forget_simple_subscription_to_peers( && res_hat!(res).router_subs.len() == 1 && res_hat!(res).router_subs.contains(&tables.zid) { - for mut face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if face.whatami == WhatAmI::Peer - && face_hat!(face).local_subs.contains_key(res) + for mut face in tables.faces.values().cloned().collect::>() { + if face.state.whatami == WhatAmI::Peer + && face_hat!(face.state).local_subs.contains_key(res) && !res.session_ctxs.values().any(|s| { - face.zid != s.face.zid + face.state.zid != s.face.state.zid && s.subs.is_some() - && (s.face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables).failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid))) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -832,30 +839,30 @@ pub(super) fn pubsub_linkstate_change( send_declare: &mut SendDeclare, ) { if let Some(mut src_face) = tables.get_face(zid).cloned() { - if hat!(tables).router_peers_failover_brokering && src_face.whatami == WhatAmI::Peer { - let to_forget = face_hat!(src_face) + if hat!(tables).router_peers_failover_brokering && src_face.state.whatami == WhatAmI::Peer { + let to_forget = face_hat!(src_face.state) .local_subs .keys() .filter(|res| { let client_subs = res .session_ctxs .values() - .any(|ctx| ctx.face.whatami == WhatAmI::Client && ctx.subs.is_some()); + .any(|ctx| ctx.face.state.whatami == WhatAmI::Client && ctx.subs.is_some()); !remote_router_subs(tables, res) && !client_subs && !res.session_ctxs.values().any(|ctx| { - ctx.face.whatami == WhatAmI::Peer - && src_face.id != ctx.face.id - && HatTables::failover_brokering_to(links, ctx.face.zid) + ctx.face.state.whatami == WhatAmI::Peer + && src_face.state.id != ctx.face.state.id + && HatTables::failover_brokering_to(links, ctx.face.state.zid) }) }) .cloned() .collect::>>(); for res in to_forget { - if let Some(id) = face_hat_mut!(&mut src_face).local_subs.remove(&res) { - let wire_expr = Resource::get_best_key(&res, "", src_face.id); + if let Some(id) = face_hat_mut!(&mut src_face.state).local_subs.remove(&res) { + let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face, + &src_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -872,19 +879,22 @@ pub(super) fn pubsub_linkstate_change( } for mut dst_face in tables.faces.values().cloned() { - if src_face.id != dst_face.id - && HatTables::failover_brokering_to(links, dst_face.zid) + if src_face.state.id != dst_face.state.id + && HatTables::failover_brokering_to(links, dst_face.state.zid) { - for res in face_hat!(src_face).remote_subs.values() { - if !face_hat!(dst_face).local_subs.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(&mut dst_face) + for res in face_hat!(src_face.state).remote_subs.values() { + if !face_hat!(dst_face.state).local_subs.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) .local_subs .insert(res.clone(), id); - let push_declaration = push_declaration_profile(tables, &dst_face); - let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); + let push_declaration = + push_declaration_profile(tables, &dst_face.state); + let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -922,7 +932,7 @@ fn make_sub_id(res: &Arc, face: &mut Arc, mode: InterestMod pub(crate) fn declare_sub_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -936,15 +946,18 @@ pub(crate) fn declare_sub_interest( if hat!(tables).router_subs.iter().any(|sub| { sub.context.is_some() && sub.matches(res) - && (remote_simple_subs(sub, face) + && (remote_simple_subs(sub, &face.state) || remote_linkstatepeer_subs(tables, sub) || remote_router_subs(tables, sub)) }) { - let id = make_sub_id(res, face, mode); - let wire_expr = - Resource::decl_key(res, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_sub_id(res, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + res, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -968,20 +981,25 @@ pub(crate) fn declare_sub_interest( .iter() .any(|r| *r != tables.zid) || sub.session_ctxs.values().any(|s| { - s.face.id != face.id + s.face.state.id != face.state.id && s.subs.is_some() - && (s.face.whatami == WhatAmI::Client - || face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables) - .failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables).failover_brokering( + s.face.state.zid, + face.state.zid, + ))) })) { - let id = make_sub_id(sub, face, mode); - let wire_expr = - Resource::decl_key(sub, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_sub_id(sub, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + sub, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1007,16 +1025,20 @@ pub(crate) fn declare_sub_interest( .any(|r| *r != tables.zid) || sub.session_ctxs.values().any(|s| { s.subs.is_some() - && (s.face.whatami != WhatAmI::Peer - || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(s.face.zid, face.zid)) + && (s.face.state.whatami != WhatAmI::Peer + || face.state.whatami != WhatAmI::Peer + || hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid)) })) { - let id = make_sub_id(sub, face, mode); - let wire_expr = - Resource::decl_key(sub, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_sub_id(sub, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + sub, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1039,25 +1061,32 @@ impl HatPubSubTrait for HatCode { fn declare_subscription( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: SubscriberId, res: &mut Arc, sub_info: &SubscriberInfo, node_id: NodeId, send_declare: &mut SendDeclare, ) { - match face.whatami { + match face.state.whatami { WhatAmI::Router => { - if let Some(router) = get_router(tables, face, node_id) { - declare_router_subscription(tables, face, res, sub_info, router, send_declare) + if let Some(router) = get_router(tables, &face.state.clone(), node_id) { + declare_router_subscription( + tables, + &mut face.state.clone(), + res, + sub_info, + router, + send_declare, + ) } } WhatAmI::Peer => { if hat!(tables).full_net(WhatAmI::Peer) { - if let Some(peer) = get_peer(tables, face, node_id) { + if let Some(peer) = get_peer(tables, &face.state, node_id) { declare_linkstatepeer_subscription( tables, - face, + &mut face.state.clone(), res, sub_info, peer, @@ -1138,8 +1167,8 @@ impl HatPubSubTrait for HatCode { s.session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Peer && f.subs.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Peer && f.subs.is_some()) + .then_some(f.face.state.zid) }) .collect() }, @@ -1147,8 +1176,8 @@ impl HatPubSubTrait for HatCode { .session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Client && f.subs.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Client && f.subs.is_some()) + .then_some(f.face.state.zid) }) .collect(), }, @@ -1160,14 +1189,14 @@ impl HatPubSubTrait for HatCode { fn get_publications(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.subscribers() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -1201,13 +1230,13 @@ impl HatPubSubTrait for HatCode { { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| { + route.entry(face.state.id).or_insert_with(|| { let key_expr = Resource::get_best_key( expr.prefix, expr.suffix, - face.id, + face.state.id, ); - (face.clone(), key_expr.to_owned(), source) + (face.state.clone(), key_expr.to_owned(), source) }); } } @@ -1286,10 +1315,14 @@ impl HatPubSubTrait for HatCode { if master || source_type == WhatAmI::Router { for (sid, context) in &mres.session_ctxs { - if context.subs.is_some() && context.face.whatami != WhatAmI::Router { + if context.subs.is_some() && context.face.state.whatami != WhatAmI::Router { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - (context.face.clone(), key_expr.to_owned(), NodeId::default()) + ( + context.face.state.clone(), + key_expr.to_owned(), + NodeId::default(), + ) }); } } @@ -1329,7 +1362,9 @@ impl HatPubSubTrait for HatCode { if let Some(direction) = net.trees[source].directions[sub_idx.index()] { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| face.clone()); + route + .entry(face.state.id) + .or_insert_with(|| face.state.clone()); } } } @@ -1385,10 +1420,10 @@ impl HatPubSubTrait for HatCode { if master { for (sid, context) in &mres.session_ctxs { - if context.subs.is_some() && context.face.whatami != WhatAmI::Router { + if context.subs.is_some() && context.face.state.whatami != WhatAmI::Router { matching_subscriptions .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/router/queries.rs b/zenoh/src/net/routing/hat/router/queries.rs index 1a1ebacb69..0aa1e4c1a8 100644 --- a/zenoh/src/net/routing/hat/router/queries.rs +++ b/zenoh/src/net/routing/hat/router/queries.rs @@ -45,7 +45,7 @@ use super::{ use crate::key_expr::KeyExpr; use crate::net::routing::{ dispatcher::{ - face::FaceState, + face::{Face, FaceState}, resource::{NodeId, Resource, SessionContext}, tables::{QueryTargetQabl, QueryTargetQablSet, RoutingExpr, Tables}, }, @@ -168,9 +168,9 @@ fn local_qabl_info( res.session_ctxs .values() .fold(info, |accu, ctx| { - if ctx.face.id != face.id && ctx.face.whatami != WhatAmI::Peer + if ctx.face.state.id != face.id && ctx.face.state.whatami != WhatAmI::Peer || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(ctx.face.zid, face.zid) + || hat!(tables).failover_brokering(ctx.face.state.zid, face.zid) { if let Some(info) = ctx.qabl.as_ref() { Some(match accu { @@ -200,16 +200,16 @@ fn send_sourced_queryable_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face .as_ref() - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -242,41 +242,43 @@ fn propagate_simple_queryable( let full_peers_net = hat!(tables).full_net(WhatAmI::Peer); let faces = tables.faces.values().cloned(); for mut dst_face in faces { - let info = local_qabl_info(tables, res, &dst_face); - let current = face_hat!(dst_face).local_qabls.get(res); + let info = local_qabl_info(tables, res, &dst_face.state); + let current = face_hat!(dst_face.state).local_qabls.get(res); if src_face .as_ref() - .map(|src_face| dst_face.id != src_face.id) + .map(|src_face| dst_face.state.id != src_face.id) .unwrap_or(true) && (current.is_none() || current.unwrap().1 != info) - && face_hat!(dst_face) + && face_hat!(dst_face.state) .remote_interests .values() .any(|i| i.options.queryables() && i.matches(res)) && if full_peers_net { - dst_face.whatami == WhatAmI::Client + dst_face.state.whatami == WhatAmI::Client } else { - dst_face.whatami != WhatAmI::Router + dst_face.state.whatami != WhatAmI::Router && src_face .as_ref() .map(|src_face| { src_face.whatami != WhatAmI::Peer - || dst_face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(src_face.zid, dst_face.zid) + || dst_face.state.whatami != WhatAmI::Peer + || hat!(tables).failover_brokering(src_face.zid, dst_face.state.zid) }) .unwrap_or(true) } { - let id = current - .map(|c| c.0) - .unwrap_or(face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst)); - face_hat_mut!(&mut dst_face) + let id = current.map(|c| c.0).unwrap_or( + face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst), + ); + face_hat_mut!(&mut dst_face.state) .local_qabls .insert(res.clone(), (id, info)); - let push_declaration = push_declaration_profile(tables, &dst_face); - let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); + let push_declaration = push_declaration_profile(tables, &dst_face.state); + let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -427,7 +429,7 @@ fn declare_linkstatepeer_queryable( fn register_simple_queryable( _tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -437,17 +439,19 @@ fn register_simple_queryable( let res = get_mut_unchecked(res); get_mut_unchecked( res.session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))), ) .qabl = Some(*qabl_info); } - face_hat_mut!(face).remote_qabls.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_qabls + .insert(id, res.clone()); } fn declare_simple_queryable( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, @@ -456,7 +460,14 @@ fn declare_simple_queryable( register_simple_queryable(tables, face, id, res, qabl_info); let local_details = local_router_qabl_info(tables, res); let zid = tables.zid; - register_router_queryable(tables, Some(face), res, &local_details, zid, send_declare); + register_router_queryable( + tables, + Some(&mut face.state.clone()), + res, + &local_details, + zid, + send_declare, + ); } #[inline] @@ -483,7 +494,7 @@ fn simple_qabls(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -495,7 +506,7 @@ fn simple_qabls(res: &Arc) -> Vec> { fn remote_simple_qabls(res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| ctx.face.id != face.id && ctx.qabl.is_some()) + .any(|ctx| ctx.face.state.id != face.id && ctx.qabl.is_some()) } #[inline] @@ -510,15 +521,15 @@ fn send_forget_sourced_queryable_to_net_children( for child in children { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -547,9 +558,9 @@ fn propagate_forget_simple_queryable( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -563,7 +574,7 @@ fn propagate_forget_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(&mut face) + for res in face_hat!(&mut face.state) .local_qabls .keys() .cloned() @@ -572,14 +583,14 @@ fn propagate_forget_simple_queryable( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_qabls(&m, &face) + && (remote_simple_qabls(&m, &face.state) || remote_linkstatepeer_qabls(tables, &m) || remote_router_qabls(tables, &m)) }) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -607,25 +618,21 @@ fn propagate_forget_simple_queryable_to_peers( && res_hat!(res).router_qabls.len() == 1 && res_hat!(res).router_qabls.contains_key(&tables.zid) { - for mut face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if face.whatami == WhatAmI::Peer - && face_hat!(face).local_qabls.contains_key(res) + for mut face in tables.faces.values().cloned().collect::>() { + if face.state.whatami == WhatAmI::Peer + && face_hat!(face.state).local_qabls.contains_key(res) && !res.session_ctxs.values().any(|s| { - face.zid != s.face.zid + face.state.zid != s.face.state.zid && s.qabl.is_some() - && (s.face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables).failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid))) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -938,30 +945,30 @@ pub(super) fn queries_linkstate_change( send_declare: &mut SendDeclare, ) { if let Some(mut src_face) = tables.get_face(zid).cloned() { - if hat!(tables).router_peers_failover_brokering && src_face.whatami == WhatAmI::Peer { - let to_forget = face_hat!(src_face) + if hat!(tables).router_peers_failover_brokering && src_face.state.whatami == WhatAmI::Peer { + let to_forget = face_hat!(src_face.state) .local_qabls .keys() .filter(|res| { let client_qabls = res .session_ctxs .values() - .any(|ctx| ctx.face.whatami == WhatAmI::Client && ctx.qabl.is_some()); + .any(|ctx| ctx.face.state.whatami == WhatAmI::Client && ctx.qabl.is_some()); !remote_router_qabls(tables, res) && !client_qabls && !res.session_ctxs.values().any(|ctx| { - ctx.face.whatami == WhatAmI::Peer - && src_face.id != ctx.face.id - && HatTables::failover_brokering_to(links, ctx.face.zid) + ctx.face.state.whatami == WhatAmI::Peer + && src_face.state.id != ctx.face.state.id + && HatTables::failover_brokering_to(links, ctx.face.state.zid) }) }) .cloned() .collect::>>(); for res in to_forget { - if let Some((id, _)) = face_hat_mut!(&mut src_face).local_qabls.remove(&res) { - let wire_expr = Resource::get_best_key(&res, "", src_face.id); + if let Some((id, _)) = face_hat_mut!(&mut src_face.state).local_qabls.remove(&res) { + let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face, + &src_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -978,20 +985,23 @@ pub(super) fn queries_linkstate_change( } for mut dst_face in tables.faces.values().cloned() { - if src_face.id != dst_face.id - && HatTables::failover_brokering_to(links, dst_face.zid) + if src_face.state.id != dst_face.state.id + && HatTables::failover_brokering_to(links, dst_face.state.zid) { - for res in face_hat!(src_face).remote_qabls.values() { - if !face_hat!(dst_face).local_qabls.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - let info = local_qabl_info(tables, res, &dst_face); - face_hat_mut!(&mut dst_face) + for res in face_hat!(src_face.state).remote_qabls.values() { + if !face_hat!(dst_face.state).local_qabls.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + let info = local_qabl_info(tables, res, &dst_face.state); + face_hat_mut!(&mut dst_face.state) .local_qabls .insert(res.clone(), (id, info)); - let push_declaration = push_declaration_profile(tables, &dst_face); - let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); + let push_declaration = + push_declaration_profile(tables, &dst_face.state); + let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -1078,8 +1088,11 @@ fn insert_target_for_qabls( if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { if net.distances.len() > qabl_idx.index() { - let key_expr = - Resource::get_best_key(expr.prefix, expr.suffix, face.id); + let key_expr = Resource::get_best_key( + expr.prefix, + expr.suffix, + face.state.id, + ); route.push(QueryTargetQabl { direction: (face.clone(), key_expr.to_owned(), source), info: Some(QueryableInfoType { @@ -1127,7 +1140,7 @@ fn make_qabl_id( pub(crate) fn declare_qabl_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -1147,21 +1160,26 @@ pub(crate) fn declare_qabl_interest( .keys() .any(|r| *r != tables.zid) || qabl.session_ctxs.values().any(|s| { - s.face.id != face.id + s.face.state.id != face.state.id && s.qabl.is_some() - && (s.face.whatami == WhatAmI::Client - || face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables) - .failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables).failover_brokering( + s.face.state.zid, + face.state.zid, + ))) })) }) { - let info = local_qabl_info(tables, res, face); - let id = make_qabl_id(res, face, mode, info); - let wire_expr = - Resource::decl_key(res, face, push_declaration_profile(tables, face)); - send_declare( + let info = local_qabl_info(tables, res, &face.state); + let id = make_qabl_id(res, &mut face.state.clone(), mode, info); + let wire_expr = Resource::decl_key( + res, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1187,17 +1205,21 @@ pub(crate) fn declare_qabl_interest( .any(|r| *r != tables.zid) || qabl.session_ctxs.values().any(|s| { s.qabl.is_some() - && (s.face.whatami != WhatAmI::Peer - || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(s.face.zid, face.zid)) + && (s.face.state.whatami != WhatAmI::Peer + || face.state.whatami != WhatAmI::Peer + || hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid)) })) { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); - let key_expr = - Resource::decl_key(qabl, face, push_declaration_profile(tables, face)); - send_declare( + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); + let key_expr = Resource::decl_key( + qabl, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1217,16 +1239,19 @@ pub(crate) fn declare_qabl_interest( } else { for qabl in hat!(tables).router_qabls.iter() { if qabl.context.is_some() - && (remote_simple_qabls(qabl, face) + && (remote_simple_qabls(qabl, &face.state) || remote_linkstatepeer_qabls(tables, qabl) || remote_router_qabls(tables, qabl)) { - let info = local_qabl_info(tables, qabl, face); - let id = make_qabl_id(qabl, face, mode, info); - let key_expr = - Resource::decl_key(qabl, face, push_declaration_profile(tables, face)); - send_declare( + let info = local_qabl_info(tables, qabl, &face.state); + let id = make_qabl_id(qabl, &mut face.state.clone(), mode, info); + let key_expr = Resource::decl_key( + qabl, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1250,25 +1275,32 @@ impl HatQueriesTrait for HatCode { fn declare_queryable( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: QueryableId, res: &mut Arc, qabl_info: &QueryableInfoType, node_id: NodeId, send_declare: &mut SendDeclare, ) { - match face.whatami { + match face.state.whatami { WhatAmI::Router => { - if let Some(router) = get_router(tables, face, node_id) { - declare_router_queryable(tables, face, res, qabl_info, router, send_declare) + if let Some(router) = get_router(tables, &face.state, node_id) { + declare_router_queryable( + tables, + &mut face.state.clone(), + res, + qabl_info, + router, + send_declare, + ) } } WhatAmI::Peer => { if hat!(tables).full_net(WhatAmI::Peer) { - if let Some(peer) = get_peer(tables, face, node_id) { + if let Some(peer) = get_peer(tables, &face.state, node_id) { declare_linkstatepeer_queryable( tables, - face, + &mut face.state.clone(), res, qabl_info, peer, @@ -1349,8 +1381,8 @@ impl HatQueriesTrait for HatCode { s.session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Peer && f.qabl.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Peer && f.qabl.is_some()) + .then_some(f.face.state.zid) }) .collect() }, @@ -1358,8 +1390,8 @@ impl HatQueriesTrait for HatCode { .session_ctxs .values() .filter_map(|f| { - (f.face.whatami == WhatAmI::Client && f.qabl.is_some()) - .then_some(f.face.zid) + (f.face.state.whatami == WhatAmI::Client && f.qabl.is_some()) + .then_some(f.face.state.zid) }) .collect(), }, @@ -1371,14 +1403,14 @@ impl HatQueriesTrait for HatCode { fn get_queriers(&self, tables: &Tables) -> Vec<(Arc, Sources)> { let mut result = HashMap::new(); for face in tables.faces.values() { - for interest in face_hat!(face).remote_interests.values() { + for interest in face_hat!(face.state).remote_interests.values() { if interest.options.queryables() { if let Some(res) = interest.res.as_ref() { let sources = result.entry(res.clone()).or_insert_with(Sources::default); - match face.whatami { - WhatAmI::Router => sources.routers.push(face.zid), - WhatAmI::Peer => sources.peers.push(face.zid), - WhatAmI::Client => sources.clients.push(face.zid), + match face.state.whatami { + WhatAmI::Router => sources.routers.push(face.state.zid), + WhatAmI::Peer => sources.peers.push(face.state.zid), + WhatAmI::Client => sources.clients.push(face.state.zid), } } } @@ -1462,7 +1494,7 @@ impl HatQueriesTrait for HatCode { if master || source_type == WhatAmI::Router { for (sid, context) in &mres.session_ctxs { - if context.face.whatami != WhatAmI::Router { + if context.face.state.whatami != WhatAmI::Router { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); if let Some(qabl_info) = context.qabl.as_ref() { route.push(QueryTargetQabl { @@ -1546,11 +1578,11 @@ impl HatQueriesTrait for HatCode { if match complete { true => context.qabl.is_some_and(|q| q.complete), false => context.qabl.is_some(), - } && context.face.whatami != WhatAmI::Router + } && context.face.state.whatami != WhatAmI::Router { matching_queryables .entry(*sid) - .or_insert_with(|| context.face.clone()); + .or_insert_with(|| context.face.state.clone()); } } } @@ -1579,7 +1611,9 @@ fn insert_faces_for_qbls( if let Some(direction) = net.trees[source].directions[qbl_idx.index()] { if net.graph.contains_node(direction) { if let Some(face) = tables.get_face(&net.graph[direction].zid) { - route.entry(face.id).or_insert_with(|| face.clone()); + route + .entry(face.state.id) + .or_insert_with(|| face.state.clone()); } } } diff --git a/zenoh/src/net/routing/hat/router/token.rs b/zenoh/src/net/routing/hat/router/token.rs index 52862ed7a0..d7d643e94a 100644 --- a/zenoh/src/net/routing/hat/router/token.rs +++ b/zenoh/src/net/routing/hat/router/token.rs @@ -34,7 +34,11 @@ use super::{ push_declaration_profile, res_hat, res_hat_mut, HatCode, HatContext, HatFace, HatTables, }; use crate::net::routing::{ - dispatcher::{face::FaceState, interests::RemoteInterest, tables::Tables}, + dispatcher::{ + face::{Face, FaceState}, + interests::RemoteInterest, + tables::Tables, + }, hat::{CurrentFutureTrait, HatTokenTrait, SendDeclare}, router::{NodeId, Resource, SessionContext}, }; @@ -51,15 +55,15 @@ fn send_sourced_token_to_net_clildren( for child in clildren { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let key_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -85,24 +89,24 @@ fn send_sourced_token_to_net_clildren( #[inline] fn propagate_simple_token_to( tables: &mut Tables, - dst_face: &mut Arc, + dst_face: &mut Face, res: &Arc, src_face: &mut Arc, full_peer_net: bool, send_declare: &mut SendDeclare, ) { - if (src_face.id != dst_face.id || dst_face.zid == tables.zid) - && !face_hat!(dst_face).local_tokens.contains_key(res) + if (src_face.id != dst_face.state.id || dst_face.state.zid == tables.zid) + && !face_hat!(dst_face.state).local_tokens.contains_key(res) && if full_peer_net { - dst_face.whatami == WhatAmI::Client + dst_face.state.whatami == WhatAmI::Client } else { - dst_face.whatami != WhatAmI::Router + dst_face.state.whatami != WhatAmI::Router && (src_face.whatami != WhatAmI::Peer - || dst_face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(src_face.zid, dst_face.zid)) + || dst_face.state.whatami != WhatAmI::Peer + || hat!(tables).failover_brokering(src_face.zid, dst_face.state.zid)) } { - let matching_interests = face_hat!(dst_face) + let matching_interests = face_hat!(dst_face.state) .remote_interests .values() .filter(|i| i.options.tokens() && i.matches(res)) @@ -120,13 +124,20 @@ fn propagate_simple_token_to( } else { res }; - if !face_hat!(dst_face).local_tokens.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(dst_face).local_tokens.insert(res.clone(), id); - let key_expr = - Resource::decl_key(res, dst_face, push_declaration_profile(tables, dst_face)); - send_declare( + if !face_hat!(dst_face.state).local_tokens.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) + .local_tokens + .insert(res.clone(), id); + let key_expr = Resource::decl_key( + res, dst_face, + push_declaration_profile(tables, &dst_face.state), + ); + send_declare( + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -151,12 +162,7 @@ fn propagate_simple_token( send_declare: &mut SendDeclare, ) { let full_peer_net = hat!(tables).full_net(WhatAmI::Peer); - for mut dst_face in tables - .faces - .values() - .cloned() - .collect::>>() - { + for mut dst_face in tables.faces.values().cloned().collect::>() { propagate_simple_token_to( tables, &mut dst_face, @@ -270,16 +276,11 @@ fn declare_linkstatepeer_token( register_router_token(tables, face, res, zid, send_declare); } -fn register_simple_token( - _tables: &mut Tables, - face: &mut Arc, - id: TokenId, - res: &mut Arc, -) { +fn register_simple_token(_tables: &mut Tables, face: &Face, id: TokenId, res: &mut Arc) { // Register liveliness { let res = get_mut_unchecked(res); - match res.session_ctxs.get_mut(&face.id) { + match res.session_ctxs.get_mut(&face.state.id) { Some(ctx) => { if !ctx.token { get_mut_unchecked(ctx).token = true; @@ -288,25 +289,27 @@ fn register_simple_token( None => { let ctx = res .session_ctxs - .entry(face.id) + .entry(face.state.id) .or_insert_with(|| Arc::new(SessionContext::new(face.clone()))); get_mut_unchecked(ctx).token = true; } } } - face_hat_mut!(face).remote_tokens.insert(id, res.clone()); + face_hat_mut!(&mut face.state.clone()) + .remote_tokens + .insert(id, res.clone()); } fn declare_simple_token( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, send_declare: &mut SendDeclare, ) { register_simple_token(tables, face, id, res); let zid = tables.zid; - register_router_token(tables, face, res, zid, send_declare); + register_router_token(tables, &mut face.state.clone(), res, zid, send_declare); } #[inline] @@ -333,7 +336,7 @@ fn simple_tokens(res: &Arc) -> Vec> { .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.clone()) + Some(ctx.face.state.clone()) } else { None } @@ -345,7 +348,7 @@ fn simple_tokens(res: &Arc) -> Vec> { fn remote_simple_tokens(tables: &Tables, res: &Arc, face: &Arc) -> bool { res.session_ctxs .values() - .any(|ctx| (ctx.face.id != face.id || face.zid == tables.zid) && ctx.token) + .any(|ctx| (ctx.face.state.id != face.id || face.zid == tables.zid) && ctx.token) } #[inline] @@ -360,15 +363,15 @@ fn send_forget_sourced_token_to_net_clildren( for child in clildren { if net.graph.contains_node(*child) { match tables.get_face(&net.graph[*child].zid).cloned() { - Some(mut someface) => { + Some(someface) => { if src_face - .map(|src_face| someface.id != src_face.id) + .map(|src_face| someface.state.id != src_face.id) .unwrap_or(true) { - let push_declaration = push_declaration_profile(tables, &someface); - let wire_expr = Resource::decl_key(res, &mut someface, push_declaration); + let push_declaration = push_declaration_profile(tables, &someface.state); + let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.intercept_declare( + someface.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -398,9 +401,9 @@ fn propagate_forget_simple_token( send_declare: &mut SendDeclare, ) { for mut face in tables.faces.values().cloned() { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -418,11 +421,11 @@ fn propagate_forget_simple_token( // cases where we don't have access to a Face as we didnt't receive an undeclaration and we // default to true. } else if src_face.map_or(true, |src_face| { - src_face.id != face.id + src_face.id != face.state.id && (src_face.whatami != WhatAmI::Peer - || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(src_face.zid, face.zid)) - }) && face_hat!(face) + || face.state.whatami != WhatAmI::Peer + || hat!(tables).failover_brokering(src_face.zid, face.state.zid)) + }) && face_hat!(face.state) .remote_interests .values() .any(|i| i.options.tokens() && i.matches(res) && !i.options.aggregate()) @@ -430,23 +433,23 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + id: face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst), ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(res, "", face.id), + wire_expr: Resource::get_best_key(res, "", face.state.id), }, }), }, Some(res.clone()), ); } - for res in face_hat!(&mut face) + for res in face_hat!(&mut face.state) .local_tokens .keys() .cloned() @@ -455,14 +458,14 @@ fn propagate_forget_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(tables, &m, &face) + && (remote_simple_tokens(tables, &m, &face.state) || remote_linkstatepeer_tokens(tables, &m) || remote_router_tokens(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -475,29 +478,29 @@ fn propagate_forget_simple_token( }, Some(res.clone()), ); - } else if face_hat!(face) + } else if face_hat!(face.state) .remote_interests .values() .any(|i| i.options.tokens() && i.matches(&res) && !i.options.aggregate()) && src_face.map_or(true, |src_face| { src_face.whatami != WhatAmI::Peer - || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(src_face.zid, face.zid) + || face.state.whatami != WhatAmI::Peer + || hat!(tables).failover_brokering(src_face.zid, face.state.zid) }) { // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, ext_tstamp: None, ext_nodeid: ext::NodeIdType::DEFAULT, body: DeclareBody::UndeclareToken(UndeclareToken { - id: face_hat!(face).next_id.fetch_add(1, Ordering::SeqCst), + id: face_hat!(face.state).next_id.fetch_add(1, Ordering::SeqCst), ext_wire_expr: WireExprType { - wire_expr: Resource::get_best_key(&res, "", face.id), + wire_expr: Resource::get_best_key(&res, "", face.state.id), }, }), }, @@ -518,25 +521,21 @@ fn propagate_forget_simple_token_to_peers( && res_hat!(res).router_tokens.len() == 1 && res_hat!(res).router_tokens.contains(&tables.zid) { - for mut face in tables - .faces - .values() - .cloned() - .collect::>>() - { - if face.whatami == WhatAmI::Peer - && face_hat!(face).local_tokens.contains_key(res) + for mut face in tables.faces.values().cloned().collect::>() { + if face.state.whatami == WhatAmI::Peer + && face_hat!(face.state).local_tokens.contains_key(res) && !res.session_ctxs.values().any(|s| { - face.zid != s.face.zid + face.state.zid != s.face.state.zid && s.token - && (s.face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables).failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid))) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face, + &face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -877,30 +876,30 @@ pub(super) fn token_linkstate_change( send_declare: &mut SendDeclare, ) { if let Some(mut src_face) = tables.get_face(zid).cloned() { - if hat!(tables).router_peers_failover_brokering && src_face.whatami == WhatAmI::Peer { - let to_forget = face_hat!(src_face) + if hat!(tables).router_peers_failover_brokering && src_face.state.whatami == WhatAmI::Peer { + let to_forget = face_hat!(src_face.state) .local_tokens .keys() .filter(|res| { let client_tokens = res .session_ctxs .values() - .any(|ctx| ctx.face.whatami == WhatAmI::Client && ctx.token); + .any(|ctx| ctx.face.state.whatami == WhatAmI::Client && ctx.token); !remote_router_tokens(tables, res) && !client_tokens && !res.session_ctxs.values().any(|ctx| { - ctx.face.whatami == WhatAmI::Peer - && src_face.id != ctx.face.id - && HatTables::failover_brokering_to(links, ctx.face.zid) + ctx.face.state.whatami == WhatAmI::Peer + && src_face.state.id != ctx.face.state.id + && HatTables::failover_brokering_to(links, ctx.face.state.zid) }) }) .cloned() .collect::>>(); for res in to_forget { - if let Some(id) = face_hat_mut!(&mut src_face).local_tokens.remove(&res) { - let wire_expr = Resource::get_best_key(&res, "", src_face.id); + if let Some(id) = face_hat_mut!(&mut src_face.state).local_tokens.remove(&res) { + let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face, + &src_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -917,19 +916,22 @@ pub(super) fn token_linkstate_change( } for mut dst_face in tables.faces.values().cloned() { - if src_face.id != dst_face.id - && HatTables::failover_brokering_to(links, dst_face.zid) + if src_face.state.id != dst_face.state.id + && HatTables::failover_brokering_to(links, dst_face.state.zid) { - for res in face_hat!(src_face).remote_tokens.values() { - if !face_hat!(dst_face).local_tokens.contains_key(res) { - let id = face_hat!(dst_face).next_id.fetch_add(1, Ordering::SeqCst); - face_hat_mut!(&mut dst_face) + for res in face_hat!(src_face.state).remote_tokens.values() { + if !face_hat!(dst_face.state).local_tokens.contains_key(res) { + let id = face_hat!(dst_face.state) + .next_id + .fetch_add(1, Ordering::SeqCst); + face_hat_mut!(&mut dst_face.state) .local_tokens .insert(res.clone(), id); - let push_declaration = push_declaration_profile(tables, &dst_face); - let key_expr = Resource::decl_key(res, &mut dst_face, push_declaration); + let push_declaration = + push_declaration_profile(tables, &dst_face.state); + let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face, + &dst_face.state, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -967,7 +969,7 @@ fn make_token_id(res: &Arc, face: &mut Arc, mode: InterestM pub(crate) fn declare_token_interest( tables: &mut Tables, - face: &mut Arc, + face: &Face, id: InterestId, res: Option<&mut Arc>, mode: InterestMode, @@ -975,8 +977,8 @@ pub(crate) fn declare_token_interest( send_declare: &mut SendDeclare, ) { if mode.current() - && (face.whatami == WhatAmI::Client - || (face.whatami == WhatAmI::Peer && !hat!(tables).full_net(WhatAmI::Peer))) + && (face.state.whatami == WhatAmI::Client + || (face.state.whatami == WhatAmI::Peer && !hat!(tables).full_net(WhatAmI::Peer))) { let interest_id = Some(id); if let Some(res) = res.as_ref() { @@ -984,15 +986,18 @@ pub(crate) fn declare_token_interest( if hat!(tables).router_tokens.iter().any(|token| { token.context.is_some() && token.matches(res) - && (remote_simple_tokens(tables, token, face) + && (remote_simple_tokens(tables, token, &face.state) || remote_linkstatepeer_tokens(tables, token) || remote_router_tokens(tables, token)) }) { - let id = make_token_id(res, face, mode); - let wire_expr = - Resource::decl_key(res, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_token_id(res, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + res, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1016,20 +1021,25 @@ pub(crate) fn declare_token_interest( .iter() .any(|r| *r != tables.zid) || token.session_ctxs.values().any(|s| { - s.face.id != face.id + s.face.state.id != face.state.id && s.token - && (s.face.whatami == WhatAmI::Client - || face.whatami == WhatAmI::Client - || (s.face.whatami == WhatAmI::Peer - && hat!(tables) - .failover_brokering(s.face.zid, face.zid))) + && (s.face.state.whatami == WhatAmI::Client + || face.state.whatami == WhatAmI::Client + || (s.face.state.whatami == WhatAmI::Peer + && hat!(tables).failover_brokering( + s.face.state.zid, + face.state.zid, + ))) })) { - let id = make_token_id(token, face, mode); - let wire_expr = - Resource::decl_key(token, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_token_id(token, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + token, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1055,16 +1065,20 @@ pub(crate) fn declare_token_interest( .any(|r| *r != tables.zid) || token.session_ctxs.values().any(|s| { s.token - && (s.face.whatami != WhatAmI::Peer - || face.whatami != WhatAmI::Peer - || hat!(tables).failover_brokering(s.face.zid, face.zid)) + && (s.face.state.whatami != WhatAmI::Peer + || face.state.whatami != WhatAmI::Peer + || hat!(tables) + .failover_brokering(s.face.state.zid, face.state.zid)) })) { - let id = make_token_id(token, face, mode); - let wire_expr = - Resource::decl_key(token, face, push_declaration_profile(tables, face)); - send_declare( + let id = make_token_id(token, &mut face.state.clone(), mode); + let wire_expr = Resource::decl_key( + token, face, + push_declaration_profile(tables, &face.state), + ); + send_declare( + &face.state, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1084,23 +1098,29 @@ impl HatTokenTrait for HatCode { fn declare_token( &self, tables: &mut Tables, - face: &mut Arc, + face: &Face, id: TokenId, res: &mut Arc, node_id: NodeId, _interest_id: Option, send_declare: &mut SendDeclare, ) { - match face.whatami { + match face.state.whatami { WhatAmI::Router => { - if let Some(router) = get_router(tables, face, node_id) { - declare_router_token(tables, face, res, router, send_declare) + if let Some(router) = get_router(tables, &face.state, node_id) { + declare_router_token(tables, &mut face.state.clone(), res, router, send_declare) } } WhatAmI::Peer => { if hat!(tables).full_net(WhatAmI::Peer) { - if let Some(peer) = get_peer(tables, face, node_id) { - declare_linkstatepeer_token(tables, face, res, peer, send_declare) + if let Some(peer) = get_peer(tables, &face.state, node_id) { + declare_linkstatepeer_token( + tables, + &mut face.state.clone(), + res, + peer, + send_declare, + ) } } else { declare_simple_token(tables, face, id, res, send_declare) diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index be2900c2ca..bb5a55d55f 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -76,11 +76,12 @@ impl Router { let zid = tables.zid; let fid = tables.face_counter; tables.face_counter += 1; - let newface = tables + let mut face = tables .faces .entry(fid) - .or_insert_with(|| { - FaceState::new( + .or_insert_with(|| Face { + tables: self.tables.clone(), + state: FaceState::new( fid, zid, WhatAmI::Client, @@ -92,15 +93,11 @@ impl Router { None, ctrl_lock.new_face(), true, - ) + ), }) .clone(); - tracing::debug!("New {}", newface); + tracing::debug!("New {}", face); - let mut face = Face { - tables: self.tables.clone(), - state: newface, - }; let mut declares = vec![]; ctrl_lock .new_local_face(&mut tables, &self.tables, &mut face, &mut |p, m, r| { @@ -129,11 +126,12 @@ impl Router { let ingress = ArcSwap::new(InterceptorsChain::empty().into()); let egress = ArcSwap::new(InterceptorsChain::empty().into()); let mux = Arc::new(Mux::new(transport.clone())); - let newface = tables + let mut face = tables .faces .entry(fid) - .or_insert_with(|| { - FaceState::new( + .or_insert_with(|| Face { + tables: self.tables.clone(), + state: FaceState::new( fid, zid, whatami, @@ -145,19 +143,14 @@ impl Router { Some(egress), ctrl_lock.new_face(), false, - ) + ), }) .clone(); - newface.set_interceptors_from_factories( + face.state.set_interceptors_from_factories( &tables.interceptors, tables.next_interceptor_version.load(Ordering::SeqCst), ); - tracing::debug!("New {}", newface); - - let mut face = Face { - tables: self.tables.clone(), - state: newface, - }; + tracing::debug!("New {}", face); let mut declares = vec![]; ctrl_lock.new_transport_unicast_face( diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 2e982639f8..e8f3ea9d4d 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -34,11 +34,7 @@ use crate::{ net::{ primitives::{DummyPrimitives, EPrimitives, Primitives}, routing::{ - dispatcher::{ - face::{Face, FaceState}, - pubsub::SubscriberInfo, - tables::Tables, - }, + dispatcher::{face::Face, pubsub::SubscriberInfo, tables::Tables}, router::*, RoutingContext, }, @@ -58,16 +54,16 @@ fn base_test() { let tables = router.tables.clone(); let primitives = Arc::new(DummyPrimitives {}); - let face = Arc::downgrade(&router.new_primitives(primitives).state); + let face = Arc::downgrade(&router.new_primitives(primitives)); register_expr( &tables, - &mut face.upgrade().unwrap(), + &face.upgrade().unwrap(), 1, &"one/two/three".into(), ); register_expr( &tables, - &mut face.upgrade().unwrap(), + &face.upgrade().unwrap(), 2, &"one/deux/trois".into(), ); @@ -77,7 +73,7 @@ fn base_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face.upgrade().unwrap(), + &face.upgrade().unwrap(), 0, &WireExpr::from(1).with_suffix("four/five"), &sub_info, @@ -153,11 +149,11 @@ fn match_test() { let tables = router.tables.clone(); let primitives = Arc::new(DummyPrimitives {}); - let face = Arc::downgrade(&router.new_primitives(primitives).state); + let face = Arc::downgrade(&router.new_primitives(primitives)); for (i, key_expr) in key_exprs.iter().enumerate() { register_expr( &tables, - &mut face.upgrade().unwrap(), + &face.upgrade().unwrap(), i.try_into().unwrap(), &(*key_expr).into(), ); @@ -199,7 +195,7 @@ fn multisub_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 0, &"sub".into(), &sub_info, @@ -215,7 +211,7 @@ fn multisub_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 1, &"sub".into(), &sub_info, @@ -265,26 +261,21 @@ async fn clean_test() { let face0 = &router.new_primitives(primitives); // -------------- - register_expr(&tables, &mut face0.state.clone(), 1, &"todrop1".into()); + register_expr(&tables, face0, 1, &"todrop1".into()); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1") .map(|res| Arc::downgrade(&res)); assert!(optres1.is_some()); let res1 = optres1.unwrap(); assert!(res1.upgrade().is_some()); - register_expr( - &tables, - &mut face0.state.clone(), - 2, - &"todrop1/todrop11".into(), - ); + register_expr(&tables, face0, 2, &"todrop1/todrop11".into()); let optres2 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1/todrop11") .map(|res| Arc::downgrade(&res)); assert!(optres2.is_some()); let res2 = optres2.unwrap(); assert!(res2.upgrade().is_some()); - register_expr(&tables, &mut face0.state.clone(), 3, &"**".into()); + register_expr(&tables, face0, 3, &"**".into()); let optres3 = Resource::get_resource(zread!(tables.tables)._get_root(), "**") .map(|res| Arc::downgrade(&res)); assert!(optres3.is_some()); @@ -307,7 +298,7 @@ async fn clean_test() { assert!(res3.upgrade().is_none()); // -------------- - register_expr(&tables, &mut face0.state.clone(), 1, &"todrop1".into()); + register_expr(&tables, face0, 1, &"todrop1".into()); let optres1 = Resource::get_resource(zread!(tables.tables)._get_root(), "todrop1") .map(|res| Arc::downgrade(&res)); assert!(optres1.is_some()); @@ -319,7 +310,7 @@ async fn clean_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 0, &"todrop1/todrop11".into(), &sub_info, @@ -335,7 +326,7 @@ async fn clean_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 1, &WireExpr::from(1).with_suffix("/todrop12"), &sub_info, @@ -384,11 +375,11 @@ async fn clean_test() { assert!(res3.upgrade().is_none()); // -------------- - register_expr(&tables, &mut face0.state.clone(), 2, &"todrop3".into()); + register_expr(&tables, face0, 2, &"todrop3".into()); declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 2, &"todrop3".into(), &sub_info, @@ -416,12 +407,12 @@ async fn clean_test() { assert!(res1.upgrade().is_none()); // -------------- - register_expr(&tables, &mut face0.state.clone(), 3, &"todrop4".into()); - register_expr(&tables, &mut face0.state.clone(), 4, &"todrop5".into()); + register_expr(&tables, face0, 3, &"todrop4".into()); + register_expr(&tables, face0, 4, &"todrop5".into()); declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 3, &"todrop5".into(), &sub_info, @@ -431,7 +422,7 @@ async fn clean_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.state.clone(), + face0, 4, &"todrop6".into(), &sub_info, @@ -596,10 +587,10 @@ fn client_test() { let sub_info = SubscriberInfo; let primitives0 = Arc::new(ClientPrimitives::new()); - let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone()).state); + let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone())); register_expr( &tables, - &mut face0.upgrade().unwrap(), + &face0.upgrade().unwrap(), 11, &"test/client".into(), ); @@ -619,7 +610,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face0.upgrade().unwrap(), + &face0.upgrade().unwrap(), 0, &WireExpr::from(11).with_suffix("/**"), &sub_info, @@ -628,7 +619,7 @@ fn client_test() { ); register_expr( &tables, - &mut face0.upgrade().unwrap(), + &face0.upgrade().unwrap(), 12, &WireExpr::from(11).with_suffix("/z1_pub1"), ); @@ -647,10 +638,10 @@ fn client_test() { ); let primitives1 = Arc::new(ClientPrimitives::new()); - let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone()).state); + let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone())); register_expr( &tables, - &mut face1.upgrade().unwrap(), + &face1.upgrade().unwrap(), 21, &"test/client".into(), ); @@ -670,7 +661,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face1.upgrade().unwrap(), + &face1.upgrade().unwrap(), 0, &WireExpr::from(21).with_suffix("/**"), &sub_info, @@ -679,7 +670,7 @@ fn client_test() { ); register_expr( &tables, - &mut face1.upgrade().unwrap(), + &face1.upgrade().unwrap(), 22, &WireExpr::from(21).with_suffix("/z2_pub1"), ); @@ -698,10 +689,10 @@ fn client_test() { ); let primitives2 = Arc::new(ClientPrimitives::new()); - let face2 = Arc::downgrade(&router.new_primitives(primitives2.clone()).state); + let face2 = Arc::downgrade(&router.new_primitives(primitives2.clone())); register_expr( &tables, - &mut face2.upgrade().unwrap(), + &face2.upgrade().unwrap(), 31, &"test/client".into(), ); @@ -721,7 +712,7 @@ fn client_test() { declare_subscription( zlock!(tables.ctrl_lock).as_ref(), &tables, - &mut face2.upgrade().unwrap(), + &face2.upgrade().unwrap(), 0, &WireExpr::from(31).with_suffix("/**"), &sub_info, @@ -733,10 +724,10 @@ fn client_test() { primitives1.clear_data(); primitives2.clear_data(); - let route_dummy_data = |face: &Weak, wire_expr| { + let route_dummy_data = |face: &Weak, wire_expr| { route_data( &tables, - &face.upgrade().unwrap(), + &face.upgrade().unwrap().state, &mut Push { wire_expr, ext_qos: ext::QoSType::DEFAULT, @@ -858,7 +849,7 @@ fn get_best_key_test() { let root = zread!(router.tables.tables)._get_root().clone(); let register_expr = |face: &Face, id: ExprId, expr: &str| { - register_expr(&router.tables, &mut face.state.clone(), id, &expr.into()); + register_expr(&router.tables, face, id, &expr.into()); }; let get_best_key = |resource, suffix, face: &Face| { Resource::get_resource(&root, resource) @@ -910,7 +901,7 @@ fn big_key_expr() { let root = zread!(router.tables.tables)._get_root().clone(); let key_expr = KeyExpr::new(vec!["a/"; 10000].concat() + "a").unwrap(); let wire_expr = WireExpr::from(&**key_expr); - register_expr(&router.tables, &mut face.state.clone(), 1, &wire_expr); + register_expr(&router.tables, &face, 1, &wire_expr); let res = Resource::get_resource(&root, &key_expr).unwrap(); root.get_best_key(&key_expr, face.state.id); res.get_best_key("/a", face.state.id + 1); From e92d3a68ef7237ffaab3cb1fadd764a427c163aa Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 17:28:12 +0200 Subject: [PATCH 30/49] Fix `stats` build --- zenoh/src/net/routing/dispatcher/queries.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index f08b952bea..6e0cdc2864 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -510,9 +510,9 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu ); #[cfg(feature = "stats")] if !admin { - inc_req_stats!(outface, tx, user, msg.payload) + inc_req_stats!(&outface.state, tx, user, msg.payload) } else { - inc_req_stats!(outface, tx, admin, msg.payload) + inc_req_stats!(&outface.state, tx, admin, msg.payload) } tracing::trace!( From 5fae354ec56a9cd362c3aa04a4318fa1bd10439d Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 17:35:15 +0200 Subject: [PATCH 31/49] Fix `client_test`, again... --- zenoh/src/net/tests/tables.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index e8f3ea9d4d..2c04d19a1d 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -587,7 +587,8 @@ fn client_test() { let sub_info = SubscriberInfo; let primitives0 = Arc::new(ClientPrimitives::new()); - let face0 = Arc::downgrade(&router.new_primitives(primitives0.clone())); + let face = router.new_primitives(primitives0.clone()); + let face0 = Arc::downgrade(&face); register_expr( &tables, &face0.upgrade().unwrap(), @@ -638,7 +639,8 @@ fn client_test() { ); let primitives1 = Arc::new(ClientPrimitives::new()); - let face1 = Arc::downgrade(&router.new_primitives(primitives1.clone())); + let face = router.new_primitives(primitives1.clone()); + let face1 = Arc::downgrade(&face); register_expr( &tables, &face1.upgrade().unwrap(), @@ -689,7 +691,8 @@ fn client_test() { ); let primitives2 = Arc::new(ClientPrimitives::new()); - let face2 = Arc::downgrade(&router.new_primitives(primitives2.clone())); + let face = router.new_primitives(primitives2.clone()); + let face2 = Arc::downgrade(&face); register_expr( &tables, &face2.upgrade().unwrap(), From 0bae755115683d3d51fc7de18416e6a1a3cc7fee Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 18:05:36 +0200 Subject: [PATCH 32/49] Add comment on `FaceState::intercept_*` methods --- zenoh/src/net/routing/dispatcher/face.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 3ac2fed14a..7e81650434 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -792,6 +792,8 @@ impl fmt::Display for Face { } } +// NOTE(fuzzypixelz): these methods ought to eventually be moved under `Face`, in very much the same +// manner as `intercept_request`. impl FaceState { pub(crate) fn intercept_interest(&self, msg: &mut Interest, prefix: Option<&Arc>) { if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { From 82fc9dbd23e1076daee0a890c81bb6fb549041ba Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 18:05:49 +0200 Subject: [PATCH 33/49] Fix `base_test` --- zenoh/src/net/tests/tables.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 2c04d19a1d..0298244994 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -54,7 +54,8 @@ fn base_test() { let tables = router.tables.clone(); let primitives = Arc::new(DummyPrimitives {}); - let face = Arc::downgrade(&router.new_primitives(primitives)); + let face = router.new_primitives(primitives); + let face = Arc::downgrade(&face); register_expr( &tables, &face.upgrade().unwrap(), From bf55852f2eec74cb32f033bd0287a69edcfb431b Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Mon, 14 Apr 2025 18:13:39 +0200 Subject: [PATCH 34/49] Fix `match_test` --- zenoh/src/net/tests/tables.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/zenoh/src/net/tests/tables.rs b/zenoh/src/net/tests/tables.rs index 0298244994..d5c464ee8a 100644 --- a/zenoh/src/net/tests/tables.rs +++ b/zenoh/src/net/tests/tables.rs @@ -150,7 +150,8 @@ fn match_test() { let tables = router.tables.clone(); let primitives = Arc::new(DummyPrimitives {}); - let face = Arc::downgrade(&router.new_primitives(primitives)); + let face = router.new_primitives(primitives); + let face = Arc::downgrade(&face); for (i, key_expr) in key_exprs.iter().enumerate() { register_expr( &tables, @@ -162,15 +163,15 @@ fn match_test() { for key_expr1 in key_exprs.iter() { let res_matches = Resource::get_matches(&zread!(tables.tables), key_expr1); - dbg!(res_matches.len()); + res_matches.len(); for key_expr2 in key_exprs.iter() { if res_matches .iter() .any(|m| m.upgrade().unwrap().expr() == key_expr2.as_str()) { - assert!(dbg!(dbg!(key_expr1).intersects(dbg!(key_expr2)))); + assert!(key_expr1.intersects(key_expr2)); } else { - assert!(!dbg!(dbg!(key_expr1).intersects(dbg!(key_expr2)))); + assert!(!key_expr1.intersects(key_expr2)); } } } From 567375dabe852d55779759746c91c2987e02662e Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 15 Apr 2025 12:28:58 +0200 Subject: [PATCH 35/49] Fix `test_acl_(liveliness)_query_ingress_deny` --- zenoh/src/net/routing/dispatcher/face.rs | 67 ++++++++++++++++++------ 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 7e81650434..69216df10a 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -26,9 +26,10 @@ use zenoh_config::InterceptorFlow; use zenoh_protocol::{ core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, network::{ + declare, interest::{InterestId, InterestMode, InterestOptions}, - response, Declare, Interest, Mapping, NetworkBodyMut, NetworkMessageMut, Push, Request, - RequestId, Response, ResponseFinal, + response, Declare, DeclareBody, DeclareFinal, Interest, Mapping, NetworkBodyMut, + NetworkMessageMut, Push, Request, RequestId, Response, ResponseFinal, }, zenoh::RequestBody, }; @@ -45,7 +46,7 @@ use super::{ tables::TablesLock, }; use crate::net::{ - primitives::{McastMux, Mux, Primitives}, + primitives::{EPrimitives, McastMux, Mux, Primitives}, routing::{ dispatcher::interests::finalize_pending_interests, interceptor::{ @@ -323,6 +324,22 @@ impl Face { state: Arc::downgrade(&self.state), } } + + /// Returns a reference to the **ingress** primitives of this [`Face`]. + /// + /// Use the returned [`Primitives`] to send messages that loop back + /// into this same side of the [`Face`]. + pub(crate) fn ingress_primitives(&self) -> &dyn Primitives { + self + } + + /// Returns a reference to the **egress** primitives of this [`Face`]. + /// + /// Use the returned [`EPrimitives`] to send messages outward from + /// this side to the other side of the [`Face`]. + pub(crate) fn egress_primitives(&self) -> &dyn EPrimitives { + &*self.state.primitives + } } impl Primitives for Face { @@ -356,13 +373,14 @@ impl Primitives for Face { } }; + let interest_id = msg.id; let msg = NetworkMessageMut { body: NetworkBodyMut::Interest(msg), reliability: Reliability::Reliable, // Interest is always reliable #[cfg(feature = "stats")] size: None, }; - let ctx = &mut match prefix { + let ctx = &mut match &prefix { Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), None => RoutingContext::new(msg), }; @@ -371,6 +389,19 @@ impl Primitives for Face { .state .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { + // NOTE: this request was blocked by an ingress interceptor, we need to send + // DeclareFinal to avoid a timeout error. + self.egress_primitives() + .send_declare(RoutingContext::with_expr( + &mut Declare { + interest_id: Some(interest_id), + ext_qos: declare::ext::QoSType::DECLARE, + ext_tstamp: None, + ext_nodeid: declare::ext::NodeIdType::DEFAULT, + body: DeclareBody::DeclareFinal(DeclareFinal), + }, + prefix.map(|res| res.expr().to_string()).unwrap_or_default(), + )); return; } } @@ -675,12 +706,13 @@ impl Primitives for Face { .exec_interceptors(InterceptorFlow::Ingress, &iceptor, ctx) { // NOTE: this request was blocked by an ingress interceptor, we need to send - // response final to avoid timeout error. - self.send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + // ResponseFinal to avoid a timeout error. + self.egress_primitives() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); return; } } @@ -931,16 +963,17 @@ impl Face { .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { // NOTE: this request was blocked by an egress interceptor, we need to send - // response final to avoid timeout error. - self.send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); + // ResponseFinal to avoid timeout error. + self.ingress_primitives() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); return; } } - self.state.primitives.send_request(msg); + self.egress_primitives().send_request(msg); } } From 270ff3420612d0927334237f587d4b56d71ca4c3 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 11:24:38 +0200 Subject: [PATCH 36/49] Remove question comment --- zenoh/src/net/routing/dispatcher/face.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 69216df10a..a165b950eb 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -843,8 +843,8 @@ impl FaceState { }; if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { - // FIXME(fuzzypixelz): I don't understand this comment, there is no DeclareFinal being sent... - // NOTE: send declare final to avoid timeout on blocked interest + // NOTE: this request was blocked by an egress interceptor, we need to send + // DeclareFinal to avoid a timeout error. self.reject_interest(interest_id); return; } From eaf4216b1be039ece91568711b33f536df4a28eb Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 11:32:36 +0200 Subject: [PATCH 37/49] Move `intercept_response(_final)` to `Face` --- zenoh/src/net/routing/dispatcher/face.rs | 24 ++++++----- zenoh/src/net/routing/dispatcher/queries.rs | 44 +++++++++++++++------ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index a165b950eb..0df3c1099b 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -719,7 +719,7 @@ impl Primitives for Face { match msg.payload { RequestBody::Query(_) => { - route_query(&self.tables, &self.state, msg); + route_query(&self.tables, self, msg); } } } @@ -905,9 +905,11 @@ impl FaceState { self.primitives.send_push(msg, reliability); } +} +impl Face { pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: Arc) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Response(msg), @@ -918,16 +920,19 @@ impl FaceState { prefix, ); - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { return; } } - self.primitives.send_response(msg); + self.egress_primitives().send_response(msg); } pub(crate) fn intercept_response_final(&self, msg: &mut ResponseFinal) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, // NOTE: ResponseFinal is always reliable @@ -936,16 +941,17 @@ impl FaceState { }); // NOTE: ResponseFinal messages have no keyexpr - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { return; } } - self.primitives.send_response_final(msg); + self.egress_primitives().send_response_final(msg); } -} -impl Face { pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: Arc) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::with_prefix( diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index 6e0cdc2864..f4541cf789 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -43,7 +43,7 @@ use crate::net::routing::{ }; pub(crate) struct Query { - src_face: Arc, + src_face: Face, src_qid: RequestId, } @@ -450,9 +450,9 @@ macro_rules! inc_res_stats { } #[allow(clippy::too_many_arguments)] -pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mut Request) { +pub fn route_query(tables_ref: &Arc, face: &Face, msg: &mut Request) { let rtables = zread!(tables_ref.tables); - match rtables.get_mapping(face, msg.wire_expr.scope, msg.wire_expr.mapping) { + match rtables.get_mapping(&face.state, msg.wire_expr.scope, msg.wire_expr.mapping) { Some(prefix) => { tracing::debug!( "{}:{} Route query for resource {}{}", @@ -469,16 +469,24 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu let admin = expr.full_expr().starts_with("@/"); #[cfg(feature = "stats")] if !admin { - inc_req_stats!(face, rx, user, msg.payload) + inc_req_stats!(face.state, rx, user, msg.payload) } else { - inc_req_stats!(face, rx, admin, msg.payload) + inc_req_stats!(face.state, rx, admin, msg.payload) } - if rtables.hat_code.ingress_filter(&rtables, face, &mut expr) { + if rtables + .hat_code + .ingress_filter(&rtables, &face.state, &mut expr) + { let res = Resource::get_resource(&prefix, expr.suffix); - let route = - get_query_route(&rtables, face, &res, &mut expr, msg.ext_nodeid.node_id); + let route = get_query_route( + &rtables, + &face.state, + &res, + &mut expr, + msg.ext_nodeid.node_id, + ); let query = Arc::new(Query { src_face: face.clone(), @@ -486,8 +494,14 @@ pub fn route_query(tables_ref: &Arc, face: &Arc, msg: &mu }); let queries_lock = zwrite!(tables_ref.queries_lock); - let route = - compute_final_route(&rtables, &route, face, &mut expr, &msg.ext_target, query); + let route = compute_final_route( + &rtables, + &route, + &face.state, + &mut expr, + &msg.ext_target, + query, + ); let timeout = msg.ext_timeout.unwrap_or(rtables.queries_default_timeout); drop(queries_lock); drop(rtables); @@ -619,9 +633,9 @@ pub(crate) fn route_send_response( #[cfg(feature = "stats")] if !admin { - inc_res_stats!(query.src_face, tx, user, msg.payload) + inc_res_stats!(query.src_face.state, tx, user, msg.payload) } else { - inc_res_stats!(query.src_face, tx, admin, msg.payload) + inc_res_stats!(query.src_face.state, tx, admin, msg.payload) } msg.rid = query.src_qid; @@ -632,7 +646,11 @@ pub(crate) fn route_send_response( .read() .expect("reading Tables should not fail"); match tables - .get_sent_mapping(&query.src_face, msg.wire_expr.scope, msg.wire_expr.mapping) + .get_sent_mapping( + &query.src_face.state, + msg.wire_expr.scope, + msg.wire_expr.mapping, + ) .cloned() { Some(prefix) => prefix, From 9b035e60de294f1bf970fbc96eb455623bd56d96 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 11:40:18 +0200 Subject: [PATCH 38/49] Move `intercept_push` to `Face` --- zenoh/src/net/primitives/mux.rs | 5 +--- zenoh/src/net/routing/dispatcher/face.rs | 13 +++++++---- zenoh/src/net/routing/dispatcher/pubsub.rs | 23 +++++++++++-------- zenoh/src/net/routing/dispatcher/resource.rs | 2 +- zenoh/src/net/routing/dispatcher/tables.rs | 2 +- zenoh/src/net/routing/hat/client/pubsub.rs | 8 ++----- .../net/routing/hat/linkstate_peer/pubsub.rs | 10 +++----- zenoh/src/net/routing/hat/p2p_peer/pubsub.rs | 16 +++++-------- zenoh/src/net/routing/hat/router/pubsub.rs | 10 +++----- zenoh/src/net/routing/router.rs | 4 ++-- 10 files changed, 40 insertions(+), 53 deletions(-) diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index 2fda08e8d5..965c260625 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -11,7 +11,6 @@ // Contributors: // ZettaScale Zenoh Team, // -use std::sync::OnceLock; use arc_swap::ArcSwap; use zenoh_protocol::{ @@ -24,7 +23,7 @@ use zenoh_protocol::{ use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; use super::EPrimitives; -use crate::net::routing::{dispatcher::face::Face, interceptor::InterceptorsChain, RoutingContext}; +use crate::net::routing::{interceptor::InterceptorsChain, RoutingContext}; pub struct Mux { pub handler: TransportUnicast, @@ -106,7 +105,6 @@ impl EPrimitives for Mux { pub struct McastMux { pub handler: TransportMulticast, - pub(crate) face: OnceLock, pub(crate) interceptor: ArcSwap, } @@ -114,7 +112,6 @@ impl McastMux { pub(crate) fn new(handler: TransportMulticast, interceptor: InterceptorsChain) -> McastMux { McastMux { handler, - face: OnceLock::new(), interceptor: ArcSwap::new(interceptor.into()), } } diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 0df3c1099b..1ec1a66f8e 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -880,14 +880,16 @@ impl FaceState { prefix.map(|res| res.expr().to_string()).unwrap_or_default(), )); } +} +impl Face { pub(crate) fn intercept_push( &self, msg: &mut Push, reliability: Reliability, prefix: Arc, ) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Push(msg), @@ -898,16 +900,17 @@ impl FaceState { prefix, ); - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { return; } } - self.primitives.send_push(msg, reliability); + self.egress_primitives().send_push(msg, reliability); } -} -impl Face { pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: Arc) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let ctx = &mut RoutingContext::with_prefix( diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 379c4aca21..11599b8a06 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -320,14 +320,14 @@ pub fn route_data( let (outface, key_expr, context) = route.values().next().unwrap(); if tables .hat_code - .egress_filter(&tables, face, outface, &mut expr) + .egress_filter(&tables, face, &outface.state, &mut expr) { drop(tables); #[cfg(feature = "stats")] if !admin { - inc_stats!(outface, tx, user, msg.payload); + inc_stats!(outface.state, tx, user, msg.payload); } else { - inc_stats!(outface, tx, admin, msg.payload); + inc_stats!(outface.state, tx, admin, msg.payload); } msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; @@ -339,7 +339,7 @@ pub fn route_data( .expect("reading Tables should not fail"); match tables .get_sent_mapping( - outface, + &outface.state, msg.wire_expr.scope, msg.wire_expr.mapping, ) @@ -362,9 +362,12 @@ pub fn route_data( let route = route .values() .filter(|(outface, _key_expr, _context)| -> bool { - tables - .hat_code - .egress_filter(&tables, face, outface, &mut expr) + tables.hat_code.egress_filter( + &tables, + face, + &outface.state, + &mut expr, + ) }) .cloned() .collect::>(); @@ -373,9 +376,9 @@ pub fn route_data( for (outface, key_expr, context) in route { #[cfg(feature = "stats")] if !admin { - inc_stats!(outface, tx, user, msg.payload) + inc_stats!(outface.state, tx, user, msg.payload) } else { - inc_stats!(outface, tx, admin, msg.payload) + inc_stats!(outface.state, tx, admin, msg.payload) } let msg = &mut Push { @@ -394,7 +397,7 @@ pub fn route_data( match tables .get_sent_mapping( - &outface, + &outface.state, msg.wire_expr.scope, msg.wire_expr.mapping, ) diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index 86ba346f52..f5219669a9 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -45,7 +45,7 @@ use crate::net::routing::{ pub(crate) type NodeId = u16; -pub(crate) type Direction = (Arc, WireExpr<'static>, NodeId); +pub(crate) type Direction = (Face, WireExpr<'static>, NodeId); pub(crate) type Route = HashMap; pub(crate) type QueryDirection = (Face, WireExpr<'static>, NodeId); diff --git a/zenoh/src/net/routing/dispatcher/tables.rs b/zenoh/src/net/routing/dispatcher/tables.rs index c1f70d2135..613a1a82ff 100644 --- a/zenoh/src/net/routing/dispatcher/tables.rs +++ b/zenoh/src/net/routing/dispatcher/tables.rs @@ -76,7 +76,7 @@ pub struct Tables { pub(crate) interests_timeout: Duration, pub(crate) root_res: Arc, pub(crate) faces: HashMap, - pub(crate) mcast_groups: Vec>, + pub(crate) mcast_groups: Vec, pub(crate) mcast_faces: Vec>, pub(crate) interceptors: Vec, pub(crate) hat: Box, diff --git a/zenoh/src/net/routing/hat/client/pubsub.rs b/zenoh/src/net/routing/hat/client/pubsub.rs index 7b21388d98..e61a8bc998 100644 --- a/zenoh/src/net/routing/hat/client/pubsub.rs +++ b/zenoh/src/net/routing/hat/client/pubsub.rs @@ -353,7 +353,7 @@ impl HatPubSubTrait for HatCode { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.insert( face.state.id, - (face.state.clone(), key_expr.to_owned(), NodeId::default()), + (face.clone(), key_expr.to_owned(), NodeId::default()), ); } } @@ -373,11 +373,7 @@ impl HatPubSubTrait for HatCode { if context.subs.is_some() && context.face.state.whatami == WhatAmI::Client { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - ( - context.face.state.clone(), - key_expr.to_owned(), - NodeId::default(), - ) + (context.face.clone(), key_expr.to_owned(), NodeId::default()) }); } } diff --git a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs index ede9817687..16154cd084 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs @@ -913,7 +913,7 @@ impl HatPubSubTrait for HatCode { expr.suffix, face.state.id, ); - (face.state.clone(), key_expr.to_owned(), source) + (face.clone(), key_expr.to_owned(), source) }); } } @@ -975,18 +975,14 @@ impl HatPubSubTrait for HatCode { { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - ( - context.face.state.clone(), - key_expr.to_owned(), - NodeId::default(), - ) + (context.face.clone(), key_expr.to_owned(), NodeId::default()) }); } } } for mcast_group in &tables.mcast_groups { route.insert( - mcast_group.id, + mcast_group.state.id, ( mcast_group.clone(), expr.full_expr().to_string().into(), diff --git a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs index 95c1c07e4a..126ab87cec 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs @@ -202,8 +202,8 @@ fn declare_simple_subscription( #[cfg(not(windows))] if face.state.whatami == WhatAmI::Client { for mcast_group in &tables.mcast_groups { - if mcast_group.mcast_group != face.state.mcast_group { - mcast_group.intercept_declare( + if mcast_group.state.mcast_group != face.state.mcast_group { + mcast_group.state.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -622,7 +622,7 @@ impl HatPubSubTrait for HatCode { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); route.insert( face.state.id, - (face.state.clone(), key_expr.to_owned(), NodeId::default()), + (face.clone(), key_expr.to_owned(), NodeId::default()), ); } } @@ -635,7 +635,7 @@ impl HatPubSubTrait for HatCode { }) { route.entry(face.state.id).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, face.state.id); - (face.state.clone(), key_expr.to_owned(), NodeId::default()) + (face.clone(), key_expr.to_owned(), NodeId::default()) }); } } @@ -657,18 +657,14 @@ impl HatPubSubTrait for HatCode { { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - ( - context.face.state.clone(), - key_expr.to_owned(), - NodeId::default(), - ) + (context.face.clone(), key_expr.to_owned(), NodeId::default()) }); } } } for mcast_group in &tables.mcast_groups { route.insert( - mcast_group.id, + mcast_group.state.id, ( mcast_group.clone(), expr.full_expr().to_string().into(), diff --git a/zenoh/src/net/routing/hat/router/pubsub.rs b/zenoh/src/net/routing/hat/router/pubsub.rs index 130f0e0d29..0835242b2e 100644 --- a/zenoh/src/net/routing/hat/router/pubsub.rs +++ b/zenoh/src/net/routing/hat/router/pubsub.rs @@ -1236,7 +1236,7 @@ impl HatPubSubTrait for HatCode { expr.suffix, face.state.id, ); - (face.state.clone(), key_expr.to_owned(), source) + (face.clone(), key_expr.to_owned(), source) }); } } @@ -1318,11 +1318,7 @@ impl HatPubSubTrait for HatCode { if context.subs.is_some() && context.face.state.whatami != WhatAmI::Router { route.entry(*sid).or_insert_with(|| { let key_expr = Resource::get_best_key(expr.prefix, expr.suffix, *sid); - ( - context.face.state.clone(), - key_expr.to_owned(), - NodeId::default(), - ) + (context.face.clone(), key_expr.to_owned(), NodeId::default()) }); } } @@ -1330,7 +1326,7 @@ impl HatPubSubTrait for HatCode { } for mcast_group in &tables.mcast_groups { route.insert( - mcast_group.id, + mcast_group.state.id, ( mcast_group.clone(), expr.full_expr().to_string().into(), diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index bb5a55d55f..f1e87bfd5e 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -192,10 +192,10 @@ impl Router { &tables.interceptors, tables.next_interceptor_version.load(Ordering::SeqCst), ); - let _ = mux.face.set(Face { + let face = Face { state: face.clone(), tables: self.tables.clone(), - }); + }; tables.mcast_groups.push(face); tables.disable_all_routes(); From 714eef0fe9143dc24f3fec66839df925d59db05e Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 12:10:09 +0200 Subject: [PATCH 39/49] Move `intercept_declare` to `Face` --- zenoh/src/net/routing/dispatcher/face.rs | 20 +++++---- zenoh/src/net/routing/dispatcher/interests.rs | 2 +- zenoh/src/net/routing/dispatcher/resource.rs | 2 +- zenoh/src/net/routing/hat/client/interests.rs | 4 +- zenoh/src/net/routing/hat/client/pubsub.rs | 10 ++--- zenoh/src/net/routing/hat/client/queries.rs | 10 ++--- zenoh/src/net/routing/hat/client/token.rs | 24 +++++------ .../routing/hat/linkstate_peer/interests.rs | 2 +- .../net/routing/hat/linkstate_peer/pubsub.rs | 34 +++++++-------- .../net/routing/hat/linkstate_peer/queries.rs | 30 ++++++------- .../net/routing/hat/linkstate_peer/token.rs | 34 +++++++-------- zenoh/src/net/routing/hat/mod.rs | 2 +- .../src/net/routing/hat/p2p_peer/interests.rs | 2 +- zenoh/src/net/routing/hat/p2p_peer/mod.rs | 2 +- zenoh/src/net/routing/hat/p2p_peer/pubsub.rs | 30 ++++++------- zenoh/src/net/routing/hat/p2p_peer/queries.rs | 29 ++++++------- zenoh/src/net/routing/hat/p2p_peer/token.rs | 38 ++++++++--------- zenoh/src/net/routing/hat/router/interests.rs | 2 +- zenoh/src/net/routing/hat/router/pubsub.rs | 36 ++++++++-------- zenoh/src/net/routing/hat/router/queries.rs | 36 ++++++++-------- zenoh/src/net/routing/hat/router/token.rs | 42 +++++++++---------- 21 files changed, 198 insertions(+), 193 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 1ec1a66f8e..94dad36256 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -855,9 +855,11 @@ impl FaceState { prefix.map(|res| res.expr().to_string()).unwrap_or_default(), )); } +} +impl Face { pub(crate) fn intercept_declare(&self, msg: &mut Declare, prefix: Option<&Arc>) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let msg = NetworkMessageMut { body: NetworkBodyMut::Declare(msg), reliability: Reliability::Reliable, // NOTE: Declare is always reliable @@ -870,19 +872,21 @@ impl FaceState { None => RoutingContext::new(msg), }; - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { return; } } - self.primitives.send_declare(RoutingContext::with_expr( - msg, - prefix.map(|res| res.expr().to_string()).unwrap_or_default(), - )); + self.egress_primitives() + .send_declare(RoutingContext::with_expr( + msg, + prefix.map(|res| res.expr().to_string()).unwrap_or_default(), + )); } -} -impl Face { pub(crate) fn intercept_push( &self, msg: &mut Push, diff --git a/zenoh/src/net/routing/dispatcher/interests.rs b/zenoh/src/net/routing/dispatcher/interests.rs index 7f9965ded6..dc3f35149f 100644 --- a/zenoh/src/net/routing/dispatcher/interests.rs +++ b/zenoh/src/net/routing/dispatcher/interests.rs @@ -42,7 +42,7 @@ use crate::net::routing::{ }; pub(crate) struct CurrentInterest { - pub(crate) src_face: Arc, + pub(crate) src_face: Face, pub(crate) src_interest_id: InterestId, pub(crate) mode: InterestMode, } diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index f5219669a9..32ae5f17d3 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -535,7 +535,7 @@ impl Resource { get_mut_unchecked(&mut face.state.clone()) .local_mappings .insert(expr_id, nonwild_prefix.clone()); - face.state.intercept_declare( + face.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/client/interests.rs b/zenoh/src/net/routing/hat/client/interests.rs index 33bcc6883a..6f7fa05790 100644 --- a/zenoh/src/net/routing/hat/client/interests.rs +++ b/zenoh/src/net/routing/hat/client/interests.rs @@ -104,7 +104,7 @@ impl HatInterestTrait for HatCode { ); let interest = Arc::new(CurrentInterest { - src_face: face.state.clone(), + src_face: face.clone(), src_interest_id: id, mode, }); @@ -185,7 +185,7 @@ impl HatInterestTrait for HatCode { } } else { send_declare( - &face.state, + face, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/client/pubsub.rs b/zenoh/src/net/routing/hat/client/pubsub.rs index e61a8bc998..9c6c91c5a7 100644 --- a/zenoh/src/net/routing/hat/client/pubsub.rs +++ b/zenoh/src/net/routing/hat/client/pubsub.rs @@ -61,7 +61,7 @@ fn propagate_simple_subscription_to( .insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -140,12 +140,12 @@ fn declare_simple_subscription( } #[inline] -fn simple_subs(res: &Arc) -> Vec> { +fn simple_subs(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -161,7 +161,7 @@ fn propagate_forget_simple_subscription( for face in tables.faces.values_mut() { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -195,7 +195,7 @@ pub(super) fn undeclare_simple_subscription( } if simple_subs.len() == 1 { let face = &mut simple_subs[0]; - if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( face, Declare { diff --git a/zenoh/src/net/routing/hat/client/queries.rs b/zenoh/src/net/routing/hat/client/queries.rs index d4bfd8e445..918cff814e 100644 --- a/zenoh/src/net/routing/hat/client/queries.rs +++ b/zenoh/src/net/routing/hat/client/queries.rs @@ -109,7 +109,7 @@ fn propagate_simple_queryable( .insert(res.clone(), (id, info)); let key_expr = Resource::decl_key(res, &dst_face, true); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -162,12 +162,12 @@ fn declare_simple_queryable( } #[inline] -fn simple_qabls(res: &Arc) -> Vec> { +fn simple_qabls(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -183,7 +183,7 @@ fn propagate_forget_simple_queryable( for face in tables.faces.values_mut() { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -223,7 +223,7 @@ pub(super) fn undeclare_simple_queryable( } if simple_qabls.len() == 1 { let face = &mut simple_qabls[0]; - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( face, Declare { diff --git a/zenoh/src/net/routing/hat/client/token.rs b/zenoh/src/net/routing/hat/client/token.rs index 8842ffca49..ab80ccae73 100644 --- a/zenoh/src/net/routing/hat/client/token.rs +++ b/zenoh/src/net/routing/hat/client/token.rs @@ -56,7 +56,7 @@ fn propagate_simple_token_to( .insert(res.clone(), id); let key_expr = Resource::decl_key(res, dst_face, true); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -125,8 +125,8 @@ fn declare_simple_token( if interest.mode == InterestMode::CurrentFuture { register_simple_token(tables, face, id, res); } - let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); - let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); + let id = make_token_id(res, &mut interest.src_face.state.clone(), interest.mode); + let wire_expr = Resource::get_best_key(res, "", interest.src_face.state.id); send_declare( &interest.src_face, Declare { @@ -154,12 +154,12 @@ fn declare_simple_token( } #[inline] -fn simple_tokens(res: &Arc) -> Vec> { +fn simple_tokens(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -175,7 +175,7 @@ fn propagate_forget_simple_token( for face in tables.faces.values_mut() { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -196,7 +196,7 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -236,8 +236,8 @@ pub(super) fn undeclare_simple_token( } if simple_tokens.len() == 1 { let face = &mut simple_tokens[0]; - if face.whatami != WhatAmI::Client { - if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { + if face.state.whatami != WhatAmI::Client { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( face, Declare { @@ -327,7 +327,7 @@ pub(crate) fn declare_token_interest( let id = make_token_id(res, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(res, face, true); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -351,7 +351,7 @@ pub(crate) fn declare_token_interest( let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::default(), @@ -377,7 +377,7 @@ pub(crate) fn declare_token_interest( let id = make_token_id(token, &mut face.state.clone(), mode); let wire_expr = Resource::decl_key(token, face, true); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs index 34417a174c..8cd02e4ad4 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/interests.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/interests.rs @@ -93,7 +93,7 @@ impl HatInterestTrait for HatCode { } if mode.current() { send_declare( - &face.state, + face, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs index 16154cd084..2d2b50cd13 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/pubsub.rs @@ -70,7 +70,7 @@ fn send_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(&someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -116,7 +116,7 @@ fn propagate_simple_subscription_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(&dst_face.state)); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -161,7 +161,7 @@ fn propagate_simple_subscription_to( push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -330,12 +330,12 @@ fn remote_linkstatepeer_subs(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_subs(res: &Arc) -> Vec> { +fn simple_subs(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -370,7 +370,7 @@ fn send_forget_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(&someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -401,7 +401,7 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -430,7 +430,7 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -550,9 +550,9 @@ pub(super) fn undeclare_simple_subscription( } if simple_subs.len() == 1 && !linkstatepeer_subs { - let mut face = &mut simple_subs[0]; - if face.whatami != WhatAmI::Client { - if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { + let face = &mut simple_subs[0]; + if face.state.whatami != WhatAmI::Client { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( face, Declare { @@ -568,7 +568,7 @@ pub(super) fn undeclare_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_subs .keys() .cloned() @@ -577,11 +577,11 @@ pub(super) fn undeclare_simple_subscription( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_subs(&m, face) + && (remote_simple_subs(&m, &face.state) || remote_linkstatepeer_subs(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( face, Declare { @@ -714,7 +714,7 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -739,7 +739,7 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -765,7 +765,7 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(sub, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs index 07eae0f36c..b258b9f00e 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/queries.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/queries.rs @@ -141,7 +141,7 @@ fn send_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(&someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -197,7 +197,7 @@ fn propagate_simple_queryable( let push_declaration = push_declaration_profile(&dst_face.state); let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -343,12 +343,12 @@ fn remote_linkstatepeer_qabls(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_qabls(res: &Arc) -> Vec> { +fn simple_qabls(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -383,7 +383,7 @@ fn send_forget_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(&someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -414,7 +414,7 @@ fn propagate_forget_simple_queryable( for mut face in tables.faces.values().cloned() { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -443,7 +443,7 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -570,8 +570,8 @@ pub(super) fn undeclare_simple_queryable( } if simple_qabls.len() == 1 && !linkstatepeer_qabls { - let mut face = &mut simple_qabls[0]; - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + let face = &mut simple_qabls[0]; + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( face, Declare { @@ -587,7 +587,7 @@ pub(super) fn undeclare_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_qabls .keys() .cloned() @@ -596,11 +596,11 @@ pub(super) fn undeclare_simple_queryable( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_qabls(&m, face) + && (remote_simple_qabls(&m, &face.state) || remote_linkstatepeer_qabls(tables, &m)) }) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( face, Declare { @@ -786,7 +786,7 @@ pub(super) fn declare_qabl_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -813,7 +813,7 @@ pub(super) fn declare_qabl_interest( let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -841,7 +841,7 @@ pub(super) fn declare_qabl_interest( let key_expr = Resource::decl_key(qabl, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/linkstate_peer/token.rs b/zenoh/src/net/routing/hat/linkstate_peer/token.rs index a87a60f831..53b3fd9b2c 100644 --- a/zenoh/src/net/routing/hat/linkstate_peer/token.rs +++ b/zenoh/src/net/routing/hat/linkstate_peer/token.rs @@ -63,7 +63,7 @@ fn send_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(&someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -108,7 +108,7 @@ fn propagate_simple_token_to( let key_expr = Resource::decl_key(res, dst_face, push_declaration_profile(&dst_face.state)); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -153,7 +153,7 @@ fn propagate_simple_token_to( push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -296,12 +296,12 @@ fn remote_linkstatepeer_tokens(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_tokens(res: &Arc) -> Vec> { +fn simple_tokens(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -336,7 +336,7 @@ fn send_forget_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(&someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -367,7 +367,7 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -396,7 +396,7 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -514,9 +514,9 @@ pub(super) fn undeclare_simple_token( } if simple_tokens.len() == 1 && !linkstatepeer_tokens { - let mut face = &mut simple_tokens[0]; - if face.whatami != WhatAmI::Client { - if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { + let face = &mut simple_tokens[0]; + if face.state.whatami != WhatAmI::Client { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( face, Declare { @@ -532,7 +532,7 @@ pub(super) fn undeclare_simple_token( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_tokens .keys() .cloned() @@ -541,11 +541,11 @@ pub(super) fn undeclare_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(tables, &m, face) + && (remote_simple_tokens(tables, &m, &face.state) || remote_linkstatepeer_tokens(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( face, Declare { @@ -674,7 +674,7 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(res, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -696,7 +696,7 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -719,7 +719,7 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(token, face, push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/mod.rs b/zenoh/src/net/routing/hat/mod.rs index 1283652522..bf1d94203b 100644 --- a/zenoh/src/net/routing/hat/mod.rs +++ b/zenoh/src/net/routing/hat/mod.rs @@ -66,7 +66,7 @@ impl Sources { } } -pub(crate) type SendDeclare<'a> = dyn FnMut(&Arc, Declare, Option>) + 'a; +pub(crate) type SendDeclare<'a> = dyn FnMut(&Face, Declare, Option>) + 'a; pub(crate) trait HatTrait: HatBaseTrait + HatInterestTrait + HatPubSubTrait + HatQueriesTrait + HatTokenTrait { diff --git a/zenoh/src/net/routing/hat/p2p_peer/interests.rs b/zenoh/src/net/routing/hat/p2p_peer/interests.rs index 81f9742273..1e91491b2c 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/interests.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/interests.rs @@ -136,7 +136,7 @@ impl HatInterestTrait for HatCode { ); let interest = Arc::new(CurrentInterest { - src_face: face.state.clone(), + src_face: face.clone(), src_interest_id: id, mode, }); diff --git a/zenoh/src/net/routing/hat/p2p_peer/mod.rs b/zenoh/src/net/routing/hat/p2p_peer/mod.rs index 1f38c5b4be..f11bb9cc9c 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/mod.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/mod.rs @@ -203,7 +203,7 @@ impl HatBaseTrait for HatCode { if face.state.whatami == WhatAmI::Peer { send_declare( - &face.state, + face, Declare { interest_id: Some(0), ext_qos: QoSType::default(), diff --git a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs index 126ab87cec..f6709e48c7 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/pubsub.rs @@ -73,7 +73,7 @@ fn propagate_simple_subscription_to( super::push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -118,7 +118,7 @@ fn propagate_simple_subscription_to( super::push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -203,7 +203,7 @@ fn declare_simple_subscription( if face.state.whatami == WhatAmI::Client { for mcast_group in &tables.mcast_groups { if mcast_group.state.mcast_group != face.state.mcast_group { - mcast_group.state.intercept_declare( + mcast_group.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -222,12 +222,12 @@ fn declare_simple_subscription( } #[inline] -fn simple_subs(res: &Arc) -> Vec> { +fn simple_subs(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -250,7 +250,7 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -276,7 +276,7 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -312,8 +312,8 @@ pub(super) fn undeclare_simple_subscription( } if simple_subs.len() == 1 { - let mut face = &mut simple_subs[0]; - if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { + let face = &mut simple_subs[0]; + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( face, Declare { @@ -329,7 +329,7 @@ pub(super) fn undeclare_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_subs .keys() .cloned() @@ -337,9 +337,9 @@ pub(super) fn undeclare_simple_subscription( { if !res.context().matches.iter().any(|m| { m.upgrade() - .is_some_and(|m| m.context.is_some() && remote_simple_subs(&m, face)) + .is_some_and(|m| m.context.is_some() && remote_simple_subs(&m, &face.state)) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( face, Declare { @@ -436,7 +436,7 @@ pub(super) fn declare_sub_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -462,7 +462,7 @@ pub(super) fn declare_sub_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -491,7 +491,7 @@ pub(super) fn declare_sub_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/p2p_peer/queries.rs b/zenoh/src/net/routing/hat/p2p_peer/queries.rs index 3c95c8cdd6..10206b25f6 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/queries.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/queries.rs @@ -124,7 +124,7 @@ fn propagate_simple_queryable_to( super::push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -187,12 +187,12 @@ fn declare_simple_queryable( } #[inline] -fn simple_qabls(res: &Arc) -> Vec> { +fn simple_qabls(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -215,7 +215,7 @@ fn propagate_forget_simple_queryable( for face in tables.faces.values_mut() { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -241,7 +241,7 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - &face.state, + face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -282,8 +282,8 @@ pub(super) fn undeclare_simple_queryable( propagate_simple_queryable(tables, res, None, send_declare); } if simple_qabls.len() == 1 { - let mut face = &mut simple_qabls[0]; - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + let face = &mut simple_qabls[0]; + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( face, Declare { @@ -299,17 +299,18 @@ pub(super) fn undeclare_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_qabls .keys() .cloned() .collect::>>() { if !res.context().matches.iter().any(|m| { - m.upgrade() - .is_some_and(|m| m.context.is_some() && (remote_simple_qabls(&m, face))) + m.upgrade().is_some_and(|m| { + m.context.is_some() && (remote_simple_qabls(&m, &face.state)) + }) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( face, Declare { @@ -410,7 +411,7 @@ pub(super) fn declare_qabl_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -438,7 +439,7 @@ pub(super) fn declare_qabl_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -470,7 +471,7 @@ pub(super) fn declare_qabl_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/p2p_peer/token.rs b/zenoh/src/net/routing/hat/p2p_peer/token.rs index 05d2c1b679..b9ce2fc66e 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/token.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/token.rs @@ -81,7 +81,7 @@ fn propagate_simple_token_to( super::push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: dst_interest_id, ext_qos: ext::QoSType::DECLARE, @@ -130,7 +130,7 @@ fn propagate_simple_token_to( super::push_declaration_profile(&dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: dst_interest_id, ext_qos: ext::QoSType::DECLARE, @@ -211,8 +211,8 @@ fn declare_simple_token( if interest.mode == InterestMode::CurrentFuture { register_simple_token(tables, face, id, res); } - let id = make_token_id(res, &mut interest.src_face.clone(), interest.mode); - let wire_expr = Resource::get_best_key(res, "", interest.src_face.id); + let id = make_token_id(res, &mut interest.src_face.state.clone(), interest.mode); + let wire_expr = Resource::get_best_key(res, "", interest.src_face.state.id); send_declare( &interest.src_face, Declare { @@ -246,12 +246,12 @@ fn declare_simple_token( } #[inline] -fn simple_tokens(res: &Arc) -> Vec> { +fn simple_tokens(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -275,7 +275,7 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -297,7 +297,7 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -326,7 +326,7 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -347,7 +347,7 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -389,9 +389,9 @@ pub(super) fn undeclare_simple_token( } if simple_tokens.len() == 1 { - let mut face = &mut simple_tokens[0]; - if face.whatami != WhatAmI::Client { - if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { + let face = &mut simple_tokens[0]; + if face.state.whatami != WhatAmI::Client { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( face, Declare { @@ -407,7 +407,7 @@ pub(super) fn undeclare_simple_token( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_tokens .keys() .cloned() @@ -415,10 +415,10 @@ pub(super) fn undeclare_simple_token( { if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { - m.context.is_some() && remote_simple_tokens(tables, &m, face) + m.context.is_some() && remote_simple_tokens(tables, &m, &face.state) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( face, Declare { @@ -515,7 +515,7 @@ pub(crate) fn declare_token_interest( let wire_expr = Resource::decl_key(res, face, super::push_declaration_profile(&face.state)); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -543,7 +543,7 @@ pub(crate) fn declare_token_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -573,7 +573,7 @@ pub(crate) fn declare_token_interest( super::push_declaration_profile(&face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/router/interests.rs b/zenoh/src/net/routing/hat/router/interests.rs index 1b94f5bc91..84f1707b6c 100644 --- a/zenoh/src/net/routing/hat/router/interests.rs +++ b/zenoh/src/net/routing/hat/router/interests.rs @@ -103,7 +103,7 @@ impl HatInterestTrait for HatCode { } if mode.current() { send_declare( - &face.state, + face, Declare { interest_id: Some(id), ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/router/pubsub.rs b/zenoh/src/net/routing/hat/router/pubsub.rs index 0835242b2e..77688b9d1a 100644 --- a/zenoh/src/net/routing/hat/router/pubsub.rs +++ b/zenoh/src/net/routing/hat/router/pubsub.rs @@ -70,7 +70,7 @@ fn send_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(tables, &someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -145,7 +145,7 @@ fn propagate_simple_subscription_to( push_declaration_profile(tables, &dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -362,12 +362,12 @@ fn remote_linkstatepeer_subs(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_subs(res: &Arc) -> Vec> { +fn simple_subs(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.subs.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -402,7 +402,7 @@ fn send_forget_sourced_subscription_to_net_children( let push_declaration = push_declaration_profile(tables, &someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -433,7 +433,7 @@ fn propagate_forget_simple_subscription( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -463,7 +463,7 @@ fn propagate_forget_simple_subscription( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -505,7 +505,7 @@ fn propagate_forget_simple_subscription_to_peers( { if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -666,8 +666,8 @@ pub(super) fn undeclare_simple_subscription( } if simple_subs.len() == 1 && !router_subs && !linkstatepeer_subs { - let mut face = &mut simple_subs[0]; - if let Some(id) = face_hat_mut!(face).local_subs.remove(res) { + let face = &mut simple_subs[0]; + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(res) { send_declare( face, Declare { @@ -683,7 +683,7 @@ pub(super) fn undeclare_simple_subscription( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_subs .keys() .cloned() @@ -692,12 +692,12 @@ pub(super) fn undeclare_simple_subscription( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_subs(&m, face) + && (remote_simple_subs(&m, &face.state) || remote_linkstatepeer_subs(tables, &m) || remote_router_subs(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_subs.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_subs.remove(&res) { send_declare( face, Declare { @@ -862,7 +862,7 @@ pub(super) fn pubsub_linkstate_change( if let Some(id) = face_hat_mut!(&mut src_face.state).local_subs.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face.state, + &src_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -894,7 +894,7 @@ pub(super) fn pubsub_linkstate_change( push_declaration_profile(tables, &dst_face.state); let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -957,7 +957,7 @@ pub(crate) fn declare_sub_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -999,7 +999,7 @@ pub(crate) fn declare_sub_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1038,7 +1038,7 @@ pub(crate) fn declare_sub_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/router/queries.rs b/zenoh/src/net/routing/hat/router/queries.rs index 0aa1e4c1a8..0ffbabe2a7 100644 --- a/zenoh/src/net/routing/hat/router/queries.rs +++ b/zenoh/src/net/routing/hat/router/queries.rs @@ -209,7 +209,7 @@ fn send_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(tables, &someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -278,7 +278,7 @@ fn propagate_simple_queryable( let push_declaration = push_declaration_profile(tables, &dst_face.state); let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -489,12 +489,12 @@ fn remote_linkstatepeer_qabls(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_qabls(res: &Arc) -> Vec> { +fn simple_qabls(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.qabl.is_some() { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -529,7 +529,7 @@ fn send_forget_sourced_queryable_to_net_children( let push_declaration = push_declaration_profile(tables, &someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -560,7 +560,7 @@ fn propagate_forget_simple_queryable( for mut face in tables.faces.values().cloned() { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -590,7 +590,7 @@ fn propagate_forget_simple_queryable( }) { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -632,7 +632,7 @@ fn propagate_forget_simple_queryable_to_peers( { if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -806,8 +806,8 @@ pub(super) fn undeclare_simple_queryable( } if simple_qabls.len() == 1 && !router_qabls && !linkstatepeer_qabls { - let mut face = &mut simple_qabls[0]; - if let Some((id, _)) = face_hat_mut!(face).local_qabls.remove(res) { + let face = &mut simple_qabls[0]; + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(res) { send_declare( face, Declare { @@ -823,7 +823,7 @@ pub(super) fn undeclare_simple_queryable( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_qabls .keys() .cloned() @@ -832,12 +832,12 @@ pub(super) fn undeclare_simple_queryable( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_qabls(&m, face) + && (remote_simple_qabls(&m, &face.state) || remote_linkstatepeer_qabls(tables, &m) || remote_router_qabls(tables, &m)) }) }) { - if let Some((id, _)) = face_hat_mut!(&mut face).local_qabls.remove(&res) { + if let Some((id, _)) = face_hat_mut!(&mut face.state).local_qabls.remove(&res) { send_declare( face, Declare { @@ -968,7 +968,7 @@ pub(super) fn queries_linkstate_change( if let Some((id, _)) = face_hat_mut!(&mut src_face.state).local_qabls.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face.state, + &src_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -1001,7 +1001,7 @@ pub(super) fn queries_linkstate_change( push_declaration_profile(tables, &dst_face.state); let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -1179,7 +1179,7 @@ pub(crate) fn declare_qabl_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1219,7 +1219,7 @@ pub(crate) fn declare_qabl_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1251,7 +1251,7 @@ pub(crate) fn declare_qabl_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, diff --git a/zenoh/src/net/routing/hat/router/token.rs b/zenoh/src/net/routing/hat/router/token.rs index d7d643e94a..29e0e3ccc6 100644 --- a/zenoh/src/net/routing/hat/router/token.rs +++ b/zenoh/src/net/routing/hat/router/token.rs @@ -63,7 +63,7 @@ fn send_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(tables, &someface.state); let key_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -137,7 +137,7 @@ fn propagate_simple_token_to( push_declaration_profile(tables, &dst_face.state), ); send_declare( - &dst_face.state, + dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -331,12 +331,12 @@ fn remote_linkstatepeer_tokens(tables: &Tables, res: &Arc) -> bool { } #[inline] -fn simple_tokens(res: &Arc) -> Vec> { +fn simple_tokens(res: &Arc) -> Vec { res.session_ctxs .values() .filter_map(|ctx| { if ctx.token { - Some(ctx.face.state.clone()) + Some(ctx.face.clone()) } else { None } @@ -371,7 +371,7 @@ fn send_forget_sourced_token_to_net_clildren( let push_declaration = push_declaration_profile(tables, &someface.state); let wire_expr = Resource::decl_key(res, &someface, push_declaration); - someface.state.intercept_declare( + someface.intercept_declare( &mut Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -403,7 +403,7 @@ fn propagate_forget_simple_token( for mut face in tables.faces.values().cloned() { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -433,7 +433,7 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -465,7 +465,7 @@ fn propagate_forget_simple_token( }) { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -491,7 +491,7 @@ fn propagate_forget_simple_token( // Token has never been declared on this face. // Send an Undeclare with a one shot generated id and a WireExpr ext. send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -535,7 +535,7 @@ fn propagate_forget_simple_token_to_peers( { if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( - &face.state, + &face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -707,9 +707,9 @@ pub(super) fn undeclare_simple_token( } if simple_tokens.len() == 1 && !router_tokens && !linkstatepeer_tokens { - let mut face = &mut simple_tokens[0]; - if face.whatami != WhatAmI::Client { - if let Some(id) = face_hat_mut!(face).local_tokens.remove(res) { + let face = &mut simple_tokens[0]; + if face.state.whatami != WhatAmI::Client { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(res) { send_declare( face, Declare { @@ -725,7 +725,7 @@ pub(super) fn undeclare_simple_token( Some(res.clone()), ); } - for res in face_hat!(face) + for res in face_hat!(face.state) .local_tokens .keys() .cloned() @@ -734,12 +734,12 @@ pub(super) fn undeclare_simple_token( if !res.context().matches.iter().any(|m| { m.upgrade().is_some_and(|m| { m.context.is_some() - && (remote_simple_tokens(tables, &m, face) + && (remote_simple_tokens(tables, &m, &face.state) || remote_linkstatepeer_tokens(tables, &m) || remote_router_tokens(tables, &m)) }) }) { - if let Some(id) = face_hat_mut!(&mut face).local_tokens.remove(&res) { + if let Some(id) = face_hat_mut!(&mut face.state).local_tokens.remove(&res) { send_declare( face, Declare { @@ -899,7 +899,7 @@ pub(super) fn token_linkstate_change( if let Some(id) = face_hat_mut!(&mut src_face.state).local_tokens.remove(&res) { let wire_expr = Resource::get_best_key(&res, "", src_face.state.id); send_declare( - &src_face.state, + &src_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -931,7 +931,7 @@ pub(super) fn token_linkstate_change( push_declaration_profile(tables, &dst_face.state); let key_expr = Resource::decl_key(res, &dst_face, push_declaration); send_declare( - &dst_face.state, + &dst_face, Declare { interest_id: None, ext_qos: ext::QoSType::DECLARE, @@ -997,7 +997,7 @@ pub(crate) fn declare_token_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1039,7 +1039,7 @@ pub(crate) fn declare_token_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, @@ -1078,7 +1078,7 @@ pub(crate) fn declare_token_interest( push_declaration_profile(tables, &face.state), ); send_declare( - &face.state, + face, Declare { interest_id, ext_qos: ext::QoSType::DECLARE, From 2bb67f88605d4d3e5e416be6454af6bf02aca8ea Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 12:12:15 +0200 Subject: [PATCH 40/49] Move `intercept_interest` to `Face` --- zenoh/src/net/routing/dispatcher/face.rs | 24 +++++++++---------- zenoh/src/net/routing/hat/client/interests.rs | 6 ++--- .../src/net/routing/hat/p2p_peer/interests.rs | 6 ++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 94dad36256..c916f7aff6 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -824,11 +824,9 @@ impl fmt::Display for Face { } } -// NOTE(fuzzypixelz): these methods ought to eventually be moved under `Face`, in very much the same -// manner as `intercept_request`. -impl FaceState { +impl Face { pub(crate) fn intercept_interest(&self, msg: &mut Interest, prefix: Option<&Arc>) { - if let Some(iceptor) = self.load_interceptors(InterceptorFlow::Egress) { + if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let interest_id = msg.id; let msg = NetworkMessageMut { body: NetworkBodyMut::Interest(msg), @@ -842,22 +840,24 @@ impl FaceState { None => RoutingContext::new(msg), }; - if !self.exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + if !self + .state + .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) + { // NOTE: this request was blocked by an egress interceptor, we need to send // DeclareFinal to avoid a timeout error. - self.reject_interest(interest_id); + self.state.reject_interest(interest_id); return; } } - self.primitives.send_interest(RoutingContext::with_expr( - msg, - prefix.map(|res| res.expr().to_string()).unwrap_or_default(), - )); + self.egress_primitives() + .send_interest(RoutingContext::with_expr( + msg, + prefix.map(|res| res.expr().to_string()).unwrap_or_default(), + )); } -} -impl Face { pub(crate) fn intercept_declare(&self, msg: &mut Declare, prefix: Option<&Arc>) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let msg = NetworkMessageMut { diff --git a/zenoh/src/net/routing/hat/client/interests.rs b/zenoh/src/net/routing/hat/client/interests.rs index 6f7fa05790..ee551e10a5 100644 --- a/zenoh/src/net/routing/hat/client/interests.rs +++ b/zenoh/src/net/routing/hat/client/interests.rs @@ -52,7 +52,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &mut Face) { }, ); let wire_expr = res.as_ref().map(|res| Resource::decl_key(res, face, true)); - face.state.intercept_interest( + face.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -149,7 +149,7 @@ impl HatInterestTrait for HatCode { let wire_expr = res .as_ref() .map(|res| Resource::decl_key(res, dst_face, true)); - dst_face.state.intercept_interest( + dst_face.intercept_interest( &mut Interest { id, mode, @@ -224,7 +224,7 @@ impl HatInterestTrait for HatCode { if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.state.intercept_interest( + dst_face.intercept_interest( &mut Interest { id, mode: InterestMode::Final, diff --git a/zenoh/src/net/routing/hat/p2p_peer/interests.rs b/zenoh/src/net/routing/hat/p2p_peer/interests.rs index 1e91491b2c..94f7b45080 100644 --- a/zenoh/src/net/routing/hat/p2p_peer/interests.rs +++ b/zenoh/src/net/routing/hat/p2p_peer/interests.rs @@ -61,7 +61,7 @@ pub(super) fn interests_new_face(tables: &mut Tables, face: &Face) { let wire_expr = res.as_ref().map(|res| { Resource::decl_key(res, face, super::push_declaration_profile(&face.state)) }); - face.state.intercept_interest( + face.intercept_interest( &mut Interest { id, mode: InterestMode::CurrentFuture, @@ -195,7 +195,7 @@ impl HatInterestTrait for HatCode { super::push_declaration_profile(&dst_face.state), ) }); - dst_face.state.intercept_interest( + dst_face.intercept_interest( &mut Interest { id, mode: propagated_mode, @@ -257,7 +257,7 @@ impl HatInterestTrait for HatCode { if local_interest.res == interest.res && local_interest.options == interest.options { - dst_face.state.intercept_interest( + dst_face.intercept_interest( &mut Interest { id, mode: InterestMode::Final, From 5ffb3d4690996953b6a13e93f1eb692342f4a0e7 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 12:38:13 +0200 Subject: [PATCH 41/49] Remove leftover comment --- zenoh/src/net/routing/mod.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/zenoh/src/net/routing/mod.rs b/zenoh/src/net/routing/mod.rs index 17a90a0629..3935bb2da7 100644 --- a/zenoh/src/net/routing/mod.rs +++ b/zenoh/src/net/routing/mod.rs @@ -88,8 +88,6 @@ impl RoutingContext { } pub(crate) fn with_prefix(msg: Msg, prefix: Arc) -> Self { - // TODO: could this function be replaced by `with_expr`? i.e. is cloning the Resource prefix - // better then allocating the full_expr? Self { msg, inface: OnceCell::new(), From f04cafcc25cd10befe07d56fb5189d6af169091d Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Wed, 16 Apr 2025 19:14:24 +0200 Subject: [PATCH 42/49] Remove `NetworkMessageMut::size` --- zenoh/src/net/routing/dispatcher/face.rs | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index e81284151d..1dbff8c493 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -378,8 +378,6 @@ impl Primitives for Face { let msg = NetworkMessageMut { body: NetworkBodyMut::Interest(msg), reliability: Reliability::Reliable, // Interest is always reliable - #[cfg(feature = "stats")] - size: None, }; let ctx = &mut match &prefix { Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), @@ -467,8 +465,6 @@ impl Primitives for Face { let msg = NetworkMessageMut { body: NetworkBodyMut::Declare(msg), reliability: Reliability::Reliable, // Declare is always reliable - #[cfg(feature = "stats")] - size: None, }; let ctx = &mut match prefix { @@ -650,8 +646,6 @@ impl Primitives for Face { NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, - #[cfg(feature = "stats")] - size: None, }, prefix, ); @@ -696,8 +690,6 @@ impl Primitives for Face { NetworkMessageMut { body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, }, prefix, ); @@ -754,8 +746,6 @@ impl Primitives for Face { NetworkMessageMut { body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, }, prefix, ); @@ -776,8 +766,6 @@ impl Primitives for Face { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable - #[cfg(feature = "stats")] - size: None, }); // NOTE: ResponseFinal messages have no keyexpr @@ -832,8 +820,6 @@ impl Face { let msg = NetworkMessageMut { body: NetworkBodyMut::Interest(msg), reliability: Reliability::Reliable, // NOTE: Interest is always reliable - #[cfg(feature = "stats")] - size: None, }; let ctx = &mut match prefix { @@ -864,8 +850,6 @@ impl Face { let msg = NetworkMessageMut { body: NetworkBodyMut::Declare(msg), reliability: Reliability::Reliable, // NOTE: Declare is always reliable - #[cfg(feature = "stats")] - size: None, }; let ctx = &mut match prefix { @@ -899,8 +883,6 @@ impl Face { NetworkMessageMut { body: NetworkBodyMut::Push(msg), reliability, - #[cfg(feature = "stats")] - size: None, }, prefix, ); @@ -922,8 +904,6 @@ impl Face { NetworkMessageMut { body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, // NOTE: Response is always reliable - #[cfg(feature = "stats")] - size: None, }, prefix, ); @@ -944,8 +924,6 @@ impl Face { let ctx = &mut RoutingContext::new(NetworkMessageMut { body: NetworkBodyMut::ResponseFinal(msg), reliability: Reliability::Reliable, // NOTE: ResponseFinal is always reliable - #[cfg(feature = "stats")] - size: None, }); // NOTE: ResponseFinal messages have no keyexpr @@ -966,8 +944,6 @@ impl Face { NetworkMessageMut { body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, // NOTE: Request is always reliable - #[cfg(feature = "stats")] - size: None, }, prefix, ); From e889959afb0fa0eab25304a67139cf58eb7d374a Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 14:56:10 +0200 Subject: [PATCH 43/49] Keep `Tables` lock while running iceptors This also avoids computing the prefix if there is no iceptor. --- zenoh/src/net/routing/dispatcher/face.rs | 328 +++++++++++--------- zenoh/src/net/routing/dispatcher/pubsub.rs | 53 +--- zenoh/src/net/routing/dispatcher/queries.rs | 52 +--- 3 files changed, 192 insertions(+), 241 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 1dbff8c493..164d72ea31 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -346,32 +346,30 @@ impl Face { impl Primitives for Face { fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match &msg.wire_expr { - Some(we) => { - match tables - .get_mapping(&self.state, we.scope, we.mapping) - .cloned() - { - Some(prefix) => Some(prefix), - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - we.scope, - self, - ); - return; - } + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match &msg.wire_expr { + Some(we) => { + match tables + .get_mapping(&self.state, we.scope, we.mapping) + .cloned() + { + Some(prefix) => Some(prefix), + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + we.scope, + self, + ); + return; } } - None => None, } + None => None, }; let interest_id = msg.id; @@ -434,32 +432,30 @@ impl Primitives for Face { fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match msg.wire_expr() { - Some(we) => { - match tables - .get_mapping(&self.state, we.scope, we.mapping) - .cloned() - { - Some(prefix) => Some(prefix), - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - we.scope, - self, - ); - return; - } + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match msg.wire_expr() { + Some(we) => { + match tables + .get_mapping(&self.state, we.scope, we.mapping) + .cloned() + { + Some(prefix) => Some(prefix), + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + we.scope, + self, + ); + return; } } - None => None, } + None => None, }; let msg = NetworkMessageMut { @@ -619,26 +615,24 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; } }; @@ -663,26 +657,24 @@ impl Primitives for Face { fn send_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; } }; @@ -719,26 +711,24 @@ impl Primitives for Face { fn send_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let prefix = { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Received WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; } }; @@ -872,13 +862,29 @@ impl Face { )); } - pub(crate) fn intercept_push( - &self, - msg: &mut Push, - reliability: Reliability, - prefix: Arc, - ) { + pub(crate) fn intercept_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + }; + let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { body: NetworkBodyMut::Push(msg), @@ -898,12 +904,33 @@ impl Face { self.egress_primitives().send_push(msg, reliability); } - pub(crate) fn intercept_response(&self, msg: &mut Response, prefix: Arc) { + pub(crate) fn intercept_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + }; + let ctx = &mut RoutingContext::with_prefix( NetworkMessageMut { - body: NetworkBodyMut::Response(msg), - reliability: Reliability::Reliable, // NOTE: Response is always reliable + body: NetworkBodyMut::Request(msg), + reliability: Reliability::Reliable, // NOTE: Request is always reliable }, prefix, ); @@ -912,21 +939,52 @@ impl Face { .state .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { + // NOTE: this request was blocked by an egress interceptor, we need to send + // ResponseFinal to avoid timeout error. + self.ingress_primitives() + .send_response_final(&mut ResponseFinal { + rid: msg.id, + ext_qos: response::ext::QoSType::RESPONSE_FINAL, + ext_tstamp: None, + }); return; } } - self.egress_primitives().send_response(msg); + self.egress_primitives().send_request(msg); } - pub(crate) fn intercept_response_final(&self, msg: &mut ResponseFinal) { + pub(crate) fn intercept_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::new(NetworkMessageMut { - body: NetworkBodyMut::ResponseFinal(msg), - reliability: Reliability::Reliable, // NOTE: ResponseFinal is always reliable - }); + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + let prefix = match tables + .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) + .cloned() + { + Some(prefix) => prefix, + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {}", + msg.wire_expr.scope, + self, + ); + return; + } + }; + + let ctx = &mut RoutingContext::with_prefix( + NetworkMessageMut { + body: NetworkBodyMut::Response(msg), + reliability: Reliability::Reliable, // NOTE: Response is always reliable + }, + prefix, + ); - // NOTE: ResponseFinal messages have no keyexpr if !self .state .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) @@ -935,35 +993,25 @@ impl Face { } } - self.egress_primitives().send_response_final(msg); + self.egress_primitives().send_response(msg); } - pub(crate) fn intercept_request(&self, msg: &mut Request, prefix: Arc) { + pub(crate) fn intercept_response_final(&self, msg: &mut ResponseFinal) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let ctx = &mut RoutingContext::with_prefix( - NetworkMessageMut { - body: NetworkBodyMut::Request(msg), - reliability: Reliability::Reliable, // NOTE: Request is always reliable - }, - prefix, - ); + let ctx = &mut RoutingContext::new(NetworkMessageMut { + body: NetworkBodyMut::ResponseFinal(msg), + reliability: Reliability::Reliable, // NOTE: ResponseFinal is always reliable + }); + // NOTE: ResponseFinal messages have no keyexpr if !self .state .exec_interceptors(InterceptorFlow::Egress, &iceptor, ctx) { - // NOTE: this request was blocked by an egress interceptor, we need to send - // ResponseFinal to avoid timeout error. - self.ingress_primitives() - .send_response_final(&mut ResponseFinal { - rid: msg.id, - ext_qos: response::ext::QoSType::RESPONSE_FINAL, - ext_tstamp: None, - }); return; } } - self.egress_primitives().send_request(msg); + self.egress_primitives().send_response_final(msg); } } diff --git a/zenoh/src/net/routing/dispatcher/pubsub.rs b/zenoh/src/net/routing/dispatcher/pubsub.rs index 11599b8a06..f009787988 100644 --- a/zenoh/src/net/routing/dispatcher/pubsub.rs +++ b/zenoh/src/net/routing/dispatcher/pubsub.rs @@ -332,31 +332,7 @@ pub fn route_data( msg.wire_expr = key_expr.into(); msg.ext_nodeid = ext::NodeIdType { node_id: *context }; - let prefix = { - let tables = tables_ref - .tables - .read() - .expect("reading Tables should not fail"); - match tables - .get_sent_mapping( - &outface.state, - msg.wire_expr.scope, - msg.wire_expr.mapping, - ) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {} (A)", - msg.wire_expr.scope, - face, - ); - return; - } - } - }; - outface.intercept_push(msg, reliability, prefix) + outface.intercept_push(msg, reliability); } } else { let route = route @@ -389,32 +365,7 @@ pub fn route_data( payload: msg.payload.clone(), }; - let prefix = { - let tables = tables_ref - .tables - .read() - .expect("reading Tables should not fail"); - - match tables - .get_sent_mapping( - &outface.state, - msg.wire_expr.scope, - msg.wire_expr.mapping, - ) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {} (B)", - msg.wire_expr.scope, - face, - ); - return; - } - } - }; - outface.intercept_push(msg, reliability, prefix) + outface.intercept_push(msg, reliability) } } } diff --git a/zenoh/src/net/routing/dispatcher/queries.rs b/zenoh/src/net/routing/dispatcher/queries.rs index f4541cf789..6869bd883c 100644 --- a/zenoh/src/net/routing/dispatcher/queries.rs +++ b/zenoh/src/net/routing/dispatcher/queries.rs @@ -549,31 +549,7 @@ pub fn route_query(tables_ref: &Arc, face: &Face, msg: &mut Request) payload: msg.payload.clone(), }; - let prefix = { - let tables = tables_ref - .tables - .read() - .expect("reading Tables should not fail"); - match tables - .get_sent_mapping( - &outface.state, - msg.wire_expr.scope, - msg.wire_expr.mapping, - ) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - face, - ); - return; - } - } - }; - outface.intercept_request(msg, prefix); + outface.intercept_request(msg); } } } else { @@ -640,31 +616,7 @@ pub(crate) fn route_send_response( msg.rid = query.src_qid; - let prefix = { - let tables = tables_ref - .tables - .read() - .expect("reading Tables should not fail"); - match tables - .get_sent_mapping( - &query.src_face.state, - msg.wire_expr.scope, - msg.wire_expr.mapping, - ) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - face, - ); - return; - } - } - }; - query.src_face.intercept_response(msg, prefix); + query.src_face.intercept_response(msg); } None => tracing::warn!("{}:{} Route reply: Query not found!", face, msg.rid), } From ad860a1b41af1efee372a7cf3c590723040226d3 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 15:22:47 +0200 Subject: [PATCH 44/49] Deduplicated code --- zenoh/src/net/routing/dispatcher/face.rs | 218 ++++++++--------------- 1 file changed, 70 insertions(+), 148 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 164d72ea31..87e671a089 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -15,8 +15,8 @@ use std::{ any::Any, collections::HashMap, fmt, - ops::Not, - sync::{Arc, Weak}, + ops::{Deref, Not}, + sync::{Arc, RwLockReadGuard, Weak}, time::Duration, }; @@ -25,7 +25,7 @@ use arc_swap::ArcSwap; use tokio_util::sync::CancellationToken; use zenoh_config::InterceptorFlow; use zenoh_protocol::{ - core::{ExprId, Reliability, WhatAmI, ZenohIdProto}, + core::{ExprId, Reliability, WhatAmI, WireExpr, ZenohIdProto}, network::{ declare, interest::{InterestId, InterestMode, InterestOptions}, @@ -44,7 +44,7 @@ use super::{ super::router::*, interests::{declare_final, declare_interest, undeclare_interest, PendingCurrentInterest}, resource::*, - tables::TablesLock, + tables::{Tables, TablesLock}, }; use crate::net::{ primitives::{EPrimitives, McastMux, Mux, Primitives}, @@ -432,30 +432,8 @@ impl Primitives for Face { fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match msg.wire_expr() { - Some(we) => { - match tables - .get_mapping(&self.state, we.scope, we.mapping) - .cloned() - { - Some(prefix) => Some(prefix), - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - we.scope, - self, - ); - return; - } - } - } - None => None, + let Ok(prefix) = msg.wire_expr().map(|we| self.prefix(we)).transpose() else { + return; }; let msg = NetworkMessageMut { @@ -615,25 +593,8 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -641,7 +602,7 @@ impl Primitives for Face { body: NetworkBodyMut::Push(msg), reliability, }, - prefix, + prefix.prefix, ); if !self @@ -657,25 +618,8 @@ impl Primitives for Face { fn send_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -683,7 +627,7 @@ impl Primitives for Face { body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable }, - prefix, + prefix.prefix, ); if !self @@ -711,25 +655,8 @@ impl Primitives for Face { fn send_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -737,7 +664,7 @@ impl Primitives for Face { body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, // NOTE: queries are always reliable }, - prefix, + prefix.prefix, ); if !self @@ -803,7 +730,53 @@ impl fmt::Display for Face { } } +/// [`Resource`] prefix. +/// +/// # Safety +/// +/// The [`Tables`] lock is also stored to ensure that the [`Resource`] is not accessed without it. +/// Otherwise we could run into undefined behavior when using [`get_mut_unchecked`]. +pub(crate) struct Prefix<'face> { + _tables: RwLockReadGuard<'face, Tables>, + pub prefix: Arc, +} + +impl Deref for Prefix<'_> { + type Target = Arc; + + fn deref(&self) -> &Self::Target { + &self.prefix + } +} + impl Face { + /// Returns the [`Prefix`] associated with the given [`WireExpr`]. + pub(crate) fn prefix(&self, wire_expr: &WireExpr) -> Result, ()> { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_sent_mapping(&self.state, wire_expr.scope, wire_expr.mapping) + .cloned() + { + Some(prefix) => Ok(Prefix { + _tables: tables, + prefix, + }), + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {}", + wire_expr.scope, + self + ); + Err(()) + } + } + } + pub(crate) fn intercept_interest(&self, msg: &mut Interest, prefix: Option<&Arc>) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let interest_id = msg.id; @@ -864,25 +837,8 @@ impl Face { pub(crate) fn intercept_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -890,7 +846,7 @@ impl Face { body: NetworkBodyMut::Push(msg), reliability, }, - prefix, + prefix.prefix, ); if !self @@ -906,25 +862,8 @@ impl Face { pub(crate) fn intercept_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -932,7 +871,7 @@ impl Face { body: NetworkBodyMut::Request(msg), reliability: Reliability::Reliable, // NOTE: Request is always reliable }, - prefix, + prefix.prefix, ); if !self @@ -956,25 +895,8 @@ impl Face { pub(crate) fn intercept_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match tables - .get_sent_mapping(&self.state, msg.wire_expr.scope, msg.wire_expr.mapping) - .cloned() - { - Some(prefix) => prefix, - None => { - tracing::error!( - "Got WireExpr with unknown scope {} from {}", - msg.wire_expr.scope, - self, - ); - return; - } + let Ok(prefix) = self.prefix(&msg.wire_expr) else { + return; }; let ctx = &mut RoutingContext::with_prefix( @@ -982,7 +904,7 @@ impl Face { body: NetworkBodyMut::Response(msg), reliability: Reliability::Reliable, // NOTE: Response is always reliable }, - prefix, + prefix.prefix, ); if !self From 4b53666d6ee4e910aaca497376f1f2c5b496263a Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 15:27:37 +0200 Subject: [PATCH 45/49] Remove interceptors from `McastMux` --- zenoh/src/net/primitives/mux.rs | 11 +++-------- zenoh/src/net/routing/dispatcher/face.rs | 24 ++++-------------------- zenoh/src/net/routing/router.rs | 2 +- 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/zenoh/src/net/primitives/mux.rs b/zenoh/src/net/primitives/mux.rs index d4b1620cc6..2ec3603cae 100644 --- a/zenoh/src/net/primitives/mux.rs +++ b/zenoh/src/net/primitives/mux.rs @@ -12,7 +12,6 @@ // ZettaScale Zenoh Team, // -use arc_swap::ArcSwap; use zenoh_protocol::{ core::Reliability, network::{ @@ -23,7 +22,7 @@ use zenoh_protocol::{ use zenoh_transport::{multicast::TransportMulticast, unicast::TransportUnicast}; use super::EPrimitives; -use crate::net::routing::{interceptor::InterceptorsChain, RoutingContext}; +use crate::net::routing::RoutingContext; pub struct Mux { pub handler: TransportUnicast, @@ -93,15 +92,11 @@ impl EPrimitives for Mux { pub struct McastMux { pub handler: TransportMulticast, - pub(crate) interceptor: ArcSwap, } impl McastMux { - pub(crate) fn new(handler: TransportMulticast, interceptor: InterceptorsChain) -> McastMux { - McastMux { - handler, - interceptor: ArcSwap::new(interceptor.into()), - } + pub(crate) fn new(handler: TransportMulticast) -> McastMux { + McastMux { handler } } } diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 87e671a089..1878245614 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -216,25 +216,6 @@ impl FaceState { .e_interceptor_cache = InterceptorCache::new(cache, iceptor.version); } } - - if let Some(iceptor) = self - .primitives - .as_any() - .downcast_ref::() - .map(|mux| mux.interceptor.load()) - .and_then(|is| is.is_empty().not().then_some(is)) - { - if let Some(expr) = res.keyexpr() { - let cache = iceptor.compute_keyexpr_cache(expr); - get_mut_unchecked( - get_mut_unchecked(res) - .session_ctxs - .get_mut(&self.id) - .unwrap(), - ) - .e_interceptor_cache = InterceptorCache::new(cache, iceptor.version); - } - } } pub(crate) fn set_interceptors_from_factories( @@ -267,7 +248,10 @@ impl FaceState { .collect::>(), version, ); - mux.interceptor.store(Arc::new(interceptor)); + self.eg_interceptors + .as_ref() + .expect("face eg_interceptors should not be None when primitives are DeMux") + .store(Arc::new(interceptor)); debug_assert!(self.in_interceptors.is_none()); } else if let Some(transport) = &self.mcast_group { let interceptor = InterceptorsChain::new( diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index f1e87bfd5e..d8dc70e3fc 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -174,7 +174,7 @@ impl Router { let mut tables = zwrite!(self.tables.tables); let fid = tables.face_counter; tables.face_counter += 1; - let mux = Arc::new(McastMux::new(transport.clone(), InterceptorsChain::empty())); + let mux = Arc::new(McastMux::new(transport.clone())); let face = FaceState::new( fid, ZenohIdProto::from_str("1").unwrap(), From fd353fa45a1063fc9da7e95a3f0b11e422b896f9 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 15:28:26 +0200 Subject: [PATCH 46/49] Remove `QueryDirection` --- zenoh/src/net/routing/dispatcher/resource.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/resource.rs b/zenoh/src/net/routing/dispatcher/resource.rs index 72d8e7e84f..244ed05cef 100644 --- a/zenoh/src/net/routing/dispatcher/resource.rs +++ b/zenoh/src/net/routing/dispatcher/resource.rs @@ -49,10 +49,9 @@ pub(crate) type NodeId = u16; pub(crate) type Direction = (Face, WireExpr<'static>, NodeId); pub(crate) type Route = HashMap; -pub(crate) type QueryDirection = (Face, WireExpr<'static>, NodeId); -pub(crate) type QueryRoute = HashMap; +pub(crate) type QueryRoute = HashMap; pub(crate) struct QueryTargetQabl { - pub(crate) direction: QueryDirection, + pub(crate) direction: Direction, pub(crate) info: Option, } pub(crate) type QueryTargetQablSet = Vec; From cbf8100446afc700fa8600c5643453740580edfd Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 15:30:02 +0200 Subject: [PATCH 47/49] Why indeed --- zenoh/src/net/routing/interceptor/low_pass.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zenoh/src/net/routing/interceptor/low_pass.rs b/zenoh/src/net/routing/interceptor/low_pass.rs index 5eef9051f6..cce2a87a39 100644 --- a/zenoh/src/net/routing/interceptor/low_pass.rs +++ b/zenoh/src/net/routing/interceptor/low_pass.rs @@ -247,7 +247,7 @@ impl LowPassInterceptor { fn message_passes_filters( &self, - ctx: &RoutingContext>, + ctx: &RoutingContext, cache: Option<&Cache>, ) -> Result<(), usize> { let payload_size: usize; From 5ab5856e7c16e4ded0a80eb163d84c183a4d5d36 Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Thu, 17 Apr 2025 15:41:28 +0200 Subject: [PATCH 48/49] Distinguish ingress/egress `Prefix` --- zenoh/src/net/routing/dispatcher/face.rs | 82 ++++++++++++++---------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/zenoh/src/net/routing/dispatcher/face.rs b/zenoh/src/net/routing/dispatcher/face.rs index 1878245614..ed96aac00f 100644 --- a/zenoh/src/net/routing/dispatcher/face.rs +++ b/zenoh/src/net/routing/dispatcher/face.rs @@ -330,30 +330,13 @@ impl Face { impl Primitives for Face { fn send_interest(&self, msg: &mut zenoh_protocol::network::Interest) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let tables = self - .tables - .tables - .read() - .expect("reading Tables should not fail"); - - let prefix = match &msg.wire_expr { - Some(we) => { - match tables - .get_mapping(&self.state, we.scope, we.mapping) - .cloned() - { - Some(prefix) => Some(prefix), - None => { - tracing::error!( - "Received WireExpr with unknown scope {} from {}", - we.scope, - self, - ); - return; - } - } - } - None => None, + let Ok(prefix) = msg + .wire_expr + .as_ref() + .map(|we| self.ingress_prefix(we)) + .transpose() + else { + return; }; let interest_id = msg.id; @@ -362,7 +345,7 @@ impl Primitives for Face { reliability: Reliability::Reliable, // Interest is always reliable }; let ctx = &mut match &prefix { - Some(prefix) => RoutingContext::with_prefix(msg, prefix.clone()), + Some(prefix) => RoutingContext::with_prefix(msg, prefix.prefix.clone()), None => RoutingContext::new(msg), }; @@ -416,7 +399,11 @@ impl Primitives for Face { fn send_declare(&self, msg: &mut zenoh_protocol::network::Declare) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let Ok(prefix) = msg.wire_expr().map(|we| self.prefix(we)).transpose() else { + let Ok(prefix) = msg + .wire_expr() + .map(|we| self.ingress_prefix(we)) + .transpose() + else { return; }; @@ -577,7 +564,7 @@ impl Primitives for Face { #[inline] fn send_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.ingress_prefix(&msg.wire_expr) else { return; }; @@ -602,7 +589,7 @@ impl Primitives for Face { fn send_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.ingress_prefix(&msg.wire_expr) else { return; }; @@ -639,7 +626,7 @@ impl Primitives for Face { fn send_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Ingress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.ingress_prefix(&msg.wire_expr) else { return; }; @@ -734,8 +721,8 @@ impl Deref for Prefix<'_> { } impl Face { - /// Returns the [`Prefix`] associated with the given [`WireExpr`]. - pub(crate) fn prefix(&self, wire_expr: &WireExpr) -> Result, ()> { + /// Returns the [`Prefix`] associated with the given [`WireExpr`] for transmitted messages. + pub(crate) fn egress_prefix(&self, wire_expr: &WireExpr) -> Result, ()> { let tables = self .tables .tables @@ -761,6 +748,33 @@ impl Face { } } + /// Returns the [`Prefix`] associated with the given [`WireExpr`] for received messages. + pub(crate) fn ingress_prefix(&self, wire_expr: &WireExpr) -> Result, ()> { + let tables = self + .tables + .tables + .read() + .expect("reading Tables should not fail"); + + match tables + .get_mapping(&self.state, wire_expr.scope, wire_expr.mapping) + .cloned() + { + Some(prefix) => Ok(Prefix { + _tables: tables, + prefix, + }), + None => { + tracing::error!( + "Got WireExpr with unknown scope {} from {}", + wire_expr.scope, + self + ); + Err(()) + } + } + } + pub(crate) fn intercept_interest(&self, msg: &mut Interest, prefix: Option<&Arc>) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { let interest_id = msg.id; @@ -821,7 +835,7 @@ impl Face { pub(crate) fn intercept_push(&self, msg: &mut Push, reliability: Reliability) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.egress_prefix(&msg.wire_expr) else { return; }; @@ -846,7 +860,7 @@ impl Face { pub(crate) fn intercept_request(&self, msg: &mut Request) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.egress_prefix(&msg.wire_expr) else { return; }; @@ -879,7 +893,7 @@ impl Face { pub(crate) fn intercept_response(&self, msg: &mut Response) { if let Some(iceptor) = self.state.load_interceptors(InterceptorFlow::Egress) { - let Ok(prefix) = self.prefix(&msg.wire_expr) else { + let Ok(prefix) = self.egress_prefix(&msg.wire_expr) else { return; }; From 34014ff15be670c2a3f4cffe45b77eec07f4ee1a Mon Sep 17 00:00:00 2001 From: Mahmoud Mazouz Date: Tue, 22 Apr 2025 10:21:01 +0200 Subject: [PATCH 49/49] Set egress interceptors for `McastMux` --- zenoh/src/net/routing/router.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zenoh/src/net/routing/router.rs b/zenoh/src/net/routing/router.rs index d8dc70e3fc..02d1531f5b 100644 --- a/zenoh/src/net/routing/router.rs +++ b/zenoh/src/net/routing/router.rs @@ -175,6 +175,7 @@ impl Router { let fid = tables.face_counter; tables.face_counter += 1; let mux = Arc::new(McastMux::new(transport.clone())); + let egress = ArcSwap::new(Arc::new(InterceptorsChain::empty())); let face = FaceState::new( fid, ZenohIdProto::from_str("1").unwrap(), @@ -184,7 +185,7 @@ impl Router { mux.clone(), Some(transport), None, - None, + Some(egress), ctrl_lock.new_face(), false, );