summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2018-12-19 18:59:12 -0500
committerBenety Goh <benety@mongodb.com>2018-12-19 18:59:28 -0500
commit51ab5eb0c500d0013ac6265de40ab7dbc3d52131 (patch)
treebf42d7bdb4ba2537ed19dc1c567e36336fa77c94 /src/mongo
parentc959f0d1381baba1bf479c3515122ebfc4c39d45 (diff)
downloadmongo-51ab5eb0c500d0013ac6265de40ab7dbc3d52131.tar.gz
SERVER-38700 convert static Database::dropDatabase to a method on DatabaseHolder
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/catalog/database.cpp2
-rw-r--r--src/mongo/db/catalog/database.h9
-rw-r--r--src/mongo/db/catalog/database_holder.h13
-rw-r--r--src/mongo/db/catalog/database_holder_impl.cpp36
-rw-r--r--src/mongo/db/catalog/database_holder_impl.h2
-rw-r--r--src/mongo/db/catalog/database_holder_mock.h2
-rw-r--r--src/mongo/db/catalog/database_impl.cpp34
-rw-r--r--src/mongo/db/catalog/drop_database.cpp5
-rw-r--r--src/mongo/db/catalog/drop_database_test.cpp6
-rw-r--r--src/mongo/dbtests/rollbacktests.cpp2
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) {