summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSophia Tan <sophia_tll@hotmail.com>2023-05-04 23:29:56 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-05-05 00:53:53 +0000
commit5c3ac23476c1db1fde06d7b145d0733ac0838041 (patch)
treef4a946f0a265f9861162b5feb3f7f2a1283e889c
parent46540ddcce8b7ab81e5a7f009999aec85114fcab (diff)
downloadmongo-5c3ac23476c1db1fde06d7b145d0733ac0838041.tar.gz
SERVER-74489 Make NamespaceString::toStringWithTenantId private
-rw-r--r--src/mongo/db/catalog/collection_catalog_test.cpp2
-rw-r--r--src/mongo/db/catalog/rename_collection_test.cpp16
-rw-r--r--src/mongo/db/concurrency/lock_manager_defs.h2
-rw-r--r--src/mongo/db/concurrency/resource_catalog.cpp5
-rw-r--r--src/mongo/db/concurrency/resource_catalog_test.cpp12
-rw-r--r--src/mongo/db/namespace_string.h28
-rw-r--r--src/mongo/db/namespace_string_test.cpp25
-rw-r--r--src/mongo/db/op_observer/op_observer_impl_test.cpp7
-rw-r--r--src/mongo/db/repl/oplog_applier_impl_test.cpp26
-rw-r--r--src/mongo/db/storage/SConscript1
-rw-r--r--src/mongo/db/storage/bson_collection_catalog_entry.cpp3
-rw-r--r--src/mongo/db/storage/durable_catalog_impl.cpp8
-rw-r--r--src/mongo/util/namespace_string_util.cpp4
-rw-r--r--src/mongo/util/namespace_string_util.h12
14 files changed, 94 insertions, 57 deletions
diff --git a/src/mongo/db/catalog/collection_catalog_test.cpp b/src/mongo/db/catalog/collection_catalog_test.cpp
index 9eb767d1dec..91e132791bd 100644
--- a/src/mongo/db/catalog/collection_catalog_test.cpp
+++ b/src/mongo/db/catalog/collection_catalog_test.cpp
@@ -285,7 +285,7 @@ TEST_F(CollectionCatalogResourceTest, LookupCollectionResource) {
auto ridStr = ResourceCatalog::get(getServiceContext()).name(rid);
ASSERT(ridStr);
- ASSERT(ridStr->find(collNs.toStringWithTenantId()) != std::string::npos);
+ ASSERT(ridStr->find(collNs.toStringWithTenantId_forTest()) != std::string::npos);
}
TEST_F(CollectionCatalogResourceTest, LookupMissingCollectionResource) {
diff --git a/src/mongo/db/catalog/rename_collection_test.cpp b/src/mongo/db/catalog/rename_collection_test.cpp
index 6cc5fc5b6a7..5ad32e181d3 100644
--- a/src/mongo/db/catalog/rename_collection_test.cpp
+++ b/src/mongo/db/catalog/rename_collection_test.cpp
@@ -1266,8 +1266,8 @@ TEST_F(RenameCollectionTestMultitenancy,
ASSERT_NOT_EQUALS(otherSourceNssTid, targetNssTid);
// A tid field supersedes tenantIds maintained in source or target. See above.
- auto cmd = BSON("renameCollection" << otherSourceNssTid.toStringWithTenantId() << "to"
- << targetNssTid.toStringWithTenantId());
+ auto cmd = BSON("renameCollection" << otherSourceNssTid.toStringWithTenantId_forTest() << "to"
+ << targetNssTid.toStringWithTenantId_forTest());
ASSERT_EQUALS(ErrorCodes::NamespaceNotFound,
renameCollectionForApplyOps(_opCtx.get(), boost::none, boost::none, cmd, {}));
ASSERT_TRUE(_collectionExists(_opCtx.get(), _sourceNssTid));
@@ -1283,8 +1283,8 @@ TEST_F(RenameCollectionTestMultitenancy, RenameCollectionForApplyOpsRequireTenan
NamespaceString::createNamespaceString_forTest(_tenantId, _otherNs);
ASSERT_NOT_EQUALS(_sourceNssTid, targetNssTid);
- auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId() << "to"
- << targetNssTid.toStringWithTenantId());
+ auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId_forTest() << "to"
+ << targetNssTid.toStringWithTenantId_forTest());
ASSERT_OK(renameCollectionForApplyOps(_opCtx.get(), boost::none, boost::none, cmd, {}));
ASSERT_TRUE(_collectionExists(_opCtx.get(), targetNssTid));
ASSERT_FALSE(_collectionExists(_opCtx.get(), _sourceNssTid));
@@ -1304,8 +1304,8 @@ TEST_F(RenameCollectionTestMultitenancy, RenameCollectionForApplyOpsSameNSRequir
RAIIServerParameterControllerForTest multitenancyController("multitenancySupport", true);
RAIIServerParameterControllerForTest featureFlagController("featureFlagRequireTenantID", false);
- auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId() << "to"
- << _sourceNssTid.toStringWithTenantId());
+ auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId_forTest() << "to"
+ << _sourceNssTid.toStringWithTenantId_forTest());
ASSERT_OK(renameCollectionForApplyOps(_opCtx.get(), boost::none, boost::none, cmd, {}));
}
@@ -1319,8 +1319,8 @@ TEST_F(RenameCollectionTestMultitenancy, RenameCollectionForApplyOpsAcrossTenant
// This test is valid during the transition period, before featureFlagRequireTenantID is
// enforced, and will prefix the tenantIds onto the ns fields.
- auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId() << "to"
- << targetNssTid.toStringWithTenantId());
+ auto cmd = BSON("renameCollection" << _sourceNssTid.toStringWithTenantId_forTest() << "to"
+ << targetNssTid.toStringWithTenantId_forTest());
ASSERT_THROWS_CODE(renameCollectionForApplyOps(_opCtx.get(), boost::none, boost::none, cmd, {}),
AssertionException,
ErrorCodes::IllegalOperation);
diff --git a/src/mongo/db/concurrency/lock_manager_defs.h b/src/mongo/db/concurrency/lock_manager_defs.h
index 23376734fe2..b0598c6da0d 100644
--- a/src/mongo/db/concurrency/lock_manager_defs.h
+++ b/src/mongo/db/concurrency/lock_manager_defs.h
@@ -239,7 +239,7 @@ class ResourceId {
public:
ResourceId() : _fullHash(0) {}
ResourceId(ResourceType type, const NamespaceString& nss)
- : _fullHash(fullHash(type, hashStringData(nss.toStringWithTenantId()))) {
+ : _fullHash(fullHash(type, hashStringData(nss.toStringForResourceId()))) {
verifyNoResourceMutex(type);
}
ResourceId(ResourceType type, const DatabaseName& dbName)
diff --git a/src/mongo/db/concurrency/resource_catalog.cpp b/src/mongo/db/concurrency/resource_catalog.cpp
index 62183c3a4f8..52cd2ec3894 100644
--- a/src/mongo/db/concurrency/resource_catalog.cpp
+++ b/src/mongo/db/concurrency/resource_catalog.cpp
@@ -30,6 +30,7 @@
#include "mongo/db/concurrency/resource_catalog.h"
#include "mongo/db/service_context.h"
+#include "mongo/util/namespace_string_util.h"
namespace mongo {
namespace {
@@ -42,7 +43,7 @@ ResourceCatalog& ResourceCatalog::get(ServiceContext* svcCtx) {
void ResourceCatalog::add(ResourceId id, const NamespaceString& ns) {
invariant(id.getType() == RESOURCE_COLLECTION);
- _add(id, ns.toStringWithTenantId());
+ _add(id, NamespaceStringUtil::serializeForCatalog(ns));
}
void ResourceCatalog::add(ResourceId id, const DatabaseName& dbName) {
@@ -57,7 +58,7 @@ void ResourceCatalog::_add(ResourceId id, std::string name) {
void ResourceCatalog::remove(ResourceId id, const NamespaceString& ns) {
invariant(id.getType() == RESOURCE_COLLECTION);
- _remove(id, ns.toStringWithTenantId());
+ _remove(id, NamespaceStringUtil::serializeForCatalog(ns));
}
void ResourceCatalog::remove(ResourceId id, const DatabaseName& dbName) {
diff --git a/src/mongo/db/concurrency/resource_catalog_test.cpp b/src/mongo/db/concurrency/resource_catalog_test.cpp
index 174877c0aa9..2987286b0e9 100644
--- a/src/mongo/db/concurrency/resource_catalog_test.cpp
+++ b/src/mongo/db/concurrency/resource_catalog_test.cpp
@@ -73,10 +73,10 @@ TEST_F(ResourceCatalogTest, InsertTest) {
catalog.add(thirdResourceId, thirdCollection);
resource = catalog.name(firstResourceId);
- ASSERT_EQ(firstCollection.toStringWithTenantId(), *resource);
+ ASSERT_EQ(firstCollection.toStringWithTenantId_forTest(), *resource);
resource = catalog.name(thirdResourceId);
- ASSERT_EQ(thirdCollection.toStringWithTenantId(), resource);
+ ASSERT_EQ(thirdCollection.toStringWithTenantId_forTest(), resource);
}
TEST_F(ResourceCatalogTest, RemoveTest) {
@@ -87,7 +87,7 @@ TEST_F(ResourceCatalogTest, RemoveTest) {
catalog.remove(firstResourceId,
NamespaceString::createNamespaceString_forTest(boost::none, "BadNamespace"));
auto resource = catalog.name(firstResourceId);
- ASSERT_EQ(firstCollection.toStringWithTenantId(), *resource);
+ ASSERT_EQ(firstCollection.toStringWithTenantId_forTest(), *resource);
catalog.remove(firstResourceId, firstCollection);
catalog.remove(firstResourceId, firstCollection);
@@ -116,12 +116,12 @@ TEST_F(ResourceCatalogTest, CollisionTest) {
// We remove a namespace, resolving the collision.
catalog.remove(firstResourceId, firstCollection);
resource = catalog.name(secondResourceId);
- ASSERT_EQ(secondCollection.toStringWithTenantId(), *resource);
+ ASSERT_EQ(secondCollection.toStringWithTenantId_forTest(), *resource);
// Adding the same namespace twice does not create a collision.
catalog.add(secondResourceId, secondCollection);
resource = catalog.name(secondResourceId);
- ASSERT_EQ(secondCollection.toStringWithTenantId(), *resource);
+ ASSERT_EQ(secondCollection.toStringWithTenantId_forTest(), *resource);
// The map should function normally for entries without collisions.
catalog.add(firstResourceId, firstCollection);
@@ -130,7 +130,7 @@ TEST_F(ResourceCatalogTest, CollisionTest) {
catalog.add(thirdResourceId, thirdCollection);
resource = catalog.name(thirdResourceId);
- ASSERT_EQ(thirdCollection.toStringWithTenantId(), *resource);
+ ASSERT_EQ(thirdCollection.toStringWithTenantId_forTest(), *resource);
catalog.remove(thirdResourceId, thirdCollection);
resource = catalog.name(thirdResourceId);
diff --git a/src/mongo/db/namespace_string.h b/src/mongo/db/namespace_string.h
index d45198573d6..68323b5fad9 100644
--- a/src/mongo/db/namespace_string.h
+++ b/src/mongo/db/namespace_string.h
@@ -440,13 +440,20 @@ public:
return ns().toString();
}
- std::string toStringWithTenantId() const {
- if (_hasTenantId()) {
- auto tenantId = TenantId{OID::from(&_data[kDataOffset])};
- return str::stream() << tenantId.toString() << "_" << ns();
- }
+ /**
+ * Gets a namespace string with tenant id.
+ *
+ * MUST only be used for tests.
+ */
+ std::string toStringWithTenantId_forTest() const {
+ return toStringWithTenantId();
+ }
- return ns().toString();
+ /**
+ * This function should only be used when creating a resouce id for nss.
+ */
+ std::string toStringForResourceId() const {
+ return toStringWithTenantId();
}
/**
@@ -883,6 +890,15 @@ private:
NamespaceString(boost::optional<TenantId> tenantId, StringData db, StringData collectionName)
: NamespaceString(DatabaseName(std::move(tenantId), db), collectionName) {}
+ std::string toStringWithTenantId() const {
+ if (_hasTenantId()) {
+ auto tenantId = TenantId{OID::from(&_data[kDataOffset])};
+ return str::stream() << tenantId.toString() << "_" << ns();
+ }
+
+ return ns().toString();
+ }
+
static constexpr size_t kDataOffset = sizeof(uint8_t);
static constexpr uint8_t kTenantIdMask = 0x80;
static constexpr uint8_t kDatabaseNameOffsetEndMask = 0x7F;
diff --git a/src/mongo/db/namespace_string_test.cpp b/src/mongo/db/namespace_string_test.cpp
index fc1a6b3d35f..f99ddb9702a 100644
--- a/src/mongo/db/namespace_string_test.cpp
+++ b/src/mongo/db/namespace_string_test.cpp
@@ -342,7 +342,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(nss.size(), 7);
ASSERT_EQ(nss.ns(), "foo.bar");
ASSERT_EQ(nss.toString(), "foo.bar");
- ASSERT_EQ(nss.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT_EQ(nss.db(), "foo");
ASSERT_EQ(nss.coll(), "bar");
ASSERT_EQ(nss.dbName().db(), "foo");
@@ -359,7 +359,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(nss.size(), 3);
ASSERT_EQ(nss.ns(), "foo");
ASSERT_EQ(nss.toString(), "foo");
- ASSERT_EQ(nss.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT_EQ(nss.db(), "foo");
ASSERT_EQ(nss.coll(), "");
ASSERT_EQ(nss.dbName().db(), "foo");
@@ -377,7 +377,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(nss2.size(), 7);
ASSERT_EQ(nss2.ns(), "foo.bar");
ASSERT_EQ(nss2.toString(), "foo.bar");
- ASSERT_EQ(nss2.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss2.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT_EQ(nss2.db(), "foo");
ASSERT_EQ(nss2.coll(), "bar");
ASSERT_EQ(nss2.dbName().db(), "foo");
@@ -393,7 +393,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(nss3.size(), 7);
ASSERT_EQ(nss3.ns(), "foo.bar");
ASSERT_EQ(nss3.toString(), "foo.bar");
- ASSERT_EQ(nss3.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss3.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT_EQ(nss3.db(), "foo");
ASSERT_EQ(nss3.coll(), "bar");
ASSERT_EQ(nss3.dbName().db(), "foo");
@@ -409,7 +409,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(nss4.size(), 3);
ASSERT_EQ(nss4.ns(), "foo");
ASSERT_EQ(nss4.toString(), "foo");
- ASSERT_EQ(nss4.toStringWithTenantId(), "{}_foo"_format(tenantId.toString()));
+ ASSERT_EQ(nss4.toStringWithTenantId_forTest(), "{}_foo"_format(tenantId.toString()));
ASSERT_EQ(nss4.db(), "foo");
ASSERT_EQ(nss4.coll(), "");
ASSERT_EQ(nss4.dbName().db(), "foo");
@@ -425,7 +425,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(multiNss.size(), 31);
ASSERT_EQ(multiNss.ns(), "config.system.change_collection");
ASSERT_EQ(multiNss.toString(), "config.system.change_collection");
- ASSERT_EQ(multiNss.toStringWithTenantId(),
+ ASSERT_EQ(multiNss.toStringWithTenantId_forTest(),
"{}_config.system.change_collection"_format(tenantId.toString()));
ASSERT_EQ(multiNss.db(), "config");
ASSERT_EQ(multiNss.coll(), "system.change_collection");
@@ -443,7 +443,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(empty.coll(), "");
ASSERT_EQ(empty.tenantId(), boost::none);
ASSERT_EQ(empty.toString(), "");
- ASSERT_EQ(empty.toStringWithTenantId(), "");
+ ASSERT_EQ(empty.toStringWithTenantId_forTest(), "");
ASSERT_EQ(empty.dbName().db(), "");
ASSERT_EQ(empty.dbName().tenantId(), boost::none);
ASSERT_EQ(empty.dbName().toString(), "");
@@ -458,7 +458,8 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT(emptyWithTenant.tenantId());
ASSERT_EQ(*emptyWithTenant.tenantId(), tenantId);
ASSERT_EQ(emptyWithTenant.toString(), "");
- ASSERT_EQ(emptyWithTenant.toStringWithTenantId(), "{}_"_format(tenantId.toString()));
+ ASSERT_EQ(emptyWithTenant.toStringWithTenantId_forTest(),
+ "{}_"_format(tenantId.toString()));
ASSERT_EQ(emptyWithTenant.dbName().db(), "");
ASSERT(emptyWithTenant.dbName().tenantId());
ASSERT_EQ(emptyWithTenant.dbName().tenantId(), tenantId);
@@ -474,7 +475,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT_EQ(dbWithoutColl.coll(), "");
ASSERT_FALSE(dbWithoutColl.tenantId());
ASSERT_EQ(dbWithoutColl.toString(), "foo");
- ASSERT_EQ(dbWithoutColl.toStringWithTenantId(), "foo");
+ ASSERT_EQ(dbWithoutColl.toStringWithTenantId_forTest(), "foo");
ASSERT_EQ(dbWithoutColl.dbName().db(), "foo");
ASSERT_FALSE(dbWithoutColl.dbName().tenantId());
ASSERT_EQ(dbWithoutColl.dbName().toString(), "foo");
@@ -489,7 +490,7 @@ TEST(NamespaceStringTest, NSSWithTenantId) {
ASSERT(dbWithoutCollWithTenant.tenantId());
ASSERT_EQ(*dbWithoutCollWithTenant.tenantId(), tenantId);
ASSERT_EQ(dbWithoutCollWithTenant.toString(), "foo");
- ASSERT_EQ(dbWithoutCollWithTenant.toStringWithTenantId(),
+ ASSERT_EQ(dbWithoutCollWithTenant.toStringWithTenantId_forTest(),
fmt::format("{}_foo", tenantId.toString()));
ASSERT_EQ(dbWithoutCollWithTenant.dbName().db(), "foo");
ASSERT(dbWithoutCollWithTenant.dbName().tenantId());
@@ -507,7 +508,7 @@ TEST(NamespaceStringTest, NSSNoCollectionWithTenantId) {
NamespaceString nss = NamespaceString::createNamespaceString_forTest(tenantId, "foo");
ASSERT_EQ(nss.ns(), "foo");
ASSERT_EQ(nss.toString(), "foo");
- ASSERT_EQ(nss.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT(nss.tenantId());
ASSERT_EQ(*nss.tenantId(), tenantId);
@@ -530,7 +531,7 @@ TEST(NamespaceStringTest, ParseNSSWithTenantId) {
NamespaceString nss =
NamespaceString::parseFromStringExpectTenantIdInMultitenancyMode(tenantNsStr);
ASSERT_EQ(nss.ns(), "foo.bar");
- ASSERT_EQ(nss.toStringWithTenantId(), tenantNsStr);
+ ASSERT_EQ(nss.toStringWithTenantId_forTest(), tenantNsStr);
ASSERT(nss.tenantId());
ASSERT_EQ(*nss.tenantId(), tenantId);
}
diff --git a/src/mongo/db/op_observer/op_observer_impl_test.cpp b/src/mongo/db/op_observer/op_observer_impl_test.cpp
index eb0bc007c3e..5ca6a583853 100644
--- a/src/mongo/db/op_observer/op_observer_impl_test.cpp
+++ b/src/mongo/db/op_observer/op_observer_impl_test.cpp
@@ -720,9 +720,10 @@ TEST_F(OpObserverTest, OnRenameCollectionIncludesTenantIdFeatureFlagOff) {
ASSERT_FALSE(oplogEntry.getTid());
ASSERT_EQUALS(sourceNss.getCommandNS(), oplogEntry.getNss());
- auto oExpected = BSON("renameCollection" << sourceNss.toStringWithTenantId() << "to"
- << targetNss.toStringWithTenantId() << "stayTemp"
- << stayTemp << "dropTarget" << dropTargetUuid);
+ auto oExpected =
+ BSON("renameCollection" << sourceNss.toStringWithTenantId_forTest() << "to"
+ << targetNss.toStringWithTenantId_forTest() << "stayTemp"
+ << stayTemp << "dropTarget" << dropTargetUuid);
ASSERT_BSONOBJ_EQ(oExpected, oplogEntry.getObject());
}
diff --git a/src/mongo/db/repl/oplog_applier_impl_test.cpp b/src/mongo/db/repl/oplog_applier_impl_test.cpp
index b282ec3c913..735a46e23e1 100644
--- a/src/mongo/db/repl/oplog_applier_impl_test.cpp
+++ b/src/mongo/db/repl/oplog_applier_impl_test.cpp
@@ -589,11 +589,11 @@ TEST_F(OplogApplierImplTest, CreateCollectionCommandMultitenantRequireTenantIDFa
auto tid{TenantId(OID::gen())};
NamespaceString nss = NamespaceString::createNamespaceString_forTest(tid, "test.foo");
- auto op =
- BSON("op"
- << "c"
- << "ns" << nss.getCommandNS().toStringWithTenantId() << "wall" << Date_t() << "o"
- << BSON("create" << nss.coll()) << "ts" << Timestamp(1, 1) << "ui" << UUID::gen());
+ auto op = BSON("op"
+ << "c"
+ << "ns" << nss.getCommandNS().toStringWithTenantId_forTest() << "wall"
+ << Date_t() << "o" << BSON("create" << nss.coll()) << "ts" << Timestamp(1, 1)
+ << "ui" << UUID::gen());
bool applyCmdCalled = false;
@@ -717,8 +717,8 @@ TEST_F(OplogApplierImplTest, RenameCollectionCommandMultitenantRequireTenantIDFa
const NamespaceString targetNss =
NamespaceString::createNamespaceString_forTest(tid, "test.bar");
- auto oRename = BSON("renameCollection" << sourceNss.toStringWithTenantId() << "to"
- << targetNss.toStringWithTenantId());
+ auto oRename = BSON("renameCollection" << sourceNss.toStringWithTenantId_forTest() << "to"
+ << targetNss.toStringWithTenantId_forTest());
repl::createCollection(_opCtx.get(), sourceNss, {});
// createCollection uses an actual opTime, so we must generate an actually opTime in the future.
@@ -752,8 +752,8 @@ TEST_F(OplogApplierImplTest, RenameCollectionCommandMultitenantAcrossTenantsRequ
ASSERT_NE(sourceNss, wrongTargetNss);
- auto oRename = BSON("renameCollection" << sourceNss.toStringWithTenantId() << "to"
- << wrongTargetNss.toStringWithTenantId());
+ auto oRename = BSON("renameCollection" << sourceNss.toStringWithTenantId_forTest() << "to"
+ << wrongTargetNss.toStringWithTenantId_forTest());
repl::createCollection(_opCtx.get(), sourceNss, {});
// createCollection uses an actual opTime, so we must generate an actually opTime in the future.
@@ -1842,8 +1842,8 @@ TEST_F(MultiOplogEntryOplogApplierImplTestMultitenant,
_cmdNss,
BSON("applyOps" << BSON_ARRAY(BSON("op"
<< "c"
- << "ns" << _nss.toStringWithTenantId() << "ui" << *_uuid
- << "o" << BSON("create" << _nss.coll())))
+ << "ns" << _nss.toStringWithTenantId_forTest() << "ui"
+ << *_uuid << "o" << BSON("create" << _nss.coll())))
<< "partialTxn" << true),
_lsid,
_txnNum,
@@ -1855,8 +1855,8 @@ TEST_F(MultiOplogEntryOplogApplierImplTestMultitenant,
_cmdNss,
BSON("applyOps" << BSON_ARRAY(BSON("op"
<< "i"
- << "ns" << _nss.toStringWithTenantId() << "ui" << *_uuid
- << "o" << BSON("_id" << 1)))
+ << "ns" << _nss.toStringWithTenantId_forTest() << "ui"
+ << *_uuid << "o" << BSON("_id" << 1)))
<< "partialTxn" << true),
_lsid,
_txnNum,
diff --git a/src/mongo/db/storage/SConscript b/src/mongo/db/storage/SConscript
index 76cbca55bea..8f7b2f1e731 100644
--- a/src/mongo/db/storage/SConscript
+++ b/src/mongo/db/storage/SConscript
@@ -142,6 +142,7 @@ env.Library(
'$BUILD_DIR/mongo/db/server_base',
'$BUILD_DIR/mongo/db/server_options',
'$BUILD_DIR/mongo/db/service_context',
+ '$BUILD_DIR/mongo/util/namespace_string_database_name_util',
],
)
diff --git a/src/mongo/db/storage/bson_collection_catalog_entry.cpp b/src/mongo/db/storage/bson_collection_catalog_entry.cpp
index fe5422a1001..35717fa0e54 100644
--- a/src/mongo/db/storage/bson_collection_catalog_entry.cpp
+++ b/src/mongo/db/storage/bson_collection_catalog_entry.cpp
@@ -35,6 +35,7 @@
#include "mongo/db/field_ref.h"
#include "mongo/db/namespace_string.h"
#include "mongo/db/server_options.h"
+#include "mongo/util/namespace_string_util.h"
namespace mongo {
@@ -217,7 +218,7 @@ bool BSONCollectionCatalogEntry::MetaData::eraseIndex(StringData name) {
BSONObj BSONCollectionCatalogEntry::MetaData::toBSON(bool hasExclusiveAccess) const {
BSONObjBuilder b;
- b.append("ns", nss.toStringWithTenantId());
+ b.append("ns", NamespaceStringUtil::serializeForCatalog(nss));
b.append("options", options.toBSON());
{
BSONArrayBuilder arr(b.subarrayStart("indexes"));
diff --git a/src/mongo/db/storage/durable_catalog_impl.cpp b/src/mongo/db/storage/durable_catalog_impl.cpp
index 148cb461321..dc431df5cf1 100644
--- a/src/mongo/db/storage/durable_catalog_impl.cpp
+++ b/src/mongo/db/storage/durable_catalog_impl.cpp
@@ -334,7 +334,7 @@ StatusWith<DurableCatalog::EntryIdentifier> DurableCatalogImpl::_addEntry(
BSONObj obj;
{
BSONObjBuilder b;
- b.append("ns", nss.toStringWithTenantId());
+ b.append("ns", NamespaceStringUtil::serializeForCatalog(nss));
b.append("ident", ident);
BSONCollectionCatalogEntry::MetaData md;
md.nss = nss;
@@ -525,7 +525,7 @@ Status DurableCatalogImpl::_replaceEntry(OperationContext* opCtx,
{
BSONObjBuilder b;
- b.append("ns", toNss.toStringWithTenantId());
+ b.append("ns", NamespaceStringUtil::serializeForCatalog(toNss));
b.append("md", md.toBSON());
b.appendElementsUnique(old);
@@ -637,7 +637,7 @@ StatusWith<std::string> DurableCatalogImpl::newOrphanedIdent(
BSONObj obj;
{
BSONObjBuilder b;
- b.append("ns", nss.toStringWithTenantId());
+ b.append("ns", NamespaceStringUtil::serializeForCatalog(nss));
b.append("ident", ident);
BSONCollectionCatalogEntry::MetaData md;
md.nss = nss;
@@ -660,7 +660,7 @@ StatusWith<std::string> DurableCatalogImpl::newOrphanedIdent(
"stored meta data for orphaned collection {namespace} @ {res_getValue}",
logAttrs(nss),
"res_getValue"_attr = res.getValue());
- return {nss.toStringWithTenantId()};
+ return {NamespaceStringUtil::serializeForCatalog(nss)};
}
StatusWith<std::pair<RecordId, std::unique_ptr<RecordStore>>> DurableCatalogImpl::createCollection(
diff --git a/src/mongo/util/namespace_string_util.cpp b/src/mongo/util/namespace_string_util.cpp
index c3e0184aa89..4350752c444 100644
--- a/src/mongo/util/namespace_string_util.cpp
+++ b/src/mongo/util/namespace_string_util.cpp
@@ -51,6 +51,10 @@ std::string NamespaceStringUtil::serialize(const NamespaceString& ns,
return options.serializeIdentifier(serializeForStorage(ns, context));
}
+std::string NamespaceStringUtil::serializeForCatalog(const NamespaceString& ns) {
+ return ns.toStringWithTenantId();
+}
+
std::string NamespaceStringUtil::serializeForStorage(const NamespaceString& ns,
const SerializationContext& context) {
if (gFeatureFlagRequireTenantID.isEnabled(serverGlobalParams.featureCompatibility)) {
diff --git a/src/mongo/util/namespace_string_util.h b/src/mongo/util/namespace_string_util.h
index acdd805c56b..b61def830d9 100644
--- a/src/mongo/util/namespace_string_util.h
+++ b/src/mongo/util/namespace_string_util.h
@@ -56,11 +56,23 @@ public:
*
* If multitenancySupport is disabled, the tenantID is not set in the NamespaceString Object.
* eg. serialize(NamespaceString(boost::none, "foo.bar")) -> "foo.bar"
+ *
+ * Do not use this function when serializing a NamespaceString object for catalog.
*/
static std::string serialize(const NamespaceString& ns,
const SerializationContext& context = SerializationContext(),
const SerializationOptions& = {});
+ /**
+ * Serializes a NamespaceString object for catalog.
+ *
+ * Always includes the tenantId prefix for the catalog serialization.
+ * eg. serializeForCatalog(NamespaceString(tenantID, "foo.bar")) -> "tenantID_foo.bar"
+ *
+ * MUST only be used for serializing a NamespaceString object for catalog.
+ */
+ static std::string serializeForCatalog(const NamespaceString& ns);
+
// TODO SERVER-74284: Privatize the worker functions
static std::string serializeForStorage(
const NamespaceString& ns, const SerializationContext& context = SerializationContext());