Rename NamespacePublisherMultimap to RelayNamespaceTree.
After a redesign, this is a tree structure, not a multimap, although it stores multiple entries at each mode.
Moreover, it will store both subscribers and publishers. It is designed specifically for relays.
More refactoring is to follow, but I'm doing the renaming first.
PiperOrigin-RevId: 815718148
diff --git a/build/source_list.bzl b/build/source_list.bzl
index 8ddf213..d5c6cb9 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1574,8 +1574,8 @@
"quic/moqt/moqt_session_interface.h",
"quic/moqt/moqt_subscribe_windows.h",
"quic/moqt/moqt_track.h",
- "quic/moqt/namespace_publisher_multimap.h",
"quic/moqt/namespace_tree.h",
+ "quic/moqt/relay_namespace_tree.h",
"quic/moqt/tools/chat_client.h",
"quic/moqt/tools/chat_server.h",
"quic/moqt/tools/moq_chat.h",
@@ -1624,8 +1624,8 @@
"quic/moqt/moqt_session_test.cc",
"quic/moqt/moqt_subscribe_windows_test.cc",
"quic/moqt/moqt_track_test.cc",
- "quic/moqt/namespace_publisher_multimap_test.cc",
"quic/moqt/namespace_tree_test.cc",
+ "quic/moqt/relay_namespace_tree_test.cc",
"quic/moqt/tools/moq_chat_end_to_end_test.cc",
"quic/moqt/tools/moq_chat_test.cc",
"quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 4e627df..860dfb3 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1578,8 +1578,8 @@
"src/quiche/quic/moqt/moqt_session_interface.h",
"src/quiche/quic/moqt/moqt_subscribe_windows.h",
"src/quiche/quic/moqt/moqt_track.h",
- "src/quiche/quic/moqt/namespace_publisher_multimap.h",
"src/quiche/quic/moqt/namespace_tree.h",
+ "src/quiche/quic/moqt/relay_namespace_tree.h",
"src/quiche/quic/moqt/tools/chat_client.h",
"src/quiche/quic/moqt/tools/chat_server.h",
"src/quiche/quic/moqt/tools/moq_chat.h",
@@ -1629,8 +1629,8 @@
"src/quiche/quic/moqt/moqt_session_test.cc",
"src/quiche/quic/moqt/moqt_subscribe_windows_test.cc",
"src/quiche/quic/moqt/moqt_track_test.cc",
- "src/quiche/quic/moqt/namespace_publisher_multimap_test.cc",
"src/quiche/quic/moqt/namespace_tree_test.cc",
+ "src/quiche/quic/moqt/relay_namespace_tree_test.cc",
"src/quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc",
"src/quiche/quic/moqt/tools/moq_chat_test.cc",
"src/quiche/quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/build/source_list.json b/build/source_list.json
index 8a20ecb..42ce916 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1577,8 +1577,8 @@
"quiche/quic/moqt/moqt_session_interface.h",
"quiche/quic/moqt/moqt_subscribe_windows.h",
"quiche/quic/moqt/moqt_track.h",
- "quiche/quic/moqt/namespace_publisher_multimap.h",
"quiche/quic/moqt/namespace_tree.h",
+ "quiche/quic/moqt/relay_namespace_tree.h",
"quiche/quic/moqt/tools/chat_client.h",
"quiche/quic/moqt/tools/chat_server.h",
"quiche/quic/moqt/tools/moq_chat.h",
@@ -1628,8 +1628,8 @@
"quiche/quic/moqt/moqt_session_test.cc",
"quiche/quic/moqt/moqt_subscribe_windows_test.cc",
"quiche/quic/moqt/moqt_track_test.cc",
- "quiche/quic/moqt/namespace_publisher_multimap_test.cc",
"quiche/quic/moqt/namespace_tree_test.cc",
+ "quiche/quic/moqt/relay_namespace_tree_test.cc",
"quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc",
"quiche/quic/moqt/tools/moq_chat_test.cc",
"quiche/quic/moqt/tools/moqt_end_to_end_test.cc",
diff --git a/quiche/quic/moqt/moqt_relay_publisher.h b/quiche/quic/moqt/moqt_relay_publisher.h
index bf3f3da..07556b1 100644
--- a/quiche/quic/moqt/moqt_relay_publisher.h
+++ b/quiche/quic/moqt/moqt_relay_publisher.h
@@ -14,7 +14,7 @@
#include "quiche/quic/moqt/moqt_relay_track_publisher.h"
#include "quiche/quic/moqt/moqt_session_callbacks.h"
#include "quiche/quic/moqt/moqt_session_interface.h"
-#include "quiche/quic/moqt/namespace_publisher_multimap.h"
+#include "quiche/quic/moqt/relay_namespace_tree.h"
#include "quiche/common/quiche_weak_ptr.h"
namespace moqt {
@@ -64,7 +64,7 @@
// An indexed map of namespace to a map of sessions. The key to the inner map
// is indexed by a raw pointer, to make it easier to find entries when
// deleting.
- NamespacePublisherMultimap namespace_publishers_;
+ RelayNamespaceTree namespace_publishers_;
// TODO(martinduke): Add a map of Namespaces to namespace listeners.
diff --git a/quiche/quic/moqt/namespace_publisher_multimap_test.cc b/quiche/quic/moqt/namespace_publisher_multimap_test.cc
deleted file mode 100644
index 7a961c6..0000000
--- a/quiche/quic/moqt/namespace_publisher_multimap_test.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2025 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "quiche/quic/moqt/namespace_publisher_multimap.h"
-
-#include <memory>
-
-#include "quiche/quic/moqt/moqt_messages.h"
-#include "quiche/quic/moqt/test_tools/mock_moqt_session.h"
-#include "quiche/common/platform/api/quiche_test.h"
-
-namespace moqt {
-namespace test {
-
-class NamespacePublisherMultimapTest : public quiche::test::QuicheTest {
- public:
- NamespacePublisherMultimapTest()
- : session_(std::make_unique<MockMoqtSession>()) {}
-
- NamespacePublisherMultimap multimap_;
- TrackNamespace ns1_{"foo", "bar"}, ns2_{"foo"}, ns3_{"foo", "bar", "baz"};
- std::unique_ptr<MockMoqtSession> session_;
-};
-
-TEST_F(NamespacePublisherMultimapTest, AddGetRemovePublisher) {
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
- multimap_.AddPublisher(ns1_, session_.get());
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), session_.get());
- EXPECT_EQ(multimap_.GetValidPublisher(ns2_).GetIfAvailable(), nullptr);
- EXPECT_EQ(multimap_.GetValidPublisher(ns3_).GetIfAvailable(), nullptr);
- multimap_.RemovePublisher(ns1_, session_.get());
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
-}
-
-TEST_F(NamespacePublisherMultimapTest, SessionDestroyed) {
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
- multimap_.AddPublisher(ns1_, session_.get());
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), session_.get());
- session_.reset();
- EXPECT_EQ(multimap_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
-}
-
-} // namespace test
-} // namespace moqt
diff --git a/quiche/quic/moqt/namespace_publisher_multimap.h b/quiche/quic/moqt/relay_namespace_tree.h
similarity index 75%
rename from quiche/quic/moqt/namespace_publisher_multimap.h
rename to quiche/quic/moqt/relay_namespace_tree.h
index d75092b..f387921 100644
--- a/quiche/quic/moqt/namespace_publisher_multimap.h
+++ b/quiche/quic/moqt/relay_namespace_tree.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef QUICHE_QUIC_MOQT_NAMESPACE_PUBLISHER_MULTIMAP_H_
-#define QUICHE_QUIC_MOQT_NAMESPACE_PUBLISHER_MULTIMAP_H_
+#ifndef QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_
+#define QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_
#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
@@ -13,7 +13,14 @@
namespace moqt {
-class NamespacePublisherMultimap {
+// A data structure for all namespaces an MOQT relay is aware of.
+// For any given namespace, it stores all publishers, subscribers, and published
+// tracks in that namespace.
+// A subscriber must be notified of any publish in a child namespace, and a
+// new PUBLISH(_NAMESPACE) has to find subscribers to parent namespaces.
+// Therefore, this is a tree structure to easily and scalably move up and down
+// the hierarchy to find parents or children.
+class RelayNamespaceTree {
public:
void AddPublisher(const TrackNamespace& track_namespace,
MoqtSessionInterface* session) {
@@ -60,4 +67,4 @@
} // namespace moqt
-#endif // QUICHE_QUIC_MOQT_NAMESPACE_PUBLISHER_MULTIMAP_H_
+#endif // QUICHE_QUIC_MOQT_RELAY_NAMESPACE_TREE_H_
diff --git a/quiche/quic/moqt/relay_namespace_tree_test.cc b/quiche/quic/moqt/relay_namespace_tree_test.cc
new file mode 100644
index 0000000..2503a72
--- /dev/null
+++ b/quiche/quic/moqt/relay_namespace_tree_test.cc
@@ -0,0 +1,44 @@
+// Copyright 2025 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "quiche/quic/moqt/relay_namespace_tree.h"
+
+#include <memory>
+
+#include "quiche/quic/moqt/moqt_messages.h"
+#include "quiche/quic/moqt/test_tools/mock_moqt_session.h"
+#include "quiche/common/platform/api/quiche_test.h"
+
+namespace moqt {
+namespace test {
+
+class RelayNamespaceTreeTest : public quiche::test::QuicheTest {
+ public:
+ RelayNamespaceTreeTest() : session_(std::make_unique<MockMoqtSession>()) {}
+
+ RelayNamespaceTree tree_;
+ TrackNamespace ns1_{"foo", "bar"}, ns2_{"foo"}, ns3_{"foo", "bar", "baz"};
+ std::unique_ptr<MockMoqtSession> session_;
+};
+
+TEST_F(RelayNamespaceTreeTest, AddGetRemovePublisher) {
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
+ tree_.AddPublisher(ns1_, session_.get());
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), session_.get());
+ EXPECT_EQ(tree_.GetValidPublisher(ns2_).GetIfAvailable(), nullptr);
+ EXPECT_EQ(tree_.GetValidPublisher(ns3_).GetIfAvailable(), nullptr);
+ tree_.RemovePublisher(ns1_, session_.get());
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
+}
+
+TEST_F(RelayNamespaceTreeTest, SessionDestroyed) {
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
+ tree_.AddPublisher(ns1_, session_.get());
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), session_.get());
+ session_.reset();
+ EXPECT_EQ(tree_.GetValidPublisher(ns1_).GetIfAvailable(), nullptr);
+}
+
+} // namespace test
+} // namespace moqt