diff options
author | jannaerin <golden.janna@gmail.com> | 2022-07-15 15:13:00 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-07-15 16:37:02 +0000 |
commit | 299c4b3e46075a01ab8d0989bca5358a2b0603ae (patch) | |
tree | b01d0e260502be4346f346d8d8d3239836a8d087 /src/mongo | |
parent | a16f7f1ee85ac854db4e92294ceb392043623fea (diff) | |
download | mongo-299c4b3e46075a01ab8d0989bca5358a2b0603ae.tar.gz |
SERVER-62923 Change DB lock RAII types to use DatabaseName
Diffstat (limited to 'src/mongo')
67 files changed, 212 insertions, 171 deletions
diff --git a/src/mongo/db/auth/auth_op_observer_test.cpp b/src/mongo/db/auth/auth_op_observer_test.cpp index 72f1230af43..4ae2d589c5c 100644 --- a/src/mongo/db/auth/auth_op_observer_test.cpp +++ b/src/mongo/db/auth/auth_op_observer_test.cpp @@ -131,7 +131,7 @@ TEST_F(AuthOpObserverTest, MultipleAboutToDeleteAndOnDelete) { AuthOpObserver opObserver; auto opCtx = cc().makeOperationContext(); NamespaceString nss = {"test", "coll"}; - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.aboutToDelete(opCtx.get(), nss, uuid, BSON("_id" << 1)); opObserver.onDelete(opCtx.get(), nss, uuid, {}, {}); diff --git a/src/mongo/db/catalog/capped_utils.cpp b/src/mongo/db/catalog/capped_utils.cpp index 00f823bf3cb..de1a436a516 100644 --- a/src/mongo/db/catalog/capped_utils.cpp +++ b/src/mongo/db/catalog/capped_utils.cpp @@ -58,7 +58,7 @@ namespace mongo { Status emptyCapped(OperationContext* opCtx, const NamespaceString& collectionName) { - AutoGetDb autoDb(opCtx, collectionName.db(), MODE_X); + AutoGetDb autoDb(opCtx, collectionName.dbName(), MODE_X); bool userInitiatedWritesAndNotPrimary = opCtx->writesAreReplicated() && !repl::ReplicationCoordinator::get(opCtx)->canAcceptWritesFor(opCtx, collectionName); diff --git a/src/mongo/db/catalog/collection_compact.cpp b/src/mongo/db/catalog/collection_compact.cpp index 14fcad95fad..a41613311a5 100644 --- a/src/mongo/db/catalog/collection_compact.cpp +++ b/src/mongo/db/catalog/collection_compact.cpp @@ -72,7 +72,7 @@ CollectionPtr getCollectionForCompact(OperationContext* opCtx, StatusWith<int64_t> compactCollection(OperationContext* opCtx, const NamespaceString& collectionNss) { - AutoGetDb autoDb(opCtx, collectionNss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, collectionNss.dbName(), MODE_IX); Database* database = autoDb.getDb(); uassert(ErrorCodes::NamespaceNotFound, "database does not exist", database); diff --git a/src/mongo/db/catalog/create_collection.cpp b/src/mongo/db/catalog/create_collection.cpp index 90323d8dc82..9b1e61cbc9c 100644 --- a/src/mongo/db/catalog/create_collection.cpp +++ b/src/mongo/db/catalog/create_collection.cpp @@ -157,7 +157,7 @@ Status _createView(OperationContext* opCtx, !nss.isSystemDotViews()); return writeConflictRetry(opCtx, "create", nss.ns(), [&] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, nss, MODE_IX); // Operations all lock system.views in the end to prevent deadlock. Lock::CollectionLock systemViewsLock( @@ -311,7 +311,7 @@ Status _createTimeseries(OperationContext* opCtx, Status ret = writeConflictRetry(opCtx, "createBucketCollection", bucketsNs.ns(), [&]() -> Status { - AutoGetDb autoDb(opCtx, bucketsNs.db(), MODE_IX); + AutoGetDb autoDb(opCtx, bucketsNs.dbName(), MODE_IX); Lock::CollectionLock bucketsCollLock(opCtx, bucketsNs, MODE_X); auto db = autoDb.ensureDbExists(opCtx); @@ -468,7 +468,7 @@ Status _createCollection(OperationContext* opCtx, const CollectionOptions& collectionOptions, const boost::optional<BSONObj>& idIndex) { return writeConflictRetry(opCtx, "create", nss.ns(), [&] { - AutoGetDb autoDb(opCtx, nss.dbName().toStringWithTenantId(), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, nss, MODE_IX); auto db = autoDb.ensureDbExists(opCtx); diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp index 2b98aac4e33..9d867c96e4c 100644 --- a/src/mongo/db/catalog/database_impl.cpp +++ b/src/mongo/db/catalog/database_impl.cpp @@ -164,8 +164,7 @@ Status DatabaseImpl::validateDBName(StringData dbname) { } DatabaseImpl::DatabaseImpl(const DatabaseName& dbName) - : _name(dbName), - _viewsName(_name.toString() + "." + DurableViewCatalog::viewsCollectionName().toString()) {} + : _name(dbName), _viewsName(_name, DurableViewCatalog::viewsCollectionName().toString()) {} Status DatabaseImpl::init(OperationContext* const opCtx) { Status status = validateDBName(_name.db()); diff --git a/src/mongo/db/catalog/database_test.cpp b/src/mongo/db/catalog/database_test.cpp index baaf297962f..1b9653ef33a 100644 --- a/src/mongo/db/catalog/database_test.cpp +++ b/src/mongo/db/catalog/database_test.cpp @@ -117,7 +117,7 @@ void DatabaseTest::tearDown() { TEST_F(DatabaseTest, SetDropPendingThrowsExceptionIfDatabaseIsAlreadyInADropPendingState) { writeConflictRetry(_opCtx.get(), "testSetDropPending", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); @@ -140,7 +140,7 @@ TEST_F(DatabaseTest, SetDropPendingThrowsExceptionIfDatabaseIsAlreadyInADropPend TEST_F(DatabaseTest, CreateCollectionThrowsExceptionWhenDatabaseIsInADropPendingState) { writeConflictRetry( _opCtx.get(), "testÇreateCollectionWhenDatabaseIsInADropPendingState", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); @@ -166,7 +166,7 @@ void _testDropCollection(OperationContext* opCtx, if (createCollectionBeforeDrop) { writeConflictRetry(opCtx, "testDropCollection", nss.ns(), [=] { WriteUnitOfWork wuow(opCtx); - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db); ASSERT_TRUE(db->createCollection(opCtx, nss, collOpts)); @@ -175,7 +175,7 @@ void _testDropCollection(OperationContext* opCtx, } writeConflictRetry(opCtx, "testDropCollection", nss.ns(), [=] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db); @@ -216,7 +216,7 @@ TEST_F(DatabaseTest, DropCollectionRejectsProvidedDropOpTimeIfWritesAreReplicate auto opCtx = _opCtx.get(); auto nss = _nss; - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); writeConflictRetry(opCtx, "testDropOpTimeWithReplicated", nss.ns(), [&] { ASSERT_TRUE(db); @@ -234,7 +234,7 @@ TEST_F(DatabaseTest, DropCollectionRejectsProvidedDropOpTimeIfWritesAreReplicate void _testDropCollectionThrowsExceptionIfThereAreIndexesInProgress(OperationContext* opCtx, const NamespaceString& nss) { writeConflictRetry(opCtx, "testDropCollectionWithIndexesInProgress", nss.ns(), [opCtx, nss] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db); @@ -292,7 +292,7 @@ TEST_F(DatabaseTest, RenameCollectionPreservesUuidOfSourceCollectionAndUpdatesUu auto toNss = NamespaceString(fromNss.getSisterNS("bar")); ASSERT_NOT_EQUALS(fromNss, toNss); - AutoGetDb autoDb(opCtx, fromNss.db(), MODE_X); + AutoGetDb autoDb(opCtx, fromNss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db); @@ -334,7 +334,7 @@ TEST_F(DatabaseTest, RenameCollectionPreservesUuidOfSourceCollectionAndUpdatesUu TEST_F(DatabaseTest, MakeUniqueCollectionNamespaceReturnsFailedToParseIfModelDoesNotContainPercentSign) { writeConflictRetry(_opCtx.get(), "testMakeUniqueCollectionNamespace", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); ASSERT_EQUALS(ErrorCodes::FailedToParse, @@ -345,7 +345,7 @@ TEST_F(DatabaseTest, TEST_F(DatabaseTest, MakeUniqueCollectionNamespaceReplacesPercentSignsWithRandomCharacters) { writeConflictRetry(_opCtx.get(), "testMakeUniqueCollectionNamespace", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); @@ -388,7 +388,7 @@ TEST_F( DatabaseTest, MakeUniqueCollectionNamespaceReturnsNamespaceExistsIfGeneratedNamesMatchExistingCollections) { writeConflictRetry(_opCtx.get(), "testMakeUniqueCollectionNamespace", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); @@ -418,7 +418,7 @@ TEST_F(DatabaseTest, AutoGetDBSucceedsWithDeadlineNow) { Lock::DBLock lock(_opCtx.get(), nss.dbName(), MODE_X); ASSERT(_opCtx.get()->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); try { - AutoGetDb db(_opCtx.get(), nss.db(), MODE_X, Date_t::now()); + AutoGetDb db(_opCtx.get(), nss.dbName(), MODE_X, Date_t::now()); ASSERT(_opCtx.get()->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); } catch (const ExceptionFor<ErrorCodes::LockTimeout>&) { FAIL("Should get the db within the timeout"); @@ -430,7 +430,7 @@ TEST_F(DatabaseTest, AutoGetDBSucceedsWithDeadlineMin) { Lock::DBLock lock(_opCtx.get(), nss.dbName(), MODE_X); ASSERT(_opCtx.get()->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); try { - AutoGetDb db(_opCtx.get(), nss.db(), MODE_X, Date_t()); + AutoGetDb db(_opCtx.get(), nss.dbName(), MODE_X, Date_t()); ASSERT(_opCtx.get()->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); } catch (const ExceptionFor<ErrorCodes::LockTimeout>&) { FAIL("Should get the db within the timeout"); @@ -470,7 +470,7 @@ TEST_F(DatabaseTest, CreateCollectionProhibitsReplicatedCollectionsWithoutIdInde "testÇreateCollectionProhibitsReplicatedCollectionsWithoutIdIndex", _nss.ns(), [this] { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(_opCtx.get()); ASSERT_TRUE(db); diff --git a/src/mongo/db/catalog/drop_collection.cpp b/src/mongo/db/catalog/drop_collection.cpp index cc164c4aa0f..57192461061 100644 --- a/src/mongo/db/catalog/drop_collection.cpp +++ b/src/mongo/db/catalog/drop_collection.cpp @@ -355,7 +355,7 @@ Status _dropCollection(OperationContext* opCtx, try { return writeConflictRetry(opCtx, "drop", collectionName.ns(), [&] { - AutoGetDb autoDb(opCtx, collectionName.db(), MODE_IX); + AutoGetDb autoDb(opCtx, collectionName.dbName(), MODE_IX); auto db = autoDb.getDb(); if (!db) { return expectedUUID @@ -505,7 +505,7 @@ Status dropCollection(OperationContext* opCtx, Status dropCollectionIfUUIDNotMatching(OperationContext* opCtx, const NamespaceString& ns, const UUID& expectedUUID) { - AutoGetDb autoDb(opCtx, ns.db(), MODE_IX); + AutoGetDb autoDb(opCtx, ns.dbName(), MODE_IX); if (autoDb.getDb()) { { Lock::CollectionLock collLock(opCtx, ns, MODE_IS); @@ -540,7 +540,7 @@ Status dropCollectionForApplyOps(OperationContext* opCtx, hangDropCollectionBeforeLockAcquisition.pauseWhileSet(); } return writeConflictRetry(opCtx, "drop", collectionName.ns(), [&] { - AutoGetDb autoDb(opCtx, collectionName.db(), MODE_IX); + AutoGetDb autoDb(opCtx, collectionName.dbName(), MODE_IX); Database* db = autoDb.getDb(); if (!db) { return Status(ErrorCodes::NamespaceNotFound, "ns not found"); diff --git a/src/mongo/db/catalog/drop_database.cpp b/src/mongo/db/catalog/drop_database.cpp index 929ac9fac96..dad0b1d9696 100644 --- a/src/mongo/db/catalog/drop_database.cpp +++ b/src/mongo/db/catalog/drop_database.cpp @@ -157,7 +157,8 @@ Status _dropDatabase(OperationContext* opCtx, const std::string& dbName, bool ab { boost::optional<AutoGetDb> autoDB; - autoDB.emplace(opCtx, dbName, MODE_X); + // TODO SERVER-67549 Use dbName directly. + autoDB.emplace(opCtx, DatabaseName(boost::none, dbName), MODE_X); Database* db = autoDB->getDb(); Status status = _checkNssAndReplState(opCtx, db, dbName); @@ -191,7 +192,8 @@ Status _dropDatabase(OperationContext* opCtx, const std::string& dbName, bool ab // yielded. ScopeGuard dropPendingGuardWhileUnlocked([dbName, opCtx, &dropPendingGuard] { UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - AutoGetDb autoDB(opCtx, dbName, MODE_IX); + // TODO SERVER-67549 Use dbName directly. + AutoGetDb autoDB(opCtx, DatabaseName(boost::none, dbName), MODE_IX); if (auto db = autoDB.getDb()) { db->setDropPending(opCtx, false); } @@ -212,7 +214,8 @@ Status _dropDatabase(OperationContext* opCtx, const std::string& dbName, bool ab dropDatabaseHangAfterWaitingForIndexBuilds.pauseWhileSet(); } - autoDB.emplace(opCtx, dbName, MODE_X); + // TODO SERVER-67549 Use dbName directly. + autoDB.emplace(opCtx, DatabaseName(boost::none, dbName), MODE_X); db = autoDB->getDb(); dropPendingGuardWhileUnlocked.dismiss(); @@ -307,7 +310,8 @@ Status _dropDatabase(OperationContext* opCtx, const std::string& dbName, bool ab // locks (which can throw) needed to finish the drop database. ScopeGuard dropPendingGuardWhileUnlocked([dbName, opCtx] { UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - AutoGetDb autoDB(opCtx, dbName, MODE_IX); + // TODO SERVER-67549 Use dbName directly. + AutoGetDb autoDB(opCtx, DatabaseName(boost::none, dbName), MODE_IX); if (auto db = autoDB.getDb()) { db->setDropPending(opCtx, false); } @@ -388,7 +392,8 @@ Status _dropDatabase(OperationContext* opCtx, const std::string& dbName, bool ab dropDatabaseHangAfterAllCollectionsDrop.pauseWhileSet(); } - AutoGetDb autoDB(opCtx, dbName, MODE_X); + // TODO SERVER-67549 Use dbName directly. + AutoGetDb autoDB(opCtx, DatabaseName(boost::none, dbName), MODE_X); auto db = autoDB.getDb(); if (!db) { return Status(ErrorCodes::NamespaceNotFound, diff --git a/src/mongo/db/catalog/drop_database_test.cpp b/src/mongo/db/catalog/drop_database_test.cpp index 0c9f6746fb1..1f80d7db67c 100644 --- a/src/mongo/db/catalog/drop_database_test.cpp +++ b/src/mongo/db/catalog/drop_database_test.cpp @@ -183,7 +183,7 @@ void DropDatabaseTest::tearDown() { */ void _createCollection(OperationContext* opCtx, const NamespaceString& nss) { writeConflictRetry(opCtx, "testDropCollection", nss.ns(), [=] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db); @@ -210,7 +210,7 @@ void _removeDatabaseFromCatalog(OperationContext* opCtx, StringData dbName) { } TEST_F(DropDatabaseTest, DropDatabaseReturnsNamespaceNotFoundIfDatabaseDoesNotExist) { - ASSERT_FALSE(AutoGetDb(_opCtx.get(), _nss.db(), MODE_X).getDb()); + ASSERT_FALSE(AutoGetDb(_opCtx.get(), _nss.dbName(), MODE_X).getDb()); ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, dropDatabaseForApplyOps(_opCtx.get(), _nss.db().toString())); } @@ -238,12 +238,12 @@ void _testDropDatabase(OperationContext* opCtx, // Set OpObserverMock::db so that we can check Database::isDropPending() while dropping // collections. - auto db = AutoGetDb(opCtx, nss.db(), MODE_X).getDb(); + auto db = AutoGetDb(opCtx, nss.dbName(), MODE_X).getDb(); ASSERT_TRUE(db); opObserver->db = db; ASSERT_OK(dropDatabaseForApplyOps(opCtx, nss.db().toString())); - ASSERT_FALSE(AutoGetDb(opCtx, nss.db(), MODE_X).getDb()); + ASSERT_FALSE(AutoGetDb(opCtx, nss.dbName(), MODE_X).getDb()); opObserver->db = nullptr; ASSERT_EQUALS(1U, opObserver->droppedDatabaseNames.size()); @@ -314,7 +314,7 @@ TEST_F(DropDatabaseTest, DropDatabaseResetsDropPendingStateOnException) { _createCollection(_opCtx.get(), _nss); { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.getDb(); ASSERT_TRUE(db); } @@ -325,7 +325,7 @@ TEST_F(DropDatabaseTest, DropDatabaseResetsDropPendingStateOnException) { "onDropCollection() failed"); { - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.getDb(); ASSERT_FALSE(db->isDropPending(_opCtx.get())); } @@ -336,12 +336,12 @@ void _testDropDatabaseResetsDropPendingStateIfAwaitReplicationFails(OperationCon bool expectDbPresent) { _createCollection(opCtx, nss); - ASSERT_TRUE(AutoGetDb(opCtx, nss.db(), MODE_X).getDb()); + ASSERT_TRUE(AutoGetDb(opCtx, nss.dbName(), MODE_X).getDb()); ASSERT_EQUALS(ErrorCodes::WriteConcernFailed, dropDatabaseForApplyOps(opCtx, nss.db().toString())); - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.getDb(); if (expectDbPresent) { ASSERT_TRUE(db); @@ -386,7 +386,7 @@ TEST_F(DropDatabaseTest, _createCollection(_opCtx.get(), _nss); - ASSERT_TRUE(AutoGetDb(_opCtx.get(), _nss.db(), MODE_X).getDb()); + ASSERT_TRUE(AutoGetDb(_opCtx.get(), _nss.dbName(), MODE_X).getDb()); auto status = dropDatabaseForApplyOps(_opCtx.get(), _nss.db().toString()); ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, status); @@ -395,7 +395,7 @@ TEST_F(DropDatabaseTest, << "Could not drop database " << _nss.db() << " because it does not exist after dropping 1 collection(s).")); - ASSERT_FALSE(AutoGetDb(_opCtx.get(), _nss.db(), MODE_X).getDb()); + ASSERT_FALSE(AutoGetDb(_opCtx.get(), _nss.dbName(), MODE_X).getDb()); } TEST_F(DropDatabaseTest, @@ -411,7 +411,7 @@ TEST_F(DropDatabaseTest, _createCollection(_opCtx.get(), _nss); - ASSERT_TRUE(AutoGetDb(_opCtx.get(), _nss.db(), MODE_X).getDb()); + ASSERT_TRUE(AutoGetDb(_opCtx.get(), _nss.dbName(), MODE_X).getDb()); auto status = dropDatabaseForApplyOps(_opCtx.get(), _nss.db().toString()); ASSERT_EQUALS(ErrorCodes::PrimarySteppedDown, status); @@ -421,7 +421,7 @@ TEST_F(DropDatabaseTest, << " while waiting for 1 pending collection drop(s).")); // Check drop-pending flag in Database after dropDatabase() fails. - AutoGetDb autoDb(_opCtx.get(), _nss.db(), MODE_X); + AutoGetDb autoDb(_opCtx.get(), _nss.dbName(), MODE_X); auto db = autoDb.getDb(); ASSERT_TRUE(db); ASSERT_FALSE(db->isDropPending(_opCtx.get())); diff --git a/src/mongo/db/catalog/rename_collection.cpp b/src/mongo/db/catalog/rename_collection.cpp index e038707d438..0fd96248734 100644 --- a/src/mongo/db/catalog/rename_collection.cpp +++ b/src/mongo/db/catalog/rename_collection.cpp @@ -753,7 +753,7 @@ void doLocalRenameIfOptionsAndIndexesHaveNotChanged(OperationContext* opCtx, const RenameCollectionOptions& options, std::list<BSONObj> originalIndexes, BSONObj originalCollectionOptions) { - AutoGetDb dbLock(opCtx, targetNs.db(), MODE_X); + AutoGetDb dbLock(opCtx, targetNs.dbName(), MODE_X); auto collection = dbLock.getDb() ? CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, targetNs) : nullptr; diff --git a/src/mongo/db/catalog/rename_collection_test.cpp b/src/mongo/db/catalog/rename_collection_test.cpp index 07efc4750f8..66e175b30ce 100644 --- a/src/mongo/db/catalog/rename_collection_test.cpp +++ b/src/mongo/db/catalog/rename_collection_test.cpp @@ -384,7 +384,7 @@ void _createCollection(OperationContext* opCtx, const NamespaceString& nss, const CollectionOptions options = {}) { writeConflictRetry(opCtx, "_createCollection", nss.ns(), [=] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT_TRUE(db) << "Cannot create collection " << nss << " because database " << nss.db() << " does not exist."; @@ -519,7 +519,7 @@ CollectionPtr _getCollection_inlock(OperationContext* opCtx, const NamespaceStri } TEST_F(RenameCollectionTest, RenameCollectionReturnsNamespaceNotFoundIfDatabaseDoesNotExist) { - ASSERT_FALSE(AutoGetDb(_opCtx.get(), _sourceNss.db(), MODE_X).getDb()); + ASSERT_FALSE(AutoGetDb(_opCtx.get(), _sourceNss.dbName(), MODE_X).getDb()); ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, renameCollection(_opCtx.get(), _sourceNss, _targetNss, {})); } diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp index 83f42c4beea..56ee3846b63 100644 --- a/src/mongo/db/catalog_raii.cpp +++ b/src/mongo/db/catalog_raii.cpp @@ -175,16 +175,17 @@ void acquireCollectionLocksInResourceIdOrder( } // namespace -// TODO SERVER-62923 Use DatabaseName obj to construct '_dbLock' and to pass to -// DatabaseHolder::getDb(). -AutoGetDb::AutoGetDb(OperationContext* opCtx, StringData dbName, LockMode mode, Date_t deadline) - : _dbName(dbName), _dbLock(opCtx, DatabaseName(boost::none, dbName), mode, deadline), _db([&] { - const DatabaseName tenantDbName(boost::none, dbName); +AutoGetDb::AutoGetDb(OperationContext* opCtx, + const DatabaseName& dbName, + LockMode mode, + Date_t deadline) + : _dbName(dbName), _dbLock(opCtx, dbName, mode, deadline), _db([&] { auto databaseHolder = DatabaseHolder::get(opCtx); - return databaseHolder->getDb(opCtx, tenantDbName); + return databaseHolder->getDb(opCtx, dbName); }()) { // The 'primary' database must be version checked for sharding. - catalog_helper::assertMatchingDbVersion(opCtx, _dbName); + // TODO SERVER-63706 Pass dbName directly + catalog_helper::assertMatchingDbVersion(opCtx, _dbName.toStringWithTenantId()); } Database* AutoGetDb::ensureDbExists(OperationContext* opCtx) { @@ -193,10 +194,9 @@ Database* AutoGetDb::ensureDbExists(OperationContext* opCtx) { } auto databaseHolder = DatabaseHolder::get(opCtx); - const DatabaseName dbName(boost::none, _dbName); - _db = databaseHolder->openDb(opCtx, dbName, nullptr); + _db = databaseHolder->openDb(opCtx, _dbName, nullptr); - catalog_helper::assertMatchingDbVersion(opCtx, _dbName); + catalog_helper::assertMatchingDbVersion(opCtx, _dbName.toStringWithTenantId()); return _db; } @@ -213,19 +213,11 @@ AutoGetCollection::AutoGetCollection( // Acquire the global/RSTL and all the database locks (may or may not be multiple // databases). - // TODO SERVER-62923 Use DatabaseName obj directly. - auto dbName = [nsOrUUID]() { - // TODO SERVER-67817 Use NamespaceStringOrUUID::db() instead. - if (nsOrUUID.dbName()) - return nsOrUUID.dbName()->toStringWithTenantId(); - - if (nsOrUUID.nss()) - return nsOrUUID.nss()->dbName().toStringWithTenantId(); - - return DatabaseName(boost::none, "").toStringWithTenantId(); - }(); - - _autoDb.emplace(opCtx, dbName, isSharedLockMode(modeColl) ? MODE_IS : MODE_IX, deadline); + // TODO SERVER-67817 Use NamespaceStringOrUUID::db() instead. + _autoDb.emplace(opCtx, + nsOrUUID.nss() ? nsOrUUID.nss()->dbName() : *nsOrUUID.dbName(), + isSharedLockMode(modeColl) ? MODE_IS : MODE_IX, + deadline); // Out of an abundance of caution, force operations to acquire new snapshots after // acquiring exclusive collection locks. Operations that hold MODE_X locks make an @@ -263,14 +255,14 @@ AutoGetCollection::AutoGetCollection( auto secondaryResolvedNss = catalog->resolveNamespaceStringOrUUID(opCtx, secondaryNssOrUUID); auto secondaryColl = catalog->lookupCollectionByNamespace(opCtx, secondaryResolvedNss); - // TODO SERVER-64608 Use tenantID on NamespaceString to construct DatabaseName - const DatabaseName secondaryDbName(boost::none, secondaryNssOrUUID.db()); + auto secondaryDbName = secondaryNssOrUUID.dbName() ? secondaryNssOrUUID.dbName() + : secondaryNssOrUUID.nss()->dbName(); verifyDbAndCollection(opCtx, MODE_IS, secondaryNssOrUUID, secondaryResolvedNss, secondaryColl, - databaseHolder->getDb(opCtx, secondaryDbName)); + databaseHolder->getDb(opCtx, *secondaryDbName)); } if (_coll) { diff --git a/src/mongo/db/catalog_raii.h b/src/mongo/db/catalog_raii.h index 62d63404e9f..e4dc1fda484 100644 --- a/src/mongo/db/catalog_raii.h +++ b/src/mongo/db/catalog_raii.h @@ -57,7 +57,7 @@ class AutoGetDb { public: AutoGetDb(OperationContext* opCtx, - StringData dbName, + const DatabaseName& dbName, LockMode mode, Date_t deadline = Date_t::max()); @@ -76,7 +76,7 @@ public: Database* ensureDbExists(OperationContext* opCtx); private: - std::string _dbName; + DatabaseName _dbName; // Special note! The primary DBLock must destruct last (be declared first) so that the global // and RSTL locks are not released until all the secondary DBLocks (without global and RSTL) diff --git a/src/mongo/db/catalog_raii_test.cpp b/src/mongo/db/catalog_raii_test.cpp index e7d600cb81d..f55de38adcd 100644 --- a/src/mongo/db/catalog_raii_test.cpp +++ b/src/mongo/db/catalog_raii_test.cpp @@ -92,7 +92,9 @@ TEST_F(CatalogRAIITestFixture, AutoGetDBDeadline) { Lock::DBLock dbLock1(client1.second.get(), nss.dbName(), MODE_X); ASSERT(client1.second->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); failsWithLockTimeout( - [&] { AutoGetDb db(client2.second.get(), nss.db(), MODE_X, Date_t::now() + timeoutMs); }, + [&] { + AutoGetDb db(client2.second.get(), nss.dbName(), MODE_X, Date_t::now() + timeoutMs); + }, timeoutMs); } @@ -100,25 +102,28 @@ TEST_F(CatalogRAIITestFixture, AutoGetDBGlobalLockDeadline) { Lock::GlobalLock gLock1(client1.second.get(), MODE_X); ASSERT(gLock1.isLocked()); failsWithLockTimeout( - [&] { AutoGetDb db(client2.second.get(), nss.db(), MODE_X, Date_t::now() + timeoutMs); }, + [&] { + AutoGetDb db(client2.second.get(), nss.dbName(), MODE_X, Date_t::now() + timeoutMs); + }, timeoutMs); } TEST_F(CatalogRAIITestFixture, AutoGetDBDeadlineNow) { Lock::DBLock dbLock1(client1.second.get(), nss.dbName(), MODE_IX); ASSERT(client1.second->lockState()->isDbLockedForMode(nss.dbName(), MODE_IX)); - AutoGetDb db(client2.second.get(), nss.db(), MODE_IX); + AutoGetDb db(client2.second.get(), nss.dbName(), MODE_IX); failsWithLockTimeout( - [&] { AutoGetDb db(client2.second.get(), nss.db(), MODE_X, Date_t::now()); }, + [&] { AutoGetDb db(client2.second.get(), nss.dbName(), MODE_X, Date_t::now()); }, Milliseconds(0)); } TEST_F(CatalogRAIITestFixture, AutoGetDBDeadlineMin) { Lock::DBLock dbLock1(client1.second.get(), nss.dbName(), MODE_IX); ASSERT(client1.second->lockState()->isDbLockedForMode(nss.dbName(), MODE_IX)); - AutoGetDb db(client2.second.get(), nss.db(), MODE_IX); - failsWithLockTimeout([&] { AutoGetDb db(client2.second.get(), nss.db(), MODE_X, Date_t{}); }, - Milliseconds(0)); + AutoGetDb db(client2.second.get(), nss.dbName(), MODE_IX); + failsWithLockTimeout( + [&] { AutoGetDb db(client2.second.get(), nss.dbName(), MODE_X, Date_t{}); }, + Milliseconds(0)); } TEST_F(CatalogRAIITestFixture, AutoGetCollectionCollLockDeadline) { @@ -299,7 +304,7 @@ TEST_F(CatalogRAIITestFixture, AutoGetDbSecondaryNamespacesSingleDb) { auto opCtx1 = client1.second.get(); boost::optional<AutoGetDb> autoGetDb; - autoGetDb.emplace(opCtx1, nss.db(), MODE_IS, Date_t::max()); + autoGetDb.emplace(opCtx1, nss.dbName(), MODE_IS, Date_t::max()); ASSERT(opCtx1->lockState()->isRSTLLocked()); ASSERT(opCtx1->lockState()->isReadLocked()); // Global lock check @@ -466,5 +471,31 @@ TEST_F(ReadSourceScopeTest, RestoreReadSource) { ASSERT_EQ(opCtx()->recoveryUnit()->getPointInTimeReadTimestamp(opCtx()), Timestamp(1, 2)); } +TEST_F(CatalogRAIITestFixture, AutoGetDBDifferentTenantsConflictingNamespaces) { + auto db = "db1"; + auto tenant1 = TenantId(OID::gen()); + auto tenant2 = TenantId(OID::gen()); + + DatabaseName dbName1(tenant1, db); + DatabaseName dbName2(tenant2, db); + + AutoGetDb db1(client1.second.get(), dbName1, MODE_X); + AutoGetDb db2(client2.second.get(), dbName2, MODE_X); + + ASSERT(client1.second->lockState()->isDbLockedForMode(dbName1, MODE_X)); + ASSERT(client2.second->lockState()->isDbLockedForMode(dbName2, MODE_X)); +} + +TEST_F(CatalogRAIITestFixture, AutoGetDBWithTenantHitsDeadline) { + auto db = "db1"; + DatabaseName dbName(TenantId(OID::gen()), db); + + Lock::DBLock dbLock1(client1.second.get(), dbName, MODE_X); + ASSERT(client1.second->lockState()->isDbLockedForMode(dbName, MODE_X)); + failsWithLockTimeout( + [&] { AutoGetDb db(client2.second.get(), dbName, MODE_X, Date_t::now() + timeoutMs); }, + timeoutMs); +} + } // namespace } // namespace mongo diff --git a/src/mongo/db/commands/dbcheck.cpp b/src/mongo/db/commands/dbcheck.cpp index 7da38954e9c..99970945e21 100644 --- a/src/mongo/db/commands/dbcheck.cpp +++ b/src/mongo/db/commands/dbcheck.cpp @@ -197,7 +197,8 @@ std::unique_ptr<DbCheckRun> fullDatabaseRun(OperationContext* opCtx, uassert( ErrorCodes::InvalidNamespace, "Cannot run dbCheck on local database", dbName != "local"); - AutoGetDb agd(opCtx, StringData(dbName), MODE_IS); + // TODO SERVER-63353 Change to use dbName directly + AutoGetDb agd(opCtx, DatabaseName(boost::none, dbName), MODE_IS); uassert(ErrorCodes::NamespaceNotFound, "Database " + dbName + " not found", agd.getDb()); const int64_t max = std::numeric_limits<int64_t>::max(); diff --git a/src/mongo/db/commands/dbcommands.cpp b/src/mongo/db/commands/dbcommands.cpp index 54fca604321..ab19c34d789 100644 --- a/src/mongo/db/commands/dbcommands.cpp +++ b/src/mongo/db/commands/dbcommands.cpp @@ -661,7 +661,8 @@ public: CurOp::get(opCtx)->setNS_inlock(dbname); } - AutoGetDb autoDb(opCtx, ns, MODE_IS); + // TODO SERVER-67519 Pass ns.dbName() directly once parseNs returns NamespaceString obj + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, ns), MODE_IS); result.append("db", ns); diff --git a/src/mongo/db/commands/dbcommands_d.cpp b/src/mongo/db/commands/dbcommands_d.cpp index 67d3586cb30..50f2acdb4df 100644 --- a/src/mongo/db/commands/dbcommands_d.cpp +++ b/src/mongo/db/commands/dbcommands_d.cpp @@ -168,7 +168,7 @@ protected: // Accessing system.profile collection should not conflict with oplog application. ShouldNotConflictWithSecondaryBatchApplicationBlock shouldNotConflictBlock( opCtx->lockState()); - AutoGetDb ctx(opCtx, dbName.db(), dbMode); + AutoGetDb ctx(opCtx, dbName, dbMode); Database* db = ctx.getDb(); // Fetches the database profiling level + filter or the server default if the db does not diff --git a/src/mongo/db/commands/dbhash.cpp b/src/mongo/db/commands/dbhash.cpp index b2a6fa441c9..c3cb85c3d2a 100644 --- a/src/mongo/db/commands/dbhash.cpp +++ b/src/mongo/db/commands/dbhash.cpp @@ -221,7 +221,9 @@ public: // later commitTransaction or abortTransaction oplog entry. shouldNotConflictBlock.emplace(opCtx->lockState()); } - AutoGetDb autoDb(opCtx, ns, lockMode); + + // TODO SERVER-67459 Pass dbName obj directly + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, ns), lockMode); Database* db = autoDb.getDb(); result.append("host", prettyHostName()); diff --git a/src/mongo/db/commands/fle2_compact_cmd.cpp b/src/mongo/db/commands/fle2_compact_cmd.cpp index 18fe1fc6eef..1867f50ad78 100644 --- a/src/mongo/db/commands/fle2_compact_cmd.cpp +++ b/src/mongo/db/commands/fle2_compact_cmd.cpp @@ -71,7 +71,7 @@ CompactStats compactEncryptedCompactionCollection(OperationContext* opCtx, LOGV2(6319900, "Compacting the encrypted compaction collection", "namespace"_attr = edcNss); - AutoGetDb autoDb(opCtx, edcNss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, edcNss.dbName(), MODE_IX); uassert(ErrorCodes::NamespaceNotFound, str::stream() << "Database '" << edcNss.db() << "' does not exist", autoDb.getDb()); diff --git a/src/mongo/db/commands/list_collections.cpp b/src/mongo/db/commands/list_collections.cpp index 28cf8bbb451..c8cb9d3a77a 100644 --- a/src/mongo/db/commands/list_collections.cpp +++ b/src/mongo/db/commands/list_collections.cpp @@ -333,7 +333,7 @@ public: { // Acquire only the global lock and set up a consistent in-memory catalog and // storage snapshot. - AutoGetDbForReadMaybeLockFree lockFreeReadBlock(opCtx, db); + AutoGetDbForReadMaybeLockFree lockFreeReadBlock(opCtx, dbName); auto catalog = CollectionCatalog::get(opCtx); CurOpFailpointHelpers::waitWhileFailPointEnabled(&hangBeforeListCollections, diff --git a/src/mongo/db/commands/list_databases.cpp b/src/mongo/db/commands/list_databases.cpp index d43bf0acf7c..05c130c74f7 100644 --- a/src/mongo/db/commands/list_databases.cpp +++ b/src/mongo/db/commands/list_databases.cpp @@ -154,7 +154,7 @@ public: continue; } - AutoGetDbForReadMaybeLockFree lockFreeReadBlock(opCtx, dbName.db()); + AutoGetDbForReadMaybeLockFree lockFreeReadBlock(opCtx, dbName); // The database could have been dropped since we called 'listDatabases()' above. if (!DatabaseHolder::get(opCtx)->dbExists(opCtx, dbName)) { continue; diff --git a/src/mongo/db/commands/test_commands.cpp b/src/mongo/db/commands/test_commands.cpp index 864c8c762b3..413607a19a1 100644 --- a/src/mongo/db/commands/test_commands.cpp +++ b/src/mongo/db/commands/test_commands.cpp @@ -262,7 +262,7 @@ public: const Timestamp requestedPinTs = cmdObj.firstElement().timestamp(); const bool round = cmdObj["round"].booleanSafe(); - AutoGetDb autoDb(opCtx, kDurableHistoryTestNss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, kDurableHistoryTestNss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, kDurableHistoryTestNss, MODE_IX); if (!CollectionCatalog::get(opCtx)->lookupCollectionByNamespace( opCtx, diff --git a/src/mongo/db/commands/validate_db_metadata_cmd.cpp b/src/mongo/db/commands/validate_db_metadata_cmd.cpp index 6b0a494c3f6..3ba6108f237 100644 --- a/src/mongo/db/commands/validate_db_metadata_cmd.cpp +++ b/src/mongo/db/commands/validate_db_metadata_cmd.cpp @@ -130,7 +130,7 @@ public: : collectionCatalog->getAllDbNames(); for (const auto& dbName : dbNames) { - AutoGetDb autoDb(opCtx, dbName.db(), LockMode::MODE_IS); + AutoGetDb autoDb(opCtx, dbName, LockMode::MODE_IS); if (!autoDb.getDb()) { continue; } diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp index cc9c4ed8c49..bf35c7558d5 100644 --- a/src/mongo/db/db_raii.cpp +++ b/src/mongo/db/db_raii.cpp @@ -976,7 +976,7 @@ AutoReadLockFree::AutoReadLockFree(OperationContext* opCtx, Date_t deadline) } AutoGetDbForReadLockFree::AutoGetDbForReadLockFree(OperationContext* opCtx, - StringData dbName, + const DatabaseName& dbName, Date_t deadline) : _catalogStash(opCtx), _lockFreeReadsBlock(opCtx), @@ -996,7 +996,8 @@ AutoGetDbForReadLockFree::AutoGetDbForReadLockFree(OperationContext* opCtx, // Note: this must always be checked, regardless of whether the collection exists, so // that the dbVersion of this node or the caller gets updated quickly in case either is // stale. - catalog_helper::assertMatchingDbVersion(opCtx, dbName); + // TODO SERVER-63706 Pass dbName directly. + catalog_helper::assertMatchingDbVersion(opCtx, dbName.toStringWithTenantId()); return std::make_pair(&fakeColl, /* isView */ false); }, /* ResetFunc */ @@ -1006,7 +1007,7 @@ AutoGetDbForReadLockFree::AutoGetDbForReadLockFree(OperationContext* opCtx, } AutoGetDbForReadMaybeLockFree::AutoGetDbForReadMaybeLockFree(OperationContext* opCtx, - StringData dbName, + const DatabaseName& dbName, Date_t deadline) { if (supportsLockFreeRead(opCtx)) { _autoGetLockFree.emplace(opCtx, dbName, deadline); diff --git a/src/mongo/db/db_raii.h b/src/mongo/db/db_raii.h index f2b2b8e0c0c..cd3bfa635ee 100644 --- a/src/mongo/db/db_raii.h +++ b/src/mongo/db/db_raii.h @@ -503,7 +503,7 @@ private: class AutoGetDbForReadLockFree { public: AutoGetDbForReadLockFree(OperationContext* opCtx, - StringData dbName, + const DatabaseName& dbName, Date_t deadline = Date_t::max()); private: @@ -524,7 +524,7 @@ private: class AutoGetDbForReadMaybeLockFree { public: AutoGetDbForReadMaybeLockFree(OperationContext* opCtx, - StringData dbName, + const DatabaseName& dbName, Date_t deadline = Date_t::max()); private: diff --git a/src/mongo/db/index_build_entry_helpers.cpp b/src/mongo/db/index_build_entry_helpers.cpp index 471b2dc2fc3..4d6f0884a89 100644 --- a/src/mongo/db/index_build_entry_helpers.cpp +++ b/src/mongo/db/index_build_entry_helpers.cpp @@ -172,7 +172,7 @@ void ensureIndexBuildEntriesNamespaceExists(OperationContext* opCtx) { "createIndexBuildCollection", NamespaceString::kIndexBuildEntryNamespace.ns(), [&]() -> void { - AutoGetDb autoDb(opCtx, NamespaceString::kIndexBuildEntryNamespace.db(), MODE_IX); + AutoGetDb autoDb(opCtx, NamespaceString::kIndexBuildEntryNamespace.dbName(), MODE_IX); auto db = autoDb.ensureDbExists(opCtx); // Ensure the database exists. diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp index 898065a7976..30b66e249b5 100644 --- a/src/mongo/db/index_builds_coordinator.cpp +++ b/src/mongo/db/index_builds_coordinator.cpp @@ -2681,7 +2681,10 @@ IndexBuildsCoordinator::CommitResult IndexBuildsCoordinator::_insertKeysFromSide hangIndexBuildBeforeCommit.pauseWhileSet(); } - AutoGetDb autoDb(opCtx, replState->dbName, MODE_IX); + // TODO SERVER-67437 Once ReplIndexBuildState holds DatabaseName, use dbName directly for + // lock + DatabaseName dbName(boost::none, replState->dbName); + AutoGetDb autoDb(opCtx, dbName, MODE_IX); // Unlock RSTL to avoid deadlocks with prepare conflicts and state transitions caused by waiting // for a a strong collection lock. See SERVER-42621. diff --git a/src/mongo/db/matcher/expression_text.cpp b/src/mongo/db/matcher/expression_text.cpp index 5dcebcd40e5..98937e42b95 100644 --- a/src/mongo/db/matcher/expression_text.cpp +++ b/src/mongo/db/matcher/expression_text.cpp @@ -57,7 +57,7 @@ TextMatchExpression::TextMatchExpression(OperationContext* opCtx, fts::TextIndexVersion version; { // Find text index. - AutoGetDb autoDb(opCtx, nss.db(), MODE_IS); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IS); Lock::CollectionLock collLock(opCtx, nss, MODE_IS); Database* db = autoDb.getDb(); diff --git a/src/mongo/db/mongod_main.cpp b/src/mongo/db/mongod_main.cpp index e431f697a36..a9101d83dcb 100644 --- a/src/mongo/db/mongod_main.cpp +++ b/src/mongo/db/mongod_main.cpp @@ -277,7 +277,7 @@ void logStartup(OperationContext* opCtx) { BSONObj o = toLog.obj(); Lock::GlobalWrite lk(opCtx); - AutoGetDb autoDb(opCtx, startupLogCollectionName.db(), mongo::MODE_X); + AutoGetDb autoDb(opCtx, startupLogCollectionName.dbName(), mongo::MODE_X); auto db = autoDb.ensureDbExists(opCtx); CollectionPtr collection = CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, startupLogCollectionName); diff --git a/src/mongo/db/namespace_string.h b/src/mongo/db/namespace_string.h index 3a1d3485de1..ac19873b8ab 100644 --- a/src/mongo/db/namespace_string.h +++ b/src/mongo/db/namespace_string.h @@ -701,6 +701,7 @@ private: */ class NamespaceStringOrUUID { public: + NamespaceStringOrUUID() = delete; NamespaceStringOrUUID(NamespaceString nss) : _nss(std::move(nss)) {} NamespaceStringOrUUID(DatabaseName dbname, UUID uuid) : _uuid(std::move(uuid)), _dbname(std::move(dbname)) {} 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 2792fc3e716..5d56f716d19 100644 --- a/src/mongo/db/op_observer/op_observer_impl_test.cpp +++ b/src/mongo/db/op_observer/op_observer_impl_test.cpp @@ -356,7 +356,7 @@ TEST_F(OpObserverTest, StartIndexBuildExpectedOplogEntry) { // Write to the oplog. { - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onStartIndexBuild( opCtx.get(), nss, uuid, indexBuildUUID, specs, false /*fromMigrate*/); @@ -396,7 +396,7 @@ TEST_F(OpObserverTest, CommitIndexBuildExpectedOplogEntry) { // Write to the oplog. { - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onCommitIndexBuild( opCtx.get(), nss, uuid, indexBuildUUID, specs, false /*fromMigrate*/); @@ -437,7 +437,7 @@ TEST_F(OpObserverTest, AbortIndexBuildExpectedOplogEntry) { // Write to the oplog. Status cause(ErrorCodes::OperationFailed, "index build failed"); { - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); auto fromMigrate = false; opObserver.onAbortIndexBuild( @@ -582,7 +582,7 @@ TEST_F(OpObserverTest, OnDropCollectionReturnsDropOpTime) { // Write to the oplog. repl::OpTime dropOpTime; { - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onDropCollection( opCtx.get(), nss, uuid, 0U, OpObserver::CollectionDropType::kTwoPhase); @@ -640,7 +640,7 @@ TEST_F(OpObserverTest, OnRenameCollectionReturnsRenameOpTime) { // Write to the oplog. repl::OpTime renameOpTime; { - AutoGetDb autoDb(opCtx.get(), sourceNss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), sourceNss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onRenameCollection( opCtx.get(), sourceNss, targetNss, uuid, dropTargetUuid, 0U, stayTemp); @@ -746,7 +746,7 @@ TEST_F(OpObserverTest, OnRenameCollectionOmitsDropTargetFieldIfDropTargetUuidIsN // Write to the oplog. { - AutoGetDb autoDb(opCtx.get(), sourceNss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), sourceNss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onRenameCollection(opCtx.get(), sourceNss, targetNss, uuid, {}, 0U, stayTemp); wunit.commit(); @@ -794,7 +794,7 @@ TEST_F(OpObserverTest, ImportCollectionOplogEntry) { // Write to the oplog. { - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.onImportCollection(opCtx.get(), importUUID, @@ -907,7 +907,7 @@ TEST_F(OpObserverTest, SingleStatementUpdateTestIncludesTenantId) { OplogUpdateEntryArgs update(&updateArgs, nss, uuid); WriteUnitOfWork wuow(opCtx.get()); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); OpObserverRegistry opObserver; opObserver.addObserver(std::make_unique<OpObserverImpl>(std::make_unique<OplogWriterImpl>())); @@ -1040,7 +1040,7 @@ TEST_F(OpObserverTest, MultipleAboutToDeleteAndOnDelete) { OpObserverImpl opObserver(std::make_unique<OplogWriterImpl>()); auto opCtx = cc().makeOperationContext(); NamespaceString nss = {boost::none, "test", "coll"}; - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opObserver.aboutToDelete(opCtx.get(), nss, uuid, BSON("_id" << 1)); opObserver.onDelete(opCtx.get(), nss, uuid, kUninitializedStmtId, {}); @@ -2051,7 +2051,7 @@ protected: OplogUpdateEntryArgs update(&updateArgs, nss, uuid); update.retryableFindAndModifyLocation = RetryableFindAndModifyLocation::kSideCollection; - AutoGetDb autoDb(opCtx(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), nss.dbName(), MODE_X); opObserver().onUpdate(opCtx(), update); commit(); @@ -2082,7 +2082,7 @@ protected: OplogUpdateEntryArgs update(&updateArgs, nss, uuid); update.retryableFindAndModifyLocation = RetryableFindAndModifyLocation::kSideCollection; - AutoGetDb autoDb(opCtx(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), nss.dbName(), MODE_X); opObserver().onUpdate(opCtx(), update); commit(); @@ -2102,7 +2102,7 @@ protected: NamespaceString nss = {boost::none, "test", "coll"}; const auto uuid = UUID::gen(); - AutoGetDb autoDb(opCtx(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), nss.dbName(), MODE_X); const auto deletedDoc = BSON("_id" << 0 << "data" << "x"); opObserver().aboutToDelete(opCtx(), nss, uuid, deletedDoc); diff --git a/src/mongo/db/ops/write_ops_exec.cpp b/src/mongo/db/ops/write_ops_exec.cpp index 53c7f0c8a7a..8156553851e 100644 --- a/src/mongo/db/ops/write_ops_exec.cpp +++ b/src/mongo/db/ops/write_ops_exec.cpp @@ -235,7 +235,7 @@ void assertCanWrite_inlock(OperationContext* opCtx, const NamespaceString& ns) { void makeCollection(OperationContext* opCtx, const NamespaceString& ns) { writeConflictRetry(opCtx, "implicit collection creation", ns.ns(), [&opCtx, &ns] { - AutoGetDb autoDb(opCtx, ns.db(), MODE_IX); + AutoGetDb autoDb(opCtx, ns.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, ns, MODE_IX); assertCanWrite_inlock(opCtx, ns); diff --git a/src/mongo/db/persistent_task_store_test.cpp b/src/mongo/db/persistent_task_store_test.cpp index d7e193e9302..c2c2beeb19b 100644 --- a/src/mongo/db/persistent_task_store_test.cpp +++ b/src/mongo/db/persistent_task_store_test.cpp @@ -74,7 +74,7 @@ class PersistentTaskStoreTest : public CatalogTestFixture { CatalogTestFixture::setUp(); auto opCtx = operationContext(); - AutoGetDb autoDb(opCtx, kNss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, kNss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, kNss, MODE_IX); } }; diff --git a/src/mongo/db/repl/oplog_test.cpp b/src/mongo/db/repl/oplog_test.cpp index 445656974ae..2ff9468bbb8 100644 --- a/src/mongo/db/repl/oplog_test.cpp +++ b/src/mongo/db/repl/oplog_test.cpp @@ -105,7 +105,7 @@ TEST_F(OplogTest, LogOpReturnsOpTimeOnSuccessfulInsertIntoOplogCollection) { oplogEntry.setNss(nss); oplogEntry.setObject(msgObj); oplogEntry.setWallClockTime(Date_t::now()); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opTime = logOp(opCtx.get(), &oplogEntry); ASSERT_FALSE(opTime.isNull()); @@ -242,7 +242,7 @@ TEST_F(OplogTest, ConcurrentLogOp) { unittest::Barrier* barrier) { return [=] { auto opCtx = cc().makeOperationContext(); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); _logOpNoopWithMsg(opCtx.get(), mtx, opTimeNssMap, nss); @@ -273,7 +273,7 @@ TEST_F(OplogTest, ConcurrentLogOpRevertFirstOplogEntry) { unittest::Barrier* barrier) { return [=] { auto opCtx = cc().makeOperationContext(); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); auto opTime = _logOpNoopWithMsg(opCtx.get(), mtx, opTimeNssMap, nss); @@ -319,7 +319,7 @@ TEST_F(OplogTest, ConcurrentLogOpRevertLastOplogEntry) { unittest::Barrier* barrier) { return [=] { auto opCtx = cc().makeOperationContext(); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); auto opTime = _logOpNoopWithMsg(opCtx.get(), mtx, opTimeNssMap, nss); @@ -372,7 +372,7 @@ TEST_F(OplogTest, MigrationIdAddedToOplog) { oplogEntry.setNss(nss); oplogEntry.setObject(msgObj); oplogEntry.setWallClockTime(Date_t::now()); - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_X); WriteUnitOfWork wunit(opCtx.get()); opTime = logOp(opCtx.get(), &oplogEntry); ASSERT_FALSE(opTime.isNull()); diff --git a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp index b9653ab4753..227e60b0444 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp @@ -1058,7 +1058,7 @@ void ReplicationCoordinatorExternalStateImpl::_dropAllTempCollections(OperationC "Removing temporary collections from {db}", "Removing temporary collections", "db"_attr = dbName); - AutoGetDb autoDb(opCtx, dbName.db(), MODE_IX); + AutoGetDb autoDb(opCtx, dbName, MODE_IX); invariant(autoDb.getDb(), str::stream() << "Unable to get reference to database " << dbName.db()); autoDb.getDb()->clearTmpCollections(opCtx); diff --git a/src/mongo/db/repl/replication_recovery.cpp b/src/mongo/db/repl/replication_recovery.cpp index 50f1bd83e38..a8cd23cd89b 100644 --- a/src/mongo/db/repl/replication_recovery.cpp +++ b/src/mongo/db/repl/replication_recovery.cpp @@ -806,7 +806,7 @@ void ReplicationRecoveryImpl::_truncateOplogTo(OperationContext* opCtx, // Fetch the oplog collection. const NamespaceString oplogNss(NamespaceString::kRsOplogNamespace); - AutoGetDb autoDb(opCtx, oplogNss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, oplogNss.dbName(), MODE_IX); Lock::CollectionLock oplogCollectionLoc(opCtx, oplogNss, MODE_X); auto oplogCollection = CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, oplogNss); diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp index c90093fcbe8..66c05c2ef0f 100644 --- a/src/mongo/db/repl/rs_rollback.cpp +++ b/src/mongo/db/repl/rs_rollback.cpp @@ -1503,7 +1503,7 @@ void rollback_internal::syncFixUp(OperationContext* opCtx, "Dropping collection", "namespace"_attr = *nss, "uuid"_attr = uuid); - AutoGetDb dbLock(opCtx, nss->db(), MODE_X); + AutoGetDb dbLock(opCtx, nss->dbName(), MODE_X); Database* db = dbLock.getDb(); if (db) { diff --git a/src/mongo/db/repl/storage_interface_impl.cpp b/src/mongo/db/repl/storage_interface_impl.cpp index 9cfc1b0f4e7..0fcd6083e77 100644 --- a/src/mongo/db/repl/storage_interface_impl.cpp +++ b/src/mongo/db/repl/storage_interface_impl.cpp @@ -242,7 +242,7 @@ StorageInterfaceImpl::createCollectionForBulkLoading( UnreplicatedWritesBlock uwb(opCtx.get()); // Get locks and create the collection. - AutoGetDb autoDb(opCtx.get(), nss.db(), MODE_IX); + AutoGetDb autoDb(opCtx.get(), nss.dbName(), MODE_IX); AutoGetCollection coll(opCtx.get(), nss, fixLockModeForSystemDotViewsChanges(nss, MODE_X)); if (coll) { return Status(ErrorCodes::NamespaceExists, @@ -452,7 +452,7 @@ Status StorageInterfaceImpl::createCollection(OperationContext* opCtx, const bool createIdIndex, const BSONObj& idIndexSpec) { return writeConflictRetry(opCtx, "StorageInterfaceImpl::createCollection", nss.ns(), [&] { - AutoGetDb databaseWriteGuard(opCtx, nss.db(), MODE_IX); + AutoGetDb databaseWriteGuard(opCtx, nss.dbName(), MODE_IX); auto db = databaseWriteGuard.ensureDbExists(opCtx); invariant(db); @@ -513,7 +513,7 @@ Status StorageInterfaceImpl::createIndexesOnEmptyCollection( Status StorageInterfaceImpl::dropCollection(OperationContext* opCtx, const NamespaceString& nss) { return writeConflictRetry(opCtx, "StorageInterfaceImpl::dropCollection", nss.ns(), [&] { - AutoGetDb autoDb(opCtx, nss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, nss, MODE_X); if (!autoDb.getDb()) { // Database does not exist - nothing to do. @@ -560,7 +560,7 @@ Status StorageInterfaceImpl::renameCollection(OperationContext* opCtx, } return writeConflictRetry(opCtx, "StorageInterfaceImpl::renameCollection", fromNS.ns(), [&] { - AutoGetDb autoDB(opCtx, fromNS.db(), MODE_X); + AutoGetDb autoDB(opCtx, fromNS.dbName(), MODE_X); if (!autoDB.getDb()) { return Status(ErrorCodes::NamespaceNotFound, str::stream() @@ -1428,7 +1428,7 @@ boost::optional<Timestamp> StorageInterfaceImpl::getRecoveryTimestamp( } Status StorageInterfaceImpl::isAdminDbValid(OperationContext* opCtx) { - AutoGetDb autoDB(opCtx, "admin", MODE_X); + AutoGetDb autoDB(opCtx, DatabaseName(boost::none, "admin"), MODE_X); auto adminDb = autoDB.getDb(); if (!adminDb) { return Status::OK(); diff --git a/src/mongo/db/repl/storage_timestamp_test.cpp b/src/mongo/db/repl/storage_timestamp_test.cpp index 7c613a67773..299bfcc2339 100644 --- a/src/mongo/db/repl/storage_timestamp_test.cpp +++ b/src/mongo/db/repl/storage_timestamp_test.cpp @@ -115,7 +115,7 @@ Status createIndexFromSpec(OperationContext* opCtx, // on this namespace would have a dangling Collection pointer after this function has run. invariant(!opCtx->lockState()->isCollectionLockedForMode(nss, MODE_IX)); - AutoGetDb autoDb(opCtx, nsToDatabaseSubstring(ns), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); { WriteUnitOfWork wunit(opCtx); auto coll = diff --git a/src/mongo/db/repl/tenant_file_importer_service.cpp b/src/mongo/db/repl/tenant_file_importer_service.cpp index af565c3c713..19173a7c259 100644 --- a/src/mongo/db/repl/tenant_file_importer_service.cpp +++ b/src/mongo/db/repl/tenant_file_importer_service.cpp @@ -101,7 +101,7 @@ void importCopiedFiles(OperationContext* opCtx, auto catalog = CollectionCatalog::get(opCtx); for (auto&& m : metadatas) { - AutoGetDb dbLock(opCtx, m.ns.db(), MODE_IX); + AutoGetDb dbLock(opCtx, m.ns.dbName(), MODE_IX); Lock::CollectionLock systemViewsLock( opCtx, NamespaceString(m.ns.dbName(), NamespaceString::kSystemDotViewsCollectionName), diff --git a/src/mongo/db/repl/tenant_migration_shard_merge_util.cpp b/src/mongo/db/repl/tenant_migration_shard_merge_util.cpp index b683fe3aebf..a600fdc5289 100644 --- a/src/mongo/db/repl/tenant_migration_shard_merge_util.cpp +++ b/src/mongo/db/repl/tenant_migration_shard_merge_util.cpp @@ -171,7 +171,7 @@ void wiredTigerImportFromBackupCursor(OperationContext* opCtx, const auto nss = collectionMetadata.ns; writeConflictRetry(opCtx, "importCollection", nss.ns(), [&] { LOGV2_DEBUG(6114303, 1, "Importing donor collection", "ns"_attr = nss); - AutoGetDb autoDb(opCtx, nss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); auto db = autoDb.ensureDbExists(opCtx); invariant(db); Lock::CollectionLock collLock(opCtx, nss, MODE_X); diff --git a/src/mongo/db/s/database_sharding_state_test.cpp b/src/mongo/db/s/database_sharding_state_test.cpp index a0848154f53..bc263c5ab50 100644 --- a/src/mongo/db/s/database_sharding_state_test.cpp +++ b/src/mongo/db/s/database_sharding_state_test.cpp @@ -137,7 +137,7 @@ TEST_F(DatabaseShardingStateTestWithMockedLoader, OnDbVersionMismatch) { auto opCtx = operationContext(); auto getActiveDbVersion = [&] { - AutoGetDb autoDb(opCtx, kDbName, MODE_IS); + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, kDbName), MODE_IS); return DatabaseHolder::get(opCtx)->getDbVersion(opCtx, kDbName); }; @@ -170,7 +170,7 @@ TEST_F(DatabaseShardingStateTestWithMockedLoader, ForceDatabaseRefresh) { forceDatabaseRefresh(opCtx, kDbName); boost::optional<DatabaseVersion> activeDbVersion = [&] { - AutoGetDb autoDb(opCtx, kDbName, MODE_IS); + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, kDbName), MODE_IS); return DatabaseHolder::get(opCtx)->getDbVersion(opCtx, kDbName); }(); ASSERT_TRUE(activeDbVersion); diff --git a/src/mongo/db/s/get_database_version_command.cpp b/src/mongo/db/s/get_database_version_command.cpp index 2b5ebd0ff2a..a906d3a0b89 100644 --- a/src/mongo/db/s/get_database_version_command.cpp +++ b/src/mongo/db/s/get_database_version_command.cpp @@ -80,7 +80,7 @@ public: str::stream() << definition()->getName() << " can only be run on shard servers", serverGlobalParams.clusterRole == ClusterRole::ShardServer); BSONObj versionObj; - AutoGetDb autoDb(opCtx, _targetDb(), MODE_IS); + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, _targetDb()), MODE_IS); if (const auto dbVersion = DatabaseHolder::get(opCtx)->getDbVersion(opCtx, _targetDb())) { diff --git a/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp b/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp index 4837f2bb552..b5046b97d86 100644 --- a/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp +++ b/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp @@ -182,7 +182,7 @@ protected: ChunkVersion({epoch, timestamp}, {1, 0}), ShardId("dummyShardId")}}); - AutoGetDb autoDb(operationContext(), kNss.db(), MODE_IX); + AutoGetDb autoDb(operationContext(), kNss.dbName(), MODE_IX); Lock::CollectionLock collLock(operationContext(), kNss, MODE_IX); CollectionShardingRuntime::get(operationContext(), kNss) ->setFilteringMetadata( diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp index bc707e25182..58fe7659d21 100644 --- a/src/mongo/db/s/migration_destination_manager.cpp +++ b/src/mongo/db/s/migration_destination_manager.cpp @@ -992,7 +992,7 @@ void MigrationDestinationManager::cloneCollectionIndexesAndOptions( // Take the exclusive database lock if the collection does not exist or indexes are missing // (needs auto-heal). - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); auto collection = CollectionCatalog::get(opCtx)->lookupCollectionByNamespace(opCtx, nss); diff --git a/src/mongo/db/s/migration_util.cpp b/src/mongo/db/s/migration_util.cpp index a0a1471a5e3..e71dfe04d89 100644 --- a/src/mongo/db/s/migration_util.cpp +++ b/src/mongo/db/s/migration_util.cpp @@ -1067,7 +1067,7 @@ void recoverMigrationCoordinations(OperationContext* opCtx, } auto setFilteringMetadata = [&opCtx, ¤tMetadata, &doc, &cancellationToken]() { - AutoGetDb autoDb(opCtx, doc.getNss().db(), MODE_IX); + AutoGetDb autoDb(opCtx, doc.getNss().dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, doc.getNss(), MODE_IX); auto* const csr = CollectionShardingRuntime::get(opCtx, doc.getNss()); diff --git a/src/mongo/db/s/move_primary_source_manager.cpp b/src/mongo/db/s/move_primary_source_manager.cpp index 11b8390f55a..e016d060f09 100644 --- a/src/mongo/db/s/move_primary_source_manager.cpp +++ b/src/mongo/db/s/move_primary_source_manager.cpp @@ -100,7 +100,7 @@ Status MovePrimarySourceManager::clone(OperationContext* opCtx) { { // We use AutoGetDb::ensureDbExists() the first time just in case movePrimary was called // before any data was inserted into the database. - AutoGetDb autoDb(opCtx, getNss().toString(), MODE_X); + AutoGetDb autoDb(opCtx, getNss().dbName(), MODE_X); invariant(autoDb.ensureDbExists(opCtx), getNss().toString()); auto dss = DatabaseShardingState::get(opCtx, getNss().toString()); @@ -164,7 +164,7 @@ Status MovePrimarySourceManager::enterCriticalSection(OperationContext* opCtx) { // The critical section must be entered with the database X lock in order to ensure there // are no writes which could have entered and passed the database version check just before // we entered the critical section, but will potentially complete after we left it. - AutoGetDb autoDb(opCtx, getNss().toString(), MODE_X); + AutoGetDb autoDb(opCtx, getNss().dbName(), MODE_X); if (!autoDb.getDb()) { uasserted(ErrorCodes::ConflictingOperationInProgress, @@ -213,7 +213,7 @@ Status MovePrimarySourceManager::commitOnConfig(OperationContext* opCtx) { ScopeGuard scopedGuard([&] { cleanupOnError(opCtx); }); { - AutoGetDb autoDb(opCtx, getNss().toString(), MODE_X); + AutoGetDb autoDb(opCtx, getNss().dbName(), MODE_X); if (!autoDb.getDb()) { uasserted(ErrorCodes::ConflictingOperationInProgress, @@ -273,7 +273,7 @@ Status MovePrimarySourceManager::commitOnConfig(OperationContext* opCtx) { // this node can accept writes for this collection as a proxy for it being primary. if (!validateStatus.isOK()) { UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - AutoGetDb autoDb(opCtx, getNss().toString(), MODE_IX); + AutoGetDb autoDb(opCtx, getNss().dbName(), MODE_IX); if (!autoDb.getDb()) { uasserted(ErrorCodes::ConflictingOperationInProgress, @@ -443,7 +443,7 @@ void MovePrimarySourceManager::_cleanup(OperationContext* opCtx) { { // Unregister from the database's sharding state if we're still registered. UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - AutoGetDb autoDb(opCtx, getNss().toString(), MODE_IX); + AutoGetDb autoDb(opCtx, getNss().dbName(), MODE_IX); auto dss = DatabaseShardingState::get(opCtx, getNss().db()); dss->clearMovePrimarySourceManager(opCtx); diff --git a/src/mongo/db/s/persistent_task_queue_test.cpp b/src/mongo/db/s/persistent_task_queue_test.cpp index 4c498940583..55f490d9a7f 100644 --- a/src/mongo/db/s/persistent_task_queue_test.cpp +++ b/src/mongo/db/s/persistent_task_queue_test.cpp @@ -83,7 +83,7 @@ void killOps(ServiceContext* serviceCtx) { class PersistentTaskQueueTest : public ShardServerTestFixture { void setUp() override { ShardServerTestFixture::setUp(); - AutoGetDb autoDb(operationContext(), kNss.db(), MODE_IX); + AutoGetDb autoDb(operationContext(), kNss.dbName(), MODE_IX); Lock::CollectionLock collLock(operationContext(), kNss, MODE_IX); CollectionShardingRuntime::get(operationContext(), kNss) ->setFilteringMetadata(operationContext(), CollectionMetadata()); diff --git a/src/mongo/db/s/range_deletion_util_test.cpp b/src/mongo/db/s/range_deletion_util_test.cpp index 8ebbf459823..43eba92c307 100644 --- a/src/mongo/db/s/range_deletion_util_test.cpp +++ b/src/mongo/db/s/range_deletion_util_test.cpp @@ -117,7 +117,7 @@ public: DatabaseVersion(UUID::gen(), Timestamp(1, 1)), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none); - AutoGetDb autoDb(_opCtx, kNss.db(), MODE_IX); + AutoGetDb autoDb(_opCtx, kNss.dbName(), MODE_IX); Lock::CollectionLock collLock(_opCtx, kNss, MODE_IX); CollectionMetadata collMetadata(std::move(cm), ShardId("dummyShardId")); CollectionShardingRuntime::get(_opCtx, kNss)->setFilteringMetadata(_opCtx, collMetadata); diff --git a/src/mongo/db/s/resharding/resharding_donor_service.cpp b/src/mongo/db/s/resharding/resharding_donor_service.cpp index 95d31bda195..9bc249cd378 100644 --- a/src/mongo/db/s/resharding/resharding_donor_service.cpp +++ b/src/mongo/db/s/resharding/resharding_donor_service.cpp @@ -86,7 +86,7 @@ Timestamp generateMinFetchTimestamp(OperationContext* opCtx, const NamespaceStri // Do a no-op write and use the OpTime as the minFetchTimestamp writeConflictRetry( opCtx, "resharding donor minFetchTimestamp", NamespaceString::kRsOplogNamespace.ns(), [&] { - AutoGetDb db(opCtx, sourceNss.db(), MODE_IX); + AutoGetDb db(opCtx, sourceNss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, sourceNss, MODE_S); AutoGetOplog oplogWrite(opCtx, OplogAccessMode::kWrite); diff --git a/src/mongo/db/s/resharding/resharding_oplog_fetcher.cpp b/src/mongo/db/s/resharding/resharding_oplog_fetcher.cpp index ac62a1cee4d..5f84a037f4c 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_fetcher.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_fetcher.cpp @@ -253,7 +253,7 @@ void ReshardingOplogFetcher::_ensureCollection(Client* client, } WriteUnitOfWork wuow(opCtx); - AutoGetDb autoDb(opCtx, nss.db(), LockMode::MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), LockMode::MODE_IX); Lock::CollectionLock collLock(opCtx, nss, MODE_IX); auto db = autoDb.ensureDbExists(opCtx); diff --git a/src/mongo/db/s/resharding/resharding_oplog_fetcher_test.cpp b/src/mongo/db/s/resharding/resharding_oplog_fetcher_test.cpp index ddf8e673240..9258511832d 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_fetcher_test.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_fetcher_test.cpp @@ -215,7 +215,7 @@ public: void create(NamespaceString nss) { writeConflictRetry(_opCtx, "create", nss.ns(), [&] { AllowLockAcquisitionOnTimestampedUnitOfWork allowLockAcquisition(_opCtx->lockState()); - AutoGetDb autoDb(_opCtx, nss.db(), LockMode::MODE_X); + AutoGetDb autoDb(_opCtx, nss.dbName(), LockMode::MODE_X); WriteUnitOfWork wunit(_opCtx); if (_opCtx->recoveryUnit()->getCommitTimestamp().isNull()) { ASSERT_OK(_opCtx->recoveryUnit()->setTimestamp(Timestamp(1, 1))); diff --git a/src/mongo/db/s/session_catalog_migration_destination_test.cpp b/src/mongo/db/s/session_catalog_migration_destination_test.cpp index aba7b87e75c..2dc41e842ca 100644 --- a/src/mongo/db/s/session_catalog_migration_destination_test.cpp +++ b/src/mongo/db/s/session_catalog_migration_destination_test.cpp @@ -274,7 +274,7 @@ public: } void setUnshardedFilteringMetadata(const NamespaceString& nss) { - AutoGetDb autoDb(operationContext(), nss.db(), MODE_IX); + AutoGetDb autoDb(operationContext(), nss.dbName(), MODE_IX); Lock::CollectionLock collLock(operationContext(), nss, MODE_IX); CollectionShardingRuntime::get(operationContext(), nss) ->setFilteringMetadata(operationContext(), CollectionMetadata()); diff --git a/src/mongo/db/s/shard_server_op_observer.cpp b/src/mongo/db/s/shard_server_op_observer.cpp index 427208baec6..661be4e079d 100644 --- a/src/mongo/db/s/shard_server_op_observer.cpp +++ b/src/mongo/db/s/shard_server_op_observer.cpp @@ -383,6 +383,7 @@ void ShardServerOpObserver::onUpdate(OperationContext* opCtx, const OplogUpdateE // primary, blocking behind the critical section. // Extract which database was updated + // TODO SERVER-67789 Change to extract DatabaseName obj, and use when locking db below. std::string db; fassert(40478, bsonExtractStringField( @@ -395,7 +396,7 @@ void ShardServerOpObserver::onUpdate(OperationContext* opCtx, const OplogUpdateE // TODO SERVER-58223: evaluate whether this is safe or whether acquiring the lock can // block. AllowLockAcquisitionOnTimestampedUnitOfWork allowLockAcquisition(opCtx->lockState()); - AutoGetDb autoDb(opCtx, db, MODE_X); + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, db), MODE_X); DatabaseHolder::get(opCtx)->clearDbInfo(opCtx, DatabaseName(boost::none, db)); } } @@ -484,6 +485,7 @@ void ShardServerOpObserver::onDelete(OperationContext* opCtx, } // Extract which database entry is being deleted from the _id field. + // TODO SERVER-67789 Change to extract DatabaseName obj, and use when locking db below. std::string deletedDatabase; fassert(50772, bsonExtractStringField( @@ -491,7 +493,7 @@ void ShardServerOpObserver::onDelete(OperationContext* opCtx, // TODO SERVER-58223: evaluate whether this is safe or whether acquiring the lock can block. AllowLockAcquisitionOnTimestampedUnitOfWork allowLockAcquisition(opCtx->lockState()); - AutoGetDb autoDb(opCtx, deletedDatabase, MODE_X); + AutoGetDb autoDb(opCtx, DatabaseName(boost::none, deletedDatabase), MODE_X); DatabaseHolder::get(opCtx)->clearDbInfo(opCtx, DatabaseName(boost::none, deletedDatabase)); } diff --git a/src/mongo/db/s/sharding_initialization_mongod.cpp b/src/mongo/db/s/sharding_initialization_mongod.cpp index 9458486f9b9..9d423f65057 100644 --- a/src/mongo/db/s/sharding_initialization_mongod.cpp +++ b/src/mongo/db/s/sharding_initialization_mongod.cpp @@ -461,7 +461,7 @@ void ShardingInitializationMongoD::updateShardIdentityConfigString( write_ops::UpdateModification::parseFromClassicUpdate(updateObj)); try { - AutoGetDb autoDb(opCtx, NamespaceString::kServerConfigurationNamespace.db(), MODE_X); + AutoGetDb autoDb(opCtx, NamespaceString::kServerConfigurationNamespace.dbName(), MODE_X); auto result = update(opCtx, autoDb.ensureDbExists(opCtx), updateReq); if (result.numMatched == 0) { diff --git a/src/mongo/db/s/split_vector_test.cpp b/src/mongo/db/s/split_vector_test.cpp index f2a63755cf5..f5588677e85 100644 --- a/src/mongo/db/s/split_vector_test.cpp +++ b/src/mongo/db/s/split_vector_test.cpp @@ -48,7 +48,7 @@ const NamespaceString kNss = NamespaceString("foo", "bar"); const std::string kPattern = "_id"; void setUnshardedFilteringMetadata(OperationContext* opCtx, const NamespaceString& nss) { - AutoGetDb autoDb(opCtx, nss.db(), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); Lock::CollectionLock collLock(opCtx, nss, MODE_IX); CollectionShardingRuntime::get(opCtx, nss)->setFilteringMetadata(opCtx, CollectionMetadata()); } diff --git a/src/mongo/db/serverless/shard_split_donor_service_test.cpp b/src/mongo/db/serverless/shard_split_donor_service_test.cpp index 2068cebcf3c..6f976ed8424 100644 --- a/src/mongo/db/serverless/shard_split_donor_service_test.cpp +++ b/src/mongo/db/serverless/shard_split_donor_service_test.cpp @@ -351,7 +351,8 @@ public: // The database needs to be open before using shard split donor service. { auto opCtx = cc().makeOperationContext(); - AutoGetDb autoDb(opCtx.get(), NamespaceString::kShardSplitDonorsNamespace.db(), MODE_X); + AutoGetDb autoDb( + opCtx.get(), NamespaceString::kShardSplitDonorsNamespace.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx.get()); ASSERT_TRUE(db); } diff --git a/src/mongo/db/storage/kv/storage_engine_test.cpp b/src/mongo/db/storage/kv/storage_engine_test.cpp index ebfd3bb017a..eced5c5c3ff 100644 --- a/src/mongo/db/storage/kv/storage_engine_test.cpp +++ b/src/mongo/db/storage/kv/storage_engine_test.cpp @@ -449,7 +449,7 @@ TEST_F(StorageEngineRepairTest, LoadCatalogRecoversOrphansInCatalog) { ASSERT_OK(swCollInfo.getStatus()); ASSERT(collectionExists(opCtx.get(), collNs)); - AutoGetDb db(opCtx.get(), collNs.db(), LockMode::MODE_X); + AutoGetDb db(opCtx.get(), collNs.dbName(), LockMode::MODE_X); // Only drop the catalog entry; storage engine still knows about this ident. // This simulates an unclean shutdown happening between dropping the catalog entry and // the actual drop in storage engine. @@ -485,7 +485,7 @@ TEST_F(StorageEngineTest, LoadCatalogDropsOrphans) { ASSERT_OK(swCollInfo.getStatus()); ASSERT(collectionExists(opCtx.get(), collNs)); - AutoGetDb db(opCtx.get(), collNs.db(), LockMode::MODE_X); + AutoGetDb db(opCtx.get(), collNs.dbName(), LockMode::MODE_X); // Only drop the catalog entry; storage engine still knows about this ident. // This simulates an unclean shutdown happening between dropping the catalog entry and // the actual drop in storage engine. diff --git a/src/mongo/db/storage/storage_engine_test_fixture.h b/src/mongo/db/storage/storage_engine_test_fixture.h index 4e8d0e27f54..42e748bc588 100644 --- a/src/mongo/db/storage/storage_engine_test_fixture.h +++ b/src/mongo/db/storage/storage_engine_test_fixture.h @@ -58,7 +58,7 @@ public: StatusWith<DurableCatalog::Entry> createCollection(OperationContext* opCtx, NamespaceString ns) { - AutoGetDb db(opCtx, ns.db(), LockMode::MODE_X); + AutoGetDb db(opCtx, ns.dbName(), LockMode::MODE_X); CollectionOptions options; options.uuid = UUID::gen(); RecordId catalogId; diff --git a/src/mongo/db/transaction_participant_test.cpp b/src/mongo/db/transaction_participant_test.cpp index 95748462bdb..60d0df6e6f2 100644 --- a/src/mongo/db/transaction_participant_test.cpp +++ b/src/mongo/db/transaction_participant_test.cpp @@ -291,7 +291,7 @@ protected: { // Set up a collection so that TransactionParticipant::prepareTransaction() can safely // access it. - AutoGetDb autoDb(opCtx(), kNss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), kNss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx()); ASSERT_TRUE(db); @@ -398,7 +398,7 @@ void insertTxnRecord(OperationContext* opCtx, unsigned i, DurableTxnStateEnum st record.setLastWriteOpTime(repl::OpTime(ts, 0)); record.setLastWriteDate(Date_t::now()); - AutoGetDb autoDb(opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx); ASSERT(db); WriteUnitOfWork wuow(opCtx); @@ -673,7 +673,7 @@ TEST_F(TxnParticipantTest, PrepareFailsOnTemporaryCollection) { // Create a temporary collection so that we can write to it. { - AutoGetDb autoDb(opCtx(), kNss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), kNss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx()); ASSERT_TRUE(db); @@ -4473,7 +4473,7 @@ TEST_F(TxnParticipantTest, OldestActiveTransactionTimestamp) { auto deleteTxnRecord = [&](unsigned i) { Timestamp ts(1, i); - AutoGetDb autoDb(opCtx(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx()); ASSERT(db); WriteUnitOfWork wuow(opCtx()); @@ -4530,7 +4530,7 @@ TEST_F(TxnParticipantTest, OldestActiveTransactionTimestamp) { TEST_F(TxnParticipantTest, OldestActiveTransactionTimestampTimeout) { // Block getOldestActiveTimestamp() by locking the config database. auto nss = NamespaceString::kSessionTransactionsTableNamespace; - AutoGetDb autoDb(opCtx(), nss.db(), MODE_X); + AutoGetDb autoDb(opCtx(), nss.dbName(), MODE_X); auto db = autoDb.ensureDbExists(opCtx()); ASSERT(db); auto statusWith = TransactionParticipant::getOldestActiveTimestamp(Timestamp()); diff --git a/src/mongo/db/views/view_catalog_test.cpp b/src/mongo/db/views/view_catalog_test.cpp index 1d6b091681a..841bdd61bb8 100644 --- a/src/mongo/db/views/view_catalog_test.cpp +++ b/src/mongo/db/views/view_catalog_test.cpp @@ -82,13 +82,15 @@ public: CatalogTestFixture::setUp(); WriteUnitOfWork wuow(operationContext()); - AutoGetDb autoDb(operationContext(), "db", MODE_X); + AutoGetDb autoDb(operationContext(), DatabaseName(boost::none, "db"), MODE_X); _db = autoDb.ensureDbExists(operationContext()); invariant(_db); // Create any additional databases used throughout the test. - ASSERT(AutoGetDb(operationContext(), "db1", MODE_X).ensureDbExists(operationContext())); - ASSERT(AutoGetDb(operationContext(), "db2", MODE_X).ensureDbExists(operationContext())); + ASSERT(AutoGetDb(operationContext(), DatabaseName(boost::none, "db1"), MODE_X) + .ensureDbExists(operationContext())); + ASSERT(AutoGetDb(operationContext(), DatabaseName(boost::none, "db2"), MODE_X) + .ensureDbExists(operationContext())); auto durableViewCatalogUnique = std::make_unique<DurableViewCatalogImpl>(_db); durableViewCatalog = durableViewCatalogUnique.get(); diff --git a/src/mongo/dbtests/dbtests.cpp b/src/mongo/dbtests/dbtests.cpp index a0c99d5d5e5..1a4ac85d34b 100644 --- a/src/mongo/dbtests/dbtests.cpp +++ b/src/mongo/dbtests/dbtests.cpp @@ -101,7 +101,7 @@ Status createIndex(OperationContext* opCtx, StringData ns, const BSONObj& keys, Status createIndexFromSpec(OperationContext* opCtx, StringData ns, const BSONObj& spec) { NamespaceString nss(ns); - AutoGetDb autoDb(opCtx, nsToDatabaseSubstring(ns), MODE_IX); + AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX); { Lock::CollectionLock collLock(opCtx, nss, MODE_X); WriteUnitOfWork wunit(opCtx); diff --git a/src/mongo/dbtests/extensions_callback_real_test.cpp b/src/mongo/dbtests/extensions_callback_real_test.cpp index a2d88117969..a74c5f7dcdd 100644 --- a/src/mongo/dbtests/extensions_callback_real_test.cpp +++ b/src/mongo/dbtests/extensions_callback_real_test.cpp @@ -53,7 +53,7 @@ public: } void setUp() final { - AutoGetDb autoDb(&_opCtx, _nss.db(), MODE_X); + AutoGetDb autoDb(&_opCtx, _nss.dbName(), MODE_X); auto database = autoDb.ensureDbExists(&_opCtx); { WriteUnitOfWork wunit(&_opCtx); @@ -63,7 +63,7 @@ public: } void tearDown() final { - AutoGetDb autoDb(&_opCtx, _nss.db(), MODE_X); + AutoGetDb autoDb(&_opCtx, _nss.dbName(), MODE_X); Database* database = autoDb.getDb(); if (!database) { return; diff --git a/src/mongo/dbtests/indexupdatetests.cpp b/src/mongo/dbtests/indexupdatetests.cpp index be7a8dab483..5b11a9d6078 100644 --- a/src/mongo/dbtests/indexupdatetests.cpp +++ b/src/mongo/dbtests/indexupdatetests.cpp @@ -273,7 +273,7 @@ public: } regenOpCtx(); - AutoGetDb dbRaii(_opCtx, _nss.db(), LockMode::MODE_IX); + AutoGetDb dbRaii(_opCtx, _nss.dbName(), LockMode::MODE_IX); boost::optional<Lock::CollectionLock> collLk; collLk.emplace(_opCtx, _nss, LockMode::MODE_IX); // The new index is not listed in the index catalog because the index build failed. diff --git a/src/mongo/dbtests/query_stage_collscan.cpp b/src/mongo/dbtests/query_stage_collscan.cpp index 3a4b201f409..247fd181035 100644 --- a/src/mongo/dbtests/query_stage_collscan.cpp +++ b/src/mongo/dbtests/query_stage_collscan.cpp @@ -160,7 +160,7 @@ public: ScopedCollectionDeleter(OperationContext* opCtx, NamespaceString nss) : _opCtx(opCtx), _nss(nss) {} ~ScopedCollectionDeleter() { - AutoGetDb autoDb(_opCtx, _nss.db(), MODE_IX); + AutoGetDb autoDb(_opCtx, _nss.dbName(), MODE_IX); if (!autoDb.getDb()) return; diff --git a/src/mongo/dbtests/rollbacktests.cpp b/src/mongo/dbtests/rollbacktests.cpp index 1c2b2a1dc1c..27cc030a169 100644 --- a/src/mongo/dbtests/rollbacktests.cpp +++ b/src/mongo/dbtests/rollbacktests.cpp @@ -488,7 +488,7 @@ public: dropDatabase(&opCtx, nss); createCollection(&opCtx, nss); - AutoGetDb autoDb(&opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(&opCtx, nss.dbName(), MODE_X); CollectionWriter coll(&opCtx, nss); @@ -530,7 +530,7 @@ public: dropDatabase(&opCtx, nss); createCollection(&opCtx, nss); - AutoGetDb autoDb(&opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(&opCtx, nss.dbName(), MODE_X); CollectionWriter coll(&opCtx, nss); @@ -584,7 +584,7 @@ public: dropDatabase(&opCtx, nss); createCollection(&opCtx, nss); - AutoGetDb autoDb(&opCtx, nss.db(), MODE_X); + AutoGetDb autoDb(&opCtx, nss.dbName(), MODE_X); CollectionWriter coll(&opCtx, nss); string idxName = "a"; diff --git a/src/mongo/dbtests/validate_tests.cpp b/src/mongo/dbtests/validate_tests.cpp index 597f1d9e365..f1fa76d2bb9 100644 --- a/src/mongo/dbtests/validate_tests.cpp +++ b/src/mongo/dbtests/validate_tests.cpp @@ -108,7 +108,7 @@ public: : ValidateBase(full, background, /*clustered=*/false) {} ~ValidateBase() { - AutoGetDb autoDb(&_opCtx, _nss.db(), MODE_X); + AutoGetDb autoDb(&_opCtx, _nss.dbName(), MODE_X); auto db = autoDb.getDb(); ASSERT_TRUE(db); @@ -192,7 +192,7 @@ protected: void lockDb(LockMode mode) { _autoDb.reset(); invariant(_opCtx.lockState()->isDbLockedForMode(_nss.dbName(), MODE_NONE)); - _autoDb.reset(new AutoGetDb(&_opCtx, _nss.db().toString(), mode)); + _autoDb.reset(new AutoGetDb(&_opCtx, _nss.dbName(), mode)); invariant(_opCtx.lockState()->isDbLockedForMode(_nss.dbName(), mode)); _db = _autoDb.get()->getDb(); } |