diff options
author | Sophia Tan <sophia_tll@hotmail.com> | 2023-05-04 23:29:56 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-05-05 00:53:53 +0000 |
commit | 5c3ac23476c1db1fde06d7b145d0733ac0838041 (patch) | |
tree | f4a946f0a265f9861162b5feb3f7f2a1283e889c | |
parent | 46540ddcce8b7ab81e5a7f009999aec85114fcab (diff) | |
download | mongo-5c3ac23476c1db1fde06d7b145d0733ac0838041.tar.gz |
SERVER-74489 Make NamespaceString::toStringWithTenantId private
-rw-r--r-- | src/mongo/db/catalog/collection_catalog_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/rename_collection_test.cpp | 16 | ||||
-rw-r--r-- | src/mongo/db/concurrency/lock_manager_defs.h | 2 | ||||
-rw-r--r-- | src/mongo/db/concurrency/resource_catalog.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/concurrency/resource_catalog_test.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/namespace_string.h | 28 | ||||
-rw-r--r-- | src/mongo/db/namespace_string_test.cpp | 25 | ||||
-rw-r--r-- | src/mongo/db/op_observer/op_observer_impl_test.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/repl/oplog_applier_impl_test.cpp | 26 | ||||
-rw-r--r-- | src/mongo/db/storage/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/storage/bson_collection_catalog_entry.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/storage/durable_catalog_impl.cpp | 8 | ||||
-rw-r--r-- | src/mongo/util/namespace_string_util.cpp | 4 | ||||
-rw-r--r-- | src/mongo/util/namespace_string_util.h | 12 |
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()); |