diff options
author | Benety Goh <benety@mongodb.com> | 2018-12-19 18:59:12 -0500 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2018-12-19 18:59:28 -0500 |
commit | 51ab5eb0c500d0013ac6265de40ab7dbc3d52131 (patch) | |
tree | bf42d7bdb4ba2537ed19dc1c567e36336fa77c94 | |
parent | c959f0d1381baba1bf479c3515122ebfc4c39d45 (diff) | |
download | mongo-51ab5eb0c500d0013ac6265de40ab7dbc3d52131.tar.gz |
SERVER-38700 convert static Database::dropDatabase to a method on DatabaseHolder
-rw-r--r-- | src/mongo/db/catalog/database.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/database.h | 9 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_holder.h | 13 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_holder_impl.cpp | 36 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_holder_impl.h | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_holder_mock.h | 2 | ||||
-rw-r--r-- | src/mongo/db/catalog/database_impl.cpp | 34 | ||||
-rw-r--r-- | src/mongo/db/catalog/drop_database.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/catalog/drop_database_test.cpp | 6 | ||||
-rw-r--r-- | src/mongo/dbtests/rollbacktests.cpp | 2 |
10 files changed, 57 insertions, 54 deletions
diff --git a/src/mongo/db/catalog/database.cpp b/src/mongo/db/catalog/database.cpp index 46040629e53..43696613a64 100644 --- a/src/mongo/db/catalog/database.cpp +++ b/src/mongo/db/catalog/database.cpp @@ -42,8 +42,6 @@ MONGO_DEFINE_SHIM(Database::makeImpl); void Database::TUHook::hook() noexcept {} -MONGO_DEFINE_SHIM(Database::dropDatabase); - MONGO_DEFINE_SHIM(Database::userCreateNS); MONGO_DEFINE_SHIM(Database::dropAllDatabasesExceptLocal); diff --git a/src/mongo/db/catalog/database.h b/src/mongo/db/catalog/database.h index 128b1f3a79a..34f35bad0f2 100644 --- a/src/mongo/db/catalog/database.h +++ b/src/mongo/db/catalog/database.h @@ -350,15 +350,6 @@ public: return this->_impl().renameCollection(opCtx, fromNS, toNS, stayTemp); } - /** - * Physically drops the specified opened database and removes it from the server's metadata. It - * doesn't notify the replication subsystem or do any other consistency checks, so it should - * not be used directly from user commands. - * - * Must be called with the specified database locked in X mode. - */ - static MONGO_DECLARE_SHIM((OperationContext * opCtx, Database* db)->void) dropDatabase; - inline const std::string& getSystemViewsName() const { return this->_impl().getSystemViewsName(); } diff --git a/src/mongo/db/catalog/database_holder.h b/src/mongo/db/catalog/database_holder.h index e5645b073f4..c1a87ef8941 100644 --- a/src/mongo/db/catalog/database_holder.h +++ b/src/mongo/db/catalog/database_holder.h @@ -59,6 +59,8 @@ public: virtual Database* openDb(OperationContext* opCtx, StringData ns, bool* justCreated) = 0; + virtual void dropDb(OperationContext* opCtx, Database* db) = 0; + virtual void close(OperationContext* opCtx, StringData ns, const std::string& reason) = 0; virtual void closeAll(OperationContext* opCtx, const std::string& reason) = 0; @@ -104,6 +106,17 @@ public: } /** + * Physically drops the specified opened database and removes it from the server's metadata. It + * doesn't notify the replication subsystem or do any other consistency checks, so it should + * not be used directly from user commands. + * + * Must be called with the specified database locked in X mode. + */ + inline void dropDb(OperationContext* opCtx, Database* db) { + return this->_impl().dropDb(opCtx, db); + } + + /** * Closes the specified database. Must be called with the database locked in X-mode. * No background jobs must be in progress on the database when this function is called. */ diff --git a/src/mongo/db/catalog/database_holder_impl.cpp b/src/mongo/db/catalog/database_holder_impl.cpp index 7def7ea2b68..1cc9358b413 100644 --- a/src/mongo/db/catalog/database_holder_impl.cpp +++ b/src/mongo/db/catalog/database_holder_impl.cpp @@ -34,7 +34,6 @@ #include "mongo/db/catalog/database_holder_impl.h" -#include "mongo/base/init.h" #include "mongo/db/audit.h" #include "mongo/db/background.h" #include "mongo/db/catalog/collection_impl.h" @@ -42,14 +41,13 @@ #include "mongo/db/catalog/database_catalog_entry.h" #include "mongo/db/catalog/namespace_uuid_cache.h" #include "mongo/db/catalog/uuid_catalog.h" -#include "mongo/db/client.h" -#include "mongo/db/clientcursor.h" +#include "mongo/db/concurrency/write_conflict_exception.h" #include "mongo/db/operation_context.h" #include "mongo/db/repl/oplog.h" #include "mongo/db/service_context.h" +#include "mongo/db/stats/top.h" #include "mongo/db/storage/storage_engine.h" #include "mongo/util/log.h" -#include "mongo/util/scopeguard.h" namespace mongo { namespace { @@ -165,7 +163,7 @@ Database* DatabaseHolderImpl::openDb(OperationContext* opCtx, StringData ns, boo DatabaseCatalogEntry* entry = storageEngine->getDatabaseCatalogEntry(opCtx, dbname); if (!entry->exists()) { - audit::logCreateDatabase(&cc(), dbname); + audit::logCreateDatabase(opCtx->getClient(), dbname); if (justCreated) *justCreated = true; } @@ -183,6 +181,34 @@ Database* DatabaseHolderImpl::openDb(OperationContext* opCtx, StringData ns, boo return it->second; } +void DatabaseHolderImpl::dropDb(OperationContext* opCtx, Database* db) { + invariant(db); + + // Store the name so we have if for after the db object is deleted + const string name = db->name(); + + LOG(1) << "dropDatabase " << name; + + invariant(opCtx->lockState()->isDbLockedForMode(name, MODE_X)); + + BackgroundOperation::assertNoBgOpInProgForDb(name); + + audit::logDropDatabase(opCtx->getClient(), name); + + auto const serviceContext = opCtx->getServiceContext(); + + for (auto&& coll : *db) { + Top::get(serviceContext).collectionDropped(coll->ns().ns(), true); + } + + close(opCtx, name, "database dropped"); + + auto const storageEngine = serviceContext->getStorageEngine(); + writeConflictRetry(opCtx, "dropDatabase", name, [&] { + storageEngine->dropDatabase(opCtx, name).transitional_ignore(); + }); +} + namespace { void evictDatabaseFromUUIDCatalog(OperationContext* opCtx, Database* db) { UUIDCatalog::get(opCtx).onCloseDatabase(db); diff --git a/src/mongo/db/catalog/database_holder_impl.h b/src/mongo/db/catalog/database_holder_impl.h index c85bf48d5c6..9ba4c67a4b3 100644 --- a/src/mongo/db/catalog/database_holder_impl.h +++ b/src/mongo/db/catalog/database_holder_impl.h @@ -45,6 +45,8 @@ public: Database* openDb(OperationContext* opCtx, StringData ns, bool* justCreated = nullptr) override; + void dropDb(OperationContext* opCtx, Database* db) override; + void close(OperationContext* opCtx, StringData ns, const std::string& reason) override; void closeAll(OperationContext* opCtx, const std::string& reason) override; diff --git a/src/mongo/db/catalog/database_holder_mock.h b/src/mongo/db/catalog/database_holder_mock.h index d32c70812ff..26ba3bed6f0 100644 --- a/src/mongo/db/catalog/database_holder_mock.h +++ b/src/mongo/db/catalog/database_holder_mock.h @@ -46,6 +46,8 @@ public: return nullptr; } + void dropDb(OperationContext* opCtx, Database* db) override {} + void close(OperationContext* opCtx, StringData ns, const std::string& reason) override {} void closeAll(OperationContext* opCtx, const std::string& reason) override {} diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp index bcbbadbb194..70e14b77e18 100644 --- a/src/mongo/db/catalog/database_impl.cpp +++ b/src/mongo/db/catalog/database_impl.cpp @@ -922,34 +922,6 @@ const DatabaseCatalogEntry* DatabaseImpl::getDatabaseCatalogEntry() const { return _dbEntry; } -void DatabaseImpl::dropDatabase(OperationContext* opCtx, Database* db) { - invariant(db); - - // Store the name so we have if for after the db object is deleted - const string name = db->name(); - - LOG(1) << "dropDatabase " << name; - - invariant(opCtx->lockState()->isDbLockedForMode(name, MODE_X)); - - BackgroundOperation::assertNoBgOpInProgForDb(name); - - audit::logDropDatabase(opCtx->getClient(), name); - - auto const serviceContext = opCtx->getServiceContext(); - - for (auto&& coll : *db) { - Top::get(serviceContext).collectionDropped(coll->ns().ns(), true); - } - - DatabaseHolder::getDatabaseHolder().close(opCtx, name, "database dropped"); - - auto const storageEngine = serviceContext->getStorageEngine(); - writeConflictRetry(opCtx, "dropDatabase", name, [&] { - storageEngine->dropDatabase(opCtx, name).transitional_ignore(); - }); -} - StatusWith<NamespaceString> DatabaseImpl::makeUniqueCollectionNamespace( OperationContext* opCtx, StringData collectionNameModel) { invariant(opCtx->lockState()->isDbLockedForMode(name(), MODE_X)); @@ -1050,10 +1022,6 @@ void DatabaseImpl::checkForIdIndexesAndDropPendingCollections(OperationContext* } } -MONGO_REGISTER_SHIM(Database::dropDatabase)(OperationContext* opCtx, Database* db)->void { - return DatabaseImpl::dropDatabase(opCtx, db); -} - MONGO_REGISTER_SHIM(Database::userCreateNS) (OperationContext* opCtx, Database* db, @@ -1178,7 +1146,7 @@ MONGO_REGISTER_SHIM(Database::dropAllDatabasesExceptLocal)(OperationContext* opC if (db == nullptr) { log() << "database disappeared after listDatabases but before drop: " << dbName; } else { - DatabaseImpl::dropDatabase(opCtx, db); + DatabaseHolder::getDatabaseHolder().dropDb(opCtx, db); } }); } diff --git a/src/mongo/db/catalog/drop_database.cpp b/src/mongo/db/catalog/drop_database.cpp index 07fcf6dc22f..49328d12c0e 100644 --- a/src/mongo/db/catalog/drop_database.cpp +++ b/src/mongo/db/catalog/drop_database.cpp @@ -37,6 +37,7 @@ #include <algorithm> #include "mongo/db/background.h" +#include "mongo/db/catalog/database_holder.h" #include "mongo/db/catalog_raii.h" #include "mongo/db/client.h" #include "mongo/db/concurrency/write_conflict_exception.h" @@ -62,10 +63,10 @@ namespace { * Removes database from catalog and writes dropDatabase entry to oplog. */ Status _finishDropDatabase(OperationContext* opCtx, const std::string& dbName, Database* db) { - // If Database::dropDatabase() fails, we should reset the drop-pending state on Database. + // If DatabaseHolder::dropDb() fails, we should reset the drop-pending state on Database. auto dropPendingGuard = MakeGuard([db, opCtx] { db->setDropPending(opCtx, false); }); - Database::dropDatabase(opCtx, db); + DatabaseHolder::getDatabaseHolder().dropDb(opCtx, db); dropPendingGuard.Dismiss(); log() << "dropDatabase " << dbName << " - finished"; diff --git a/src/mongo/db/catalog/drop_database_test.cpp b/src/mongo/db/catalog/drop_database_test.cpp index 642c759fc5d..26085d26c40 100644 --- a/src/mongo/db/catalog/drop_database_test.cpp +++ b/src/mongo/db/catalog/drop_database_test.cpp @@ -33,6 +33,7 @@ #include <set> #include "mongo/db/catalog/create_collection.h" +#include "mongo/db/catalog/database_holder.h" #include "mongo/db/catalog/drop_database.h" #include "mongo/db/client.h" #include "mongo/db/concurrency/write_conflict_exception.h" @@ -199,8 +200,9 @@ void _removeDatabaseFromCatalog(OperationContext* opCtx, StringData dbName) { auto db = autoDB.getDb(); // dropDatabase can call awaitReplication more than once, so do not attempt to drop the database // twice. - if (db) - Database::dropDatabase(opCtx, db); + if (db) { + DatabaseHolder::getDatabaseHolder().dropDb(opCtx, db); + } } TEST_F(DropDatabaseTest, DropDatabaseReturnsNamespaceNotFoundIfDatabaseDoesNotExist) { diff --git a/src/mongo/dbtests/rollbacktests.cpp b/src/mongo/dbtests/rollbacktests.cpp index e8bcef69ed6..7580dc2afbc 100644 --- a/src/mongo/dbtests/rollbacktests.cpp +++ b/src/mongo/dbtests/rollbacktests.cpp @@ -59,7 +59,7 @@ void dropDatabase(OperationContext* opCtx, const NamespaceString& nss) { Database* db = DatabaseHolder::getDatabaseHolder().get(opCtx, nss.db()); if (db) { - Database::dropDatabase(opCtx, db); + DatabaseHolder::getDatabaseHolder().dropDb(opCtx, db); } } bool collectionExists(OldClientContext* ctx, const string& ns) { |