diff options
Diffstat (limited to 'src/mongo/db/service_context_d_test_fixture.cpp')
-rw-r--r-- | src/mongo/db/service_context_d_test_fixture.cpp | 91 |
1 files changed, 29 insertions, 62 deletions
diff --git a/src/mongo/db/service_context_d_test_fixture.cpp b/src/mongo/db/service_context_d_test_fixture.cpp index ae0e39a2ab4..3ae23161235 100644 --- a/src/mongo/db/service_context_d_test_fixture.cpp +++ b/src/mongo/db/service_context_d_test_fixture.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2016 MongoDB Inc. + * Copyright (C) 2016-2018 MongoDB Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, @@ -30,48 +30,40 @@ #include "mongo/db/service_context_d_test_fixture.h" +#include <memory> + #include "mongo/base/checked_cast.h" -#include "mongo/db/catalog/database.h" -#include "mongo/db/catalog/database_holder.h" +#include "mongo/db/catalog/catalog_control.h" #include "mongo/db/catalog/uuid_catalog.h" -#include "mongo/db/client.h" -#include "mongo/db/concurrency/write_conflict_exception.h" -#include "mongo/db/curop.h" -#include "mongo/db/db_raii.h" +#include "mongo/db/concurrency/d_concurrency.h" #include "mongo/db/logical_clock.h" -#include "mongo/db/op_observer_noop.h" #include "mongo/db/op_observer_registry.h" -#include "mongo/db/service_context_d.h" +#include "mongo/db/service_entry_point_mongod.h" #include "mongo/db/storage/storage_engine_init.h" #include "mongo/db/storage/storage_options.h" -#include "mongo/stdx/memory.h" #include "mongo/unittest/temp_dir.h" #include "mongo/util/assert_util.h" -#include "mongo/util/scopeguard.h" namespace mongo { -void ServiceContextMongoDTest::setUp() { - Test::setUp(); - Client::initThread(getThreadName()); +ServiceContextMongoDTest::ServiceContextMongoDTest() + : ServiceContextMongoDTest("ephemeralForTest") {} - auto const serviceContext = getServiceContext(); +ServiceContextMongoDTest::ServiceContextMongoDTest(std::string engine) { - auto logicalClock = stdx::make_unique<LogicalClock>(serviceContext); + _stashedStorageParams.engine = std::exchange(storageGlobalParams.engine, std::move(engine)); + _stashedStorageParams.engineSetByUser = + std::exchange(storageGlobalParams.engineSetByUser, true); + + auto const serviceContext = getServiceContext(); + serviceContext->setServiceEntryPoint(std::make_unique<ServiceEntryPointMongod>(serviceContext)); + auto logicalClock = std::make_unique<LogicalClock>(serviceContext); LogicalClock::set(serviceContext, std::move(logicalClock)); - if (!serviceContext->getStorageEngine()) { - // When using the "ephemeralForTest" storage engine, it is fine for the temporary directory - // to go away after the global storage engine is initialized. - unittest::TempDir tempDir("service_context_d_test_fixture"); - storageGlobalParams.dbpath = tempDir.path(); - storageGlobalParams.engine = "ephemeralForTest"; - storageGlobalParams.engineSetByUser = true; + unittest::TempDir tempDir("service_context_d_test_fixture"); + storageGlobalParams.dbpath = tempDir.path(); - createLockFile(serviceContext); - initializeStorageEngine(serviceContext, StorageEngineInitFlags::kNone); - serviceContext->setOpObserver(stdx::make_unique<OpObserverNoop>()); - } + initializeStorageEngine(serviceContext, StorageEngineInitFlags::kNone); // Set up UUID Catalog observer. This is necessary because the Collection destructor contains an // invariant to ensure the UUID corresponding to that Collection object is no longer associated @@ -79,44 +71,19 @@ void ServiceContextMongoDTest::setUp() { // directly in certain code paths, but they can only be removed from the UUIDCatalog via a // UUIDCatalogObserver. It is therefore necessary to install the observer to ensure the // invariant in the Collection destructor is not triggered. - auto observerRegistry = stdx::make_unique<OpObserverRegistry>(); - observerRegistry->addObserver(stdx::make_unique<UUIDCatalogObserver>()); - serviceContext->setOpObserver(std::unique_ptr<OpObserver>(observerRegistry.release())); -} - -void ServiceContextMongoDTest::tearDown() { - ON_BLOCK_EXIT([&] { Client::destroy(); }); - auto opCtx = cc().makeOperationContext(); - _dropAllDBs(opCtx.get()); - Test::tearDown(); + auto observerRegistry = checked_cast<OpObserverRegistry*>(serviceContext->getOpObserver()); + observerRegistry->addObserver(std::make_unique<UUIDCatalogObserver>()); } -ServiceContext* ServiceContextMongoDTest::getServiceContext() { - return getGlobalServiceContext(); -} - -void ServiceContextMongoDTest::_doTest() { - MONGO_UNREACHABLE; -} - -void ServiceContextMongoDTest::_dropAllDBs(OperationContext* opCtx) { - Database::dropAllDatabasesExceptLocal(opCtx); - - Lock::GlobalWrite lk(opCtx); - AutoGetDb autoDBLocal(opCtx, "local", MODE_X); - const auto localDB = autoDBLocal.getDb(); - if (localDB) { - writeConflictRetry(opCtx, "_dropAllDBs", "local", [&] { - // Do not wrap in a WriteUnitOfWork until SERVER-17103 is addressed. - autoDBLocal.getDb()->dropDatabase(opCtx, localDB); - }); +ServiceContextMongoDTest::~ServiceContextMongoDTest() { + { + auto opCtx = getClient()->makeOperationContext(); + Lock::GlobalLock glk(opCtx.get(), MODE_X); + catalog::closeCatalog(opCtx.get()); } - - // Database::dropAllDatabasesExceptLocal() does not close empty databases. However the holder - // still allocates resources to track these empty databases. These resources not released by - // Database::dropAllDatabasesExceptLocal() will be leaked at exit unless we call - // DatabaseHolder::closeAll. - DatabaseHolder::getDatabaseHolder().closeAll(opCtx, "all databases dropped"); + shutdownGlobalStorageEngineCleanly(getGlobalServiceContext()); + std::swap(storageGlobalParams.engine, _stashedStorageParams.engine); + std::swap(storageGlobalParams.engineSetByUser, _stashedStorageParams.engineSetByUser); } } // namespace mongo |