diff --git a/commons/zenoh-codec/src/network/mod.rs b/commons/zenoh-codec/src/network/mod.rs index 452af414a7..812e3b50f6 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, NetworkMessageExt, NetworkMessageRef, + }, }; use crate::{ @@ -33,27 +36,38 @@ 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), } } } +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, 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..b6161d2240 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,6 +110,175 @@ pub struct NetworkMessage { pub size: Option, } +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub struct NetworkMessageRef<'a> { + pub body: NetworkBodyRef<'a>, + pub reliability: Reliability, + #[cfg(feature = "stats")] + pub size: Option, +} + +#[derive(Debug, PartialEq, Eq)] +pub struct NetworkMessageMut<'a> { + pub body: NetworkBodyMut<'a>, + pub reliability: Reliability, + #[cfg(feature = "stats")] + pub size: Option, +} + +pub trait NetworkMessageExt { + #[doc(hidden)] + fn body(&self) -> NetworkBodyRef; + #[doc(hidden)] + fn reliability(&self) -> Reliability; + #[cfg(feature = "stats")] + fn size(&self) -> Option; + + #[inline] + fn is_reliable(&self) -> bool { + self.reliability() == Reliability::Reliable + } + + #[inline] + 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] + fn is_droppable(&self) -> bool { + if !self.is_reliable() { + return true; + } + + 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] + 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(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 NetworkMessageExt for NetworkMessageRef<'_> { + fn body(&self) -> NetworkBodyRef { + self.body + } + + fn reliability(&self) -> Reliability { + self.reliability + } + + #[cfg(feature = "stats")] + fn size(&self) -> Option { + self.size + } +} + +impl NetworkMessageExt for NetworkMessageMut<'_> { + fn body(&self) -> NetworkBodyRef { + match &self.body { + 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 NetworkMessage { #[cfg(feature = "test")] pub fn rand() -> Self { @@ -109,68 +300,69 @@ impl NetworkMessage { } #[inline] - pub 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(), + 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: self.reliability, + #[cfg(feature = "stats")] + size: self.size, } } +} +impl NetworkMessageMut<'_> { #[inline] - pub 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(), + 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), }; - - cc == CongestionControl::Drop + NetworkMessageMut { + body, + reliability: self.reliability, + #[cfg(feature = "stats")] + size: self.size, + } } +} - #[inline] - pub fn priority(&self) -> Priority { +impl fmt::Display for NetworkMessageRef<'_> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 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(), + 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 fmt::Display for NetworkMessage { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use NetworkBody::*; - 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"), - } + self.as_ref().fmt(f) + } +} + +impl fmt::Display for NetworkMessageMut<'_> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.as_ref().fmt(f) } } 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/io/zenoh-transport/src/common/batch.rs b/io/zenoh-transport/src/common/batch.rs index 0a0a41cf91..3902ed1b2a 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}; @@ -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 @@ -374,19 +375,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")] @@ -535,7 +536,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 +630,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 +641,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 +656,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 0e814687bb..2097aa9e75 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 @@ -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}, }; @@ -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/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..74f89cd3f1 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(()) } @@ -500,7 +500,7 @@ async fn test_transport( .into(); for _ in 0..msg_count { - let _ = client_transport.schedule(message.clone()); + let _ = client_transport.schedule(message.clone().as_mut()); } ztimeout!(async { 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..1cbe8db8d9 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, msg: &mut Push, reliability: Reliability) { + let msg = NetworkMessageMut { + body: NetworkBodyMut::Push(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..a0b6f3e354 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) @@ -394,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), @@ -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..61779266e9 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}, }; @@ -365,9 +365,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,74 +377,89 @@ impl InterceptorTrait for IngressAclEnforcer { }); match &ctx.msg.body { - NetworkBody::Request(Request { + NetworkBodyMut::Request(Request { payload: RequestBody::Query(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.query), AclMessage::Query, "Query (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Response(Response { .. }) => { + NetworkBodyMut::Response(Response { .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.reply), AclMessage::Reply, "Reply (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.put), AclMessage::Put, "Put (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.delete), AclMessage::Delete, "Delete (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareSubscriber(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_subscriber), AclMessage::DeclareSubscriber, "Declare Subscriber (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareSubscriber(_), .. }) => { @@ -459,24 +474,27 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareQueryable(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_queryable), AclMessage::DeclareQueryable, "Declare Queryable (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareQueryable(_), .. }) => { @@ -491,25 +509,28 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareToken(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_token), AclMessage::LivelinessToken, "Liveliness Token (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareToken(_), .. }) => { @@ -524,40 +545,46 @@ impl InterceptorTrait for IngressAclEnforcer { ctx.full_keyexpr(), ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Current, options, .. }) if options.tokens() => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.query_token), AclMessage::LivelinessQuery, "Liveliness Query (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Future | InterestMode::CurrentFuture, options, .. }) if options.tokens() => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Declare Liveliness Subscriber (ingress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Final, .. }) => { @@ -565,23 +592,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 +653,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,184 +665,223 @@ impl InterceptorTrait for EgressAclEnforcer { }); match &ctx.msg.body { - NetworkBody::Request(Request { + NetworkBodyMut::Request(Request { payload: RequestBody::Query(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.query), AclMessage::Query, "Query (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Response(Response { .. }) => { + NetworkBodyMut::Response(Response { .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.reply), AclMessage::Reply, "Reply (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Put(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.put), AclMessage::Put, "Put (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Push(Push { + NetworkBodyMut::Push(Push { payload: PushBody::Del(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.put), AclMessage::Delete, "Delete (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareSubscriber(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_subscriber), AclMessage::DeclareSubscriber, "Declare Subscriber (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareSubscriber(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; // Undeclaration 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_subscriber), AclMessage::DeclareSubscriber, "Undeclare Subscriber (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareQueryable(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_queryable), AclMessage::DeclareQueryable, "Declare Queryable (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareQueryable(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; // Undeclaration 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_queryable), AclMessage::DeclareQueryable, "Undeclare Queryable (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::DeclareToken(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_token), AclMessage::LivelinessToken, "Liveliness Token (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Declare(Declare { + NetworkBodyMut::Declare(Declare { body: DeclareBody::UndeclareToken(_), .. }) => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; // Undeclaration 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_token), AclMessage::LivelinessToken, "Undeclare Liveliness Token (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Current, options, .. }) if options.tokens() => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.query_token), AclMessage::LivelinessQuery, "Liveliness Query (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Future | InterestMode::CurrentFuture, options, .. }) if options.tokens() => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; if self.cached_result_or_action( cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Declare Liveliness Subscriber (egress)", - ctx.full_keyexpr()?, + keyexpr, ) == Permission::Deny { - return None; + return false; } } - NetworkBody::Interest(Interest { + NetworkBodyMut::Interest(Interest { mode: InterestMode::Final, options, .. }) if options.tokens() => { + let Some(keyexpr) = ctx.full_keyexpr() else { + return false; + }; // Note: options are set for InterestMode::Final for internal use only by egress interceptors. // InterestMode::Final filtering diverges between ingress and egress: @@ -822,30 +890,32 @@ impl InterceptorTrait for EgressAclEnforcer { cache.map(|c| c.declare_liveliness_subscriber), AclMessage::DeclareLivelinessSubscriber, "Undeclare Liveliness Subscriber (egress)", - ctx.full_keyexpr()?, + 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..f027c1b38b 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..e48be2cdd2 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 { + }) => 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), - NetworkBody::Request(_) => { - self.filter.query && 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) } - NetworkBody::Response(_) => { - self.filter.reply && 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) } - 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..b9bd6b6f0c 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,37 @@ impl EPrimitives for ENamespace { self } - fn send_interest(&self, mut ctx: super::RoutingContext) { - 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) { - 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); } } - 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, ); 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 } }