diff options
Diffstat (limited to 'src/mongo/db/catalog/database_impl.cpp')
-rw-r--r-- | src/mongo/db/catalog/database_impl.cpp | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp index 4d195d3cf58..fca3b112818 100644 --- a/src/mongo/db/catalog/database_impl.cpp +++ b/src/mongo/db/catalog/database_impl.cpp @@ -78,17 +78,16 @@ #include "mongo/util/log.h" namespace mongo { -MONGO_REGISTER_SHIM(Database::makeImpl) -(Database* const this_, - OperationContext* const opCtx, - const StringData name, - DatabaseCatalogEntry* const dbEntry, - PrivateTo<Database>) - ->std::unique_ptr<Database::Impl> { - return stdx::make_unique<DatabaseImpl>(this_, opCtx, name, dbEntry); -} - namespace { +MONGO_INITIALIZER(InitializeDatabaseFactory)(InitializerContext* const) { + Database::registerFactory([](Database* const this_, + OperationContext* const opCtx, + const StringData name, + DatabaseCatalogEntry* const dbEntry) { + return stdx::make_unique<DatabaseImpl>(this_, opCtx, name, dbEntry); + }); + return Status::OK(); +} MONGO_FP_DECLARE(hangBeforeLoggingCreateCollection); } // namespace @@ -866,7 +865,7 @@ void DatabaseImpl::dropDatabase(OperationContext* opCtx, Database* db) { Top::get(serviceContext).collectionDropped(coll->ns().ns(), true); } - DatabaseHolder::getDatabaseHolder().close(opCtx, name, "database dropped"); + dbHolder().close(opCtx, name, "database dropped"); auto const storageEngine = serviceContext->getGlobalStorageEngine(); writeConflictRetry(opCtx, "dropDatabase", name, [&] { @@ -896,7 +895,7 @@ StatusWith<NamespaceString> DatabaseImpl::makeUniqueCollectionNamespace( if (!_uniqueCollectionNamespacePseudoRandom) { _uniqueCollectionNamespacePseudoRandom = - std::make_unique<PseudoRandom>(Date_t::now().asInt64()); + stdx::make_unique<PseudoRandom>(Date_t::now().asInt64()); } const auto charsToChooseFrom = @@ -936,19 +935,60 @@ StatusWith<NamespaceString> DatabaseImpl::makeUniqueCollectionNamespace( << " attempts due to namespace conflicts with existing collections."); } -MONGO_REGISTER_SHIM(Database::dropDatabase)(OperationContext* opCtx, Database* db)->void { - return DatabaseImpl::dropDatabase(opCtx, db); +namespace { +MONGO_INITIALIZER(InitializeDropDatabaseImpl)(InitializerContext* const) { + Database::registerDropDatabaseImpl(DatabaseImpl::dropDatabase); + return Status::OK(); +} +MONGO_INITIALIZER(InitializeUserCreateNSImpl)(InitializerContext* const) { + registerUserCreateNSImpl(userCreateNSImpl); + return Status::OK(); +} + +MONGO_INITIALIZER(InitializeDropAllDatabasesExceptLocalImpl)(InitializerContext* const) { + registerDropAllDatabasesExceptLocalImpl(dropAllDatabasesExceptLocalImpl); + return Status::OK(); } +} // namespace +} // namespace mongo + +void mongo::dropAllDatabasesExceptLocalImpl(OperationContext* opCtx) { + Lock::GlobalWrite lk(opCtx); + + vector<string> n; + StorageEngine* storageEngine = opCtx->getServiceContext()->getGlobalStorageEngine(); + storageEngine->listDatabases(&n); + + if (n.size() == 0) + return; + log() << "dropAllDatabasesExceptLocal " << n.size(); + + repl::ReplicationCoordinator::get(opCtx)->dropAllSnapshots(); + + for (const auto& dbName : n) { + if (dbName != "local") { + writeConflictRetry(opCtx, "dropAllDatabasesExceptLocal", dbName, [&opCtx, &dbName] { + Database* db = dbHolder().get(opCtx, dbName); -MONGO_REGISTER_SHIM(Database::userCreateNS) -(OperationContext* opCtx, - Database* db, - StringData ns, - BSONObj options, - CollectionOptions::ParseKind parseKind, - bool createDefaultIndexes, - const BSONObj& idIndex) - ->Status { + // This is needed since dropDatabase can't be rolled back. + // This is safe be replaced by "invariant(db);dropDatabase(opCtx, db);" once fixed + if (db == nullptr) { + log() << "database disappeared after listDatabases but before drop: " << dbName; + } else { + DatabaseImpl::dropDatabase(opCtx, db); + } + }); + } + } +} + +auto mongo::userCreateNSImpl(OperationContext* opCtx, + Database* db, + StringData ns, + BSONObj options, + CollectionOptions::ParseKind parseKind, + bool createDefaultIndexes, + const BSONObj& idIndex) -> Status { invariant(db); LOG(1) << "create collection " << ns << ' ' << options; @@ -1047,34 +1087,3 @@ MONGO_REGISTER_SHIM(Database::userCreateNS) return Status::OK(); } - -MONGO_REGISTER_SHIM(Database::dropAllDatabasesExceptLocal)(OperationContext* opCtx)->void { - Lock::GlobalWrite lk(opCtx); - - vector<string> n; - StorageEngine* storageEngine = opCtx->getServiceContext()->getGlobalStorageEngine(); - storageEngine->listDatabases(&n); - - if (n.size() == 0) - return; - log() << "dropAllDatabasesExceptLocal " << n.size(); - - repl::ReplicationCoordinator::get(opCtx)->dropAllSnapshots(); - - for (const auto& dbName : n) { - if (dbName != "local") { - writeConflictRetry(opCtx, "dropAllDatabasesExceptLocal", dbName, [&opCtx, &dbName] { - Database* db = DatabaseHolder::getDatabaseHolder().get(opCtx, dbName); - - // This is needed since dropDatabase can't be rolled back. - // This is safe be replaced by "invariant(db);dropDatabase(opCtx, db);" once fixed - if (db == nullptr) { - log() << "database disappeared after listDatabases but before drop: " << dbName; - } else { - DatabaseImpl::dropDatabase(opCtx, db); - } - }); - } - } -} -} // namespace mongo |