Skip to content

Commit af6372a

Browse files
Merge pull request #105 from cloudflare/revert-100-me/namespace-hierarchies
Revert "Add support for namespace hierachies"
2 parents 5ee6b59 + d698588 commit af6372a

File tree

3 files changed

+5
-193
lines changed

3 files changed

+5
-193
lines changed

moq-relay-ietf/src/local.rs

Lines changed: 2 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,9 @@ impl Locals {
4646
Ok(registration)
4747
}
4848

49-
/// Lookup local tracks by namespace using hierarchical prefix matching.
50-
/// Returns the TracksReader for the longest matching namespace prefix.
49+
/// Lookup local tracks by namespace.
5150
pub fn route(&self, namespace: &TrackNamespace) -> Option<TracksReader> {
52-
let lookup = self.lookup.lock().unwrap();
53-
54-
// Find the longest matching prefix
55-
let mut best_match: Option<(usize, TracksReader)> = None;
56-
57-
for (registered_ns, tracks) in lookup.iter() {
58-
if registered_ns.is_prefix_of(namespace) {
59-
let prefix_len = registered_ns.len();
60-
if best_match.is_none() || best_match.as_ref().unwrap().0 < prefix_len {
61-
best_match = Some((prefix_len, tracks.clone()));
62-
}
63-
}
64-
}
65-
66-
best_match.map(|(_, tracks)| tracks)
51+
self.lookup.lock().unwrap().get(namespace).cloned()
6752
}
6853
}
6954

@@ -78,94 +63,3 @@ impl Drop for Registration {
7863
self.locals.lookup.lock().unwrap().remove(&self.namespace);
7964
}
8065
}
81-
82-
#[cfg(test)]
83-
mod tests {
84-
use super::*;
85-
use moq_transport::{coding::TrackNamespace, serve::Tracks};
86-
87-
#[tokio::test]
88-
async fn test_exact_match() {
89-
let mut locals = Locals::new();
90-
let namespace = TrackNamespace::from_utf8_path("moq-test-00");
91-
let (_writer, _request, reader) = Tracks::new(namespace.clone()).produce();
92-
93-
let _registration = locals.register(reader).await.unwrap();
94-
95-
// Exact match should work
96-
let result = locals.route(&namespace);
97-
assert!(result.is_some());
98-
}
99-
100-
#[tokio::test]
101-
async fn test_hierarchical_match() {
102-
let mut locals = Locals::new();
103-
let registered_ns = TrackNamespace::from_utf8_path("moq-test-00");
104-
let (_writer, _request, reader) = Tracks::new(registered_ns.clone()).produce();
105-
106-
let _registration = locals.register(reader).await.unwrap();
107-
108-
// Hierarchical match should work
109-
let query_ns = TrackNamespace::from_utf8_path("moq-test-00/1/2/3");
110-
let result = locals.route(&query_ns);
111-
assert!(
112-
result.is_some(),
113-
"Should match hierarchical namespace moq-test-00/1/2/3 to registered moq-test-00"
114-
);
115-
}
116-
117-
#[tokio::test]
118-
async fn test_no_match() {
119-
let mut locals = Locals::new();
120-
let registered_ns = TrackNamespace::from_utf8_path("moq-test-00");
121-
let (_writer, _request, reader) = Tracks::new(registered_ns.clone()).produce();
122-
123-
let _registration = locals.register(reader).await.unwrap();
124-
125-
// Different namespace should not match
126-
let query_ns = TrackNamespace::from_utf8_path("other-namespace");
127-
let result = locals.route(&query_ns);
128-
assert!(result.is_none());
129-
}
130-
131-
#[tokio::test]
132-
async fn test_longest_match_wins() {
133-
let mut locals = Locals::new();
134-
135-
// Register two namespaces at different levels
136-
let ns1 = TrackNamespace::from_utf8_path("moq-test-00");
137-
let (_writer1, _request1, reader1) = Tracks::new(ns1.clone()).produce();
138-
let _reg1 = locals.register(reader1).await.unwrap();
139-
140-
let ns2 = TrackNamespace::from_utf8_path("moq-test-00/1");
141-
let (_writer2, _request2, reader2) = Tracks::new(ns2.clone()).produce();
142-
let _reg2 = locals.register(reader2).await.unwrap();
143-
144-
// Query for a deeper namespace
145-
let query_ns = TrackNamespace::from_utf8_path("moq-test-00/1/2/3");
146-
let result = locals.route(&query_ns);
147-
assert!(result.is_some());
148-
149-
// The result should be the more specific match (moq-test-00/1)
150-
// We can verify this by checking the namespace on the returned TracksReader
151-
let tracks_reader = result.unwrap();
152-
assert_eq!(tracks_reader.namespace, ns2);
153-
}
154-
155-
#[tokio::test]
156-
async fn test_partial_match_fails() {
157-
let mut locals = Locals::new();
158-
let registered_ns = TrackNamespace::from_utf8_path("moq-test-00/1/2");
159-
let (_writer, _request, reader) = Tracks::new(registered_ns.clone()).produce();
160-
161-
let _registration = locals.register(reader).await.unwrap();
162-
163-
// Querying for a shorter namespace should not match
164-
let query_ns = TrackNamespace::from_utf8_path("moq-test-00/1");
165-
let result = locals.route(&query_ns);
166-
assert!(
167-
result.is_none(),
168-
"Shorter namespace should not match longer registered namespace"
169-
);
170-
}
171-
}

moq-relay-ietf/src/remote.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,26 +129,14 @@ impl RemotesConsumer {
129129
}
130130

131131
/// Route to a remote origin based on the namespace.
132-
/// Tries hierarchical prefix matching from longest to shortest.
133132
pub async fn route(
134133
&self,
135134
namespace: &TrackNamespace,
136135
) -> anyhow::Result<Option<RemoteConsumer>> {
137-
// Try all prefixes from longest to shortest
138-
let prefixes = namespace.get_prefixes();
139-
140-
// Find the first matching origin
141-
let mut origin = None;
142-
for prefix in prefixes {
143-
if let Some(o) = self.api.get_origin(&prefix.to_utf8_path()).await? {
144-
origin = Some(o);
145-
break;
146-
}
147-
}
148-
149-
let origin = match origin {
136+
// Always fetch the origin instead of using the (potentially invalid) cache.
137+
let origin = match self.api.get_origin(&namespace.to_utf8_path()).await? {
150138
None => return Ok(None),
151-
Some(o) => o,
139+
Some(origin) => origin,
152140
};
153141

154142
// Check if we already have a remote for this origin

moq-transport/src/coding/track_namespace.rs

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -39,39 +39,6 @@ impl TrackNamespace {
3939
}
4040
path
4141
}
42-
43-
/// Returns the number of fields in the namespace.
44-
pub fn len(&self) -> usize {
45-
self.fields.len()
46-
}
47-
48-
/// Returns true if the namespace has no fields.
49-
pub fn is_empty(&self) -> bool {
50-
self.fields.is_empty()
51-
}
52-
53-
/// Check if this namespace is a prefix of another namespace.
54-
/// Returns true if all fields in `self` match the beginning fields of `other`.
55-
pub fn is_prefix_of(&self, other: &TrackNamespace) -> bool {
56-
if self.len() > other.len() {
57-
return false;
58-
}
59-
self.fields
60-
.iter()
61-
.zip(other.fields.iter())
62-
.all(|(a, b)| a == b)
63-
}
64-
65-
/// Get all prefixes of this namespace, from longest to shortest (not including empty).
66-
/// For example, "a/b/c" returns ["a/b/c", "a/b", "a"].
67-
pub fn get_prefixes(&self) -> Vec<TrackNamespace> {
68-
(1..=self.len())
69-
.rev()
70-
.map(|i| Self {
71-
fields: self.fields[0..i].to_vec(),
72-
})
73-
.collect()
74-
}
7542
}
7643

7744
impl Hash for TrackNamespace {
@@ -198,41 +165,4 @@ mod tests {
198165
DecodeError::FieldBoundsExceeded(_)
199166
));
200167
}
201-
202-
#[test]
203-
fn test_is_prefix_of() {
204-
let ns1 = TrackNamespace::from_utf8_path("moq-test-00");
205-
let ns2 = TrackNamespace::from_utf8_path("moq-test-00/1/2/3");
206-
let ns3 = TrackNamespace::from_utf8_path("moq-test-00/1");
207-
let ns4 = TrackNamespace::from_utf8_path("other");
208-
209-
// Test prefix matching
210-
assert!(ns1.is_prefix_of(&ns2));
211-
assert!(ns1.is_prefix_of(&ns3));
212-
assert!(ns1.is_prefix_of(&ns1));
213-
assert!(ns3.is_prefix_of(&ns2));
214-
215-
// Test non-matching
216-
assert!(!ns2.is_prefix_of(&ns1)); // Longer is not prefix of shorter
217-
assert!(!ns4.is_prefix_of(&ns1)); // Different namespace
218-
assert!(!ns4.is_prefix_of(&ns2));
219-
}
220-
221-
#[test]
222-
fn test_get_prefixes() {
223-
let ns = TrackNamespace::from_utf8_path("moq-test-00/1/2/3");
224-
let prefixes = ns.get_prefixes();
225-
226-
assert_eq!(prefixes.len(), 4);
227-
assert_eq!(prefixes[0].to_utf8_path(), "/moq-test-00/1/2/3");
228-
assert_eq!(prefixes[1].to_utf8_path(), "/moq-test-00/1/2");
229-
assert_eq!(prefixes[2].to_utf8_path(), "/moq-test-00/1");
230-
assert_eq!(prefixes[3].to_utf8_path(), "/moq-test-00");
231-
232-
// Test single element
233-
let ns_single = TrackNamespace::from_utf8_path("moq-test-00");
234-
let prefixes_single = ns_single.get_prefixes();
235-
assert_eq!(prefixes_single.len(), 1);
236-
assert_eq!(prefixes_single[0].to_utf8_path(), "/moq-test-00");
237-
}
238168
}

0 commit comments

Comments
 (0)