Skip to content

Commit 7d213d1

Browse files
authored
Maintain keyexpr type in interceptors (#1851)
* Cache keyexpr as `OwnedKeyExpr` instead of `String` * Rebase against main * Fix test build * Fix low pass interceptor * Add `Resource::keyexpr` * Clippy errors (1)
1 parent cca48c8 commit 7d213d1

File tree

10 files changed

+211
-187
lines changed

10 files changed

+211
-187
lines changed

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

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,13 @@ use super::{
4242
resource::*,
4343
tables::TablesLock,
4444
};
45-
use crate::{
46-
api::key_expr::KeyExpr,
47-
net::{
48-
primitives::{McastMux, Mux, Primitives},
49-
routing::{
50-
dispatcher::interests::finalize_pending_interests,
51-
interceptor::{
52-
EgressInterceptor, IngressInterceptor, InterceptorFactory, InterceptorTrait,
53-
InterceptorsChain,
54-
},
45+
use crate::net::{
46+
primitives::{McastMux, Mux, Primitives},
47+
routing::{
48+
dispatcher::interests::finalize_pending_interests,
49+
interceptor::{
50+
EgressInterceptor, IngressInterceptor, InterceptorFactory, InterceptorTrait,
51+
InterceptorsChain,
5552
},
5653
},
5754
};
@@ -157,8 +154,8 @@ impl FaceState {
157154
.map(|itor| itor.load())
158155
.and_then(|is| is.is_empty().not().then_some(is))
159156
{
160-
if let Ok(expr) = KeyExpr::try_from(res.expr().to_string()) {
161-
let cache = interceptor.compute_keyexpr_cache(&expr);
157+
if let Some(expr) = res.keyexpr() {
158+
let cache = interceptor.compute_keyexpr_cache(expr);
162159
get_mut_unchecked(
163160
get_mut_unchecked(res)
164161
.session_ctxs
@@ -176,8 +173,8 @@ impl FaceState {
176173
.map(|mux| mux.interceptor.load())
177174
.and_then(|is| is.is_empty().not().then_some(is))
178175
{
179-
if let Ok(expr) = KeyExpr::try_from(res.expr().to_string()) {
180-
let cache = interceptor.compute_keyexpr_cache(&expr);
176+
if let Some(expr) = res.keyexpr() {
177+
let cache = interceptor.compute_keyexpr_cache(expr);
181178
get_mut_unchecked(
182179
get_mut_unchecked(res)
183180
.session_ctxs
@@ -195,8 +192,8 @@ impl FaceState {
195192
.map(|mux| mux.interceptor.load())
196193
.and_then(|is| is.is_empty().not().then_some(is))
197194
{
198-
if let Ok(expr) = KeyExpr::try_from(res.expr().to_string()) {
199-
let cache = interceptor.compute_keyexpr_cache(&expr);
195+
if let Some(expr) = res.keyexpr() {
196+
let cache = interceptor.compute_keyexpr_cache(expr);
200197
get_mut_unchecked(
201198
get_mut_unchecked(res)
202199
.session_ctxs

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,7 @@ impl InterceptorCache {
7979
) -> Option<InterceptorCacheValueType> {
8080
self.0
8181
.value(interceptor.version, || {
82-
// Safety: resource expr is always a valid keyexpr
83-
let ke = unsafe { keyexpr::from_str_unchecked(resource.expr()) };
84-
let key_expr = ke.into();
85-
interceptor.compute_keyexpr_cache(&key_expr)
82+
interceptor.compute_keyexpr_cache(resource.keyexpr()?)
8683
})
8784
.ok()
8885
}
@@ -323,6 +320,15 @@ impl Resource {
323320
&self.expr
324321
}
325322

323+
pub fn keyexpr(&self) -> Option<&keyexpr> {
324+
if self.parent.is_none() {
325+
None
326+
} else {
327+
// SAFETY: non-root resources are valid keyexprs
328+
unsafe { Some(keyexpr::from_str_unchecked(&self.expr)) }
329+
}
330+
}
331+
326332
pub fn suffix(&self) -> &str {
327333
&self.expr[self.suffix..]
328334
}

0 commit comments

Comments
 (0)