diff options
author | Spencer T Brody <spencer@mongodb.com> | 2015-08-19 16:46:53 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2015-08-25 12:56:27 -0400 |
commit | eb0430ee860d22b164cd603ce7186842f72c8537 (patch) | |
tree | 86064e9a015fa76e537eba6640dc6e37da0067f5 /src/mongo | |
parent | 0931a7e2eff3fcb6c8b06b0649069fbb625d05ae (diff) | |
download | mongo-eb0430ee860d22b164cd603ce7186842f72c8537.tar.gz |
SERVER-19875 Make (almost) all CatalogManager methods take OperationContext
Diffstat (limited to 'src/mongo')
46 files changed, 841 insertions, 513 deletions
diff --git a/src/mongo/db/auth/authz_manager_external_state_s.cpp b/src/mongo/db/auth/authz_manager_external_state_s.cpp index ecb2d014c4f..df94ff8bcc2 100644 --- a/src/mongo/db/auth/authz_manager_external_state_s.cpp +++ b/src/mongo/db/auth/authz_manager_external_state_s.cpp @@ -69,8 +69,8 @@ Status AuthzManagerExternalStateMongos::getStoredAuthorizationVersion(OperationC // that runs this command BSONObj getParameterCmd = BSON("getParameter" << 1 << authSchemaVersionServerParameter << 1); BSONObjBuilder builder; - const bool ok = - grid.catalogManager(txn)->runUserManagementReadCommand("admin", getParameterCmd, &builder); + const bool ok = grid.catalogManager(txn) + ->runUserManagementReadCommand(txn, "admin", getParameterCmd, &builder); BSONObj cmdResult = builder.obj(); if (!ok) { return Command::getStatusFromCommandResult(cmdResult); @@ -95,8 +95,8 @@ Status AuthzManagerExternalStateMongos::getUserDescription(OperationContext* txn << userName.getDB())) << "showPrivileges" << true << "showCredentials" << true); BSONObjBuilder builder; - const bool ok = - grid.catalogManager(txn)->runUserManagementReadCommand("admin", usersInfoCmd, &builder); + const bool ok = grid.catalogManager(txn) + ->runUserManagementReadCommand(txn, "admin", usersInfoCmd, &builder); BSONObj cmdResult = builder.obj(); if (!ok) { return Command::getStatusFromCommandResult(cmdResult); @@ -126,8 +126,8 @@ Status AuthzManagerExternalStateMongos::getRoleDescription(OperationContext* txn << roleName.getRole() << AuthorizationManager::ROLE_DB_FIELD_NAME << roleName.getDB())) << "showPrivileges" << showPrivileges); BSONObjBuilder builder; - const bool ok = - grid.catalogManager(txn)->runUserManagementReadCommand("admin", rolesInfoCmd, &builder); + const bool ok = grid.catalogManager(txn) + ->runUserManagementReadCommand(txn, "admin", rolesInfoCmd, &builder); BSONObj cmdResult = builder.obj(); if (!ok) { return Command::getStatusFromCommandResult(cmdResult); @@ -156,7 +156,7 @@ Status AuthzManagerExternalStateMongos::getRoleDescriptionsForDB(OperationContex << "showBuiltinRoles" << showBuiltinRoles); BSONObjBuilder builder; const bool ok = - grid.catalogManager(txn)->runUserManagementReadCommand(dbname, rolesInfoCmd, &builder); + grid.catalogManager(txn)->runUserManagementReadCommand(txn, dbname, rolesInfoCmd, &builder); BSONObj cmdResult = builder.obj(); if (!ok) { return Command::getStatusFromCommandResult(cmdResult); @@ -170,8 +170,8 @@ Status AuthzManagerExternalStateMongos::getRoleDescriptionsForDB(OperationContex bool AuthzManagerExternalStateMongos::hasAnyPrivilegeDocuments(OperationContext* txn) { BSONObj usersInfoCmd = BSON("usersInfo" << 1); BSONObjBuilder builder; - const bool ok = - grid.catalogManager(txn)->runUserManagementReadCommand("admin", usersInfoCmd, &builder); + const bool ok = grid.catalogManager(txn) + ->runUserManagementReadCommand(txn, "admin", usersInfoCmd, &builder); if (!ok) { // If we were unable to complete the query, // it's best to assume that there _are_ privilege documents. This might happen diff --git a/src/mongo/db/auth/user_cache_invalidator_job.cpp b/src/mongo/db/auth/user_cache_invalidator_job.cpp index 8ad27ca4484..7de2fb1a1d9 100644 --- a/src/mongo/db/auth/user_cache_invalidator_job.cpp +++ b/src/mongo/db/auth/user_cache_invalidator_job.cpp @@ -92,7 +92,7 @@ StatusWith<OID> getCurrentCacheGeneration(OperationContext* txn) { try { BSONObjBuilder result; const bool ok = grid.catalogManager(txn)->runUserManagementReadCommand( - "admin", BSON("_getUserCacheGeneration" << 1), &result); + txn, "admin", BSON("_getUserCacheGeneration" << 1), &result); if (!ok) { return Command::getStatusFromCommandResult(result.obj()); } diff --git a/src/mongo/db/instance.cpp b/src/mongo/db/instance.cpp index f103b0b1bae..c79bdf1d7d0 100644 --- a/src/mongo/db/instance.cpp +++ b/src/mongo/db/instance.cpp @@ -1170,7 +1170,7 @@ void exitCleanly(ExitCode code) { auto catalogMgr = grid.catalogManager(txn); if (catalogMgr) { - catalogMgr->shutDown(); + catalogMgr->shutDown(txn); } // We should always be able to acquire the global lock at shutdown. diff --git a/src/mongo/db/s/collection_metadata_test.cpp b/src/mongo/db/s/collection_metadata_test.cpp index 607002edfe6..2d2d70e519e 100644 --- a/src/mongo/db/s/collection_metadata_test.cpp +++ b/src/mongo/db/s/collection_metadata_test.cpp @@ -32,6 +32,7 @@ #include <vector> #include "mongo/db/jsobj.h" +#include "mongo/db/operation_context_noop.h" #include "mongo/db/s/collection_metadata.h" #include "mongo/db/s/metadata_loader.h" #include "mongo/dbtests/mock/mock_conn_registry.h" @@ -56,6 +57,7 @@ const std::string CONFIG_HOST_PORT = "$dummy_config:27017"; class NoChunkFixture : public mongo::unittest::Test { protected: void setUp() { + OperationContextNoop txn; _dummyConfig.reset(new MockRemoteDBServer(CONFIG_HOST_PORT)); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(_dummyConfig.get()); @@ -92,7 +94,7 @@ protected: MetadataLoader loader; Status status = loader.makeCollectionMetadata( - &catalogManager, "test.foo", "shard0000", NULL, &_metadata); + &txn, &catalogManager, "test.foo", "shard0000", NULL, &_metadata); ASSERT_OK(status); ASSERT_EQUALS(0u, _metadata.getNumChunks()); } @@ -446,6 +448,7 @@ TEST_F(NoChunkFixture, PendingOrphanedDataRanges) { class SingleChunkFixture : public mongo::unittest::Test { protected: void setUp() { + OperationContextNoop txn; _dummyConfig.reset(new MockRemoteDBServer(CONFIG_HOST_PORT)); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(_dummyConfig.get()); @@ -476,7 +479,7 @@ protected: MetadataLoader loader; Status status = loader.makeCollectionMetadata( - &catalogManager, "test.foo", "shard0000", NULL, &_metadata); + &txn, &catalogManager, "test.foo", "shard0000", NULL, &_metadata); ASSERT_OK(status); } @@ -760,6 +763,7 @@ TEST_F(SingleChunkFixture, ChunkOrphanedDataRanges) { class SingleChunkMinMaxCompoundKeyFixture : public mongo::unittest::Test { protected: void setUp() { + OperationContextNoop txn; _dummyConfig.reset(new MockRemoteDBServer(CONFIG_HOST_PORT)); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(_dummyConfig.get()); @@ -790,7 +794,7 @@ protected: MetadataLoader loader; Status status = loader.makeCollectionMetadata( - &catalogManager, "test.foo", "shard0000", NULL, &_metadata); + &txn, &catalogManager, "test.foo", "shard0000", NULL, &_metadata); ASSERT_OK(status); } @@ -824,6 +828,7 @@ TEST_F(SingleChunkMinMaxCompoundKeyFixture, CompoudKeyBelongsToMe) { class TwoChunksWithGapCompoundKeyFixture : public mongo::unittest::Test { protected: void setUp() { + OperationContextNoop txn; _dummyConfig.reset(new MockRemoteDBServer(CONFIG_HOST_PORT)); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(_dummyConfig.get()); @@ -864,7 +869,7 @@ protected: MetadataLoader loader; Status status = loader.makeCollectionMetadata( - &catalogManager, "test.foo", "shard0000", NULL, &_metadata); + &txn, &catalogManager, "test.foo", "shard0000", NULL, &_metadata); ASSERT_OK(status); } @@ -1074,6 +1079,7 @@ TEST_F(TwoChunksWithGapCompoundKeyFixture, ChunkGapAndPendingOrphanedDataRanges) class ThreeChunkWithRangeGapFixture : public mongo::unittest::Test { protected: void setUp() { + OperationContextNoop txn; _dummyConfig.reset(new MockRemoteDBServer(CONFIG_HOST_PORT)); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(_dummyConfig.get()); @@ -1133,7 +1139,7 @@ protected: MetadataLoader loader; Status status = loader.makeCollectionMetadata( - &catalogManager, "test.foo", "shard0000", NULL, &_metadata); + &txn, &catalogManager, "test.foo", "shard0000", NULL, &_metadata); ASSERT_OK(status); } diff --git a/src/mongo/db/s/metadata_loader.cpp b/src/mongo/db/s/metadata_loader.cpp index 52c25854810..b6a5aee155e 100644 --- a/src/mongo/db/s/metadata_loader.cpp +++ b/src/mongo/db/s/metadata_loader.cpp @@ -92,24 +92,26 @@ MetadataLoader::MetadataLoader() = default; MetadataLoader::~MetadataLoader() = default; -Status MetadataLoader::makeCollectionMetadata(CatalogManager* catalogManager, +Status MetadataLoader::makeCollectionMetadata(OperationContext* txn, + CatalogManager* catalogManager, const string& ns, const string& shard, const CollectionMetadata* oldMetadata, CollectionMetadata* metadata) const { - Status status = _initCollection(catalogManager, ns, shard, metadata); + Status status = _initCollection(txn, catalogManager, ns, shard, metadata); if (!status.isOK() || metadata->getKeyPattern().isEmpty()) { return status; } - return initChunks(catalogManager, ns, shard, oldMetadata, metadata); + return initChunks(txn, catalogManager, ns, shard, oldMetadata, metadata); } -Status MetadataLoader::_initCollection(CatalogManager* catalogManager, +Status MetadataLoader::_initCollection(OperationContext* txn, + CatalogManager* catalogManager, const string& ns, const string& shard, CollectionMetadata* metadata) const { - auto coll = catalogManager->getCollection(ns); + auto coll = catalogManager->getCollection(txn, ns); if (!coll.isOK()) { return coll.getStatus(); } @@ -129,7 +131,8 @@ Status MetadataLoader::_initCollection(CatalogManager* catalogManager, return Status::OK(); } -Status MetadataLoader::initChunks(CatalogManager* catalogManager, +Status MetadataLoader::initChunks(OperationContext* txn, + CatalogManager* catalogManager, const string& ns, const string& shard, const CollectionMetadata* oldMetadata, @@ -175,7 +178,7 @@ Status MetadataLoader::initChunks(CatalogManager* catalogManager, std::vector<ChunkType> chunks; const auto diffQuery = differ.configDiffQuery(); Status status = catalogManager->getChunks( - diffQuery.query, diffQuery.sort, boost::none, &chunks, nullptr); + txn, diffQuery.query, diffQuery.sort, boost::none, &chunks, nullptr); if (!status.isOK()) { if (status == ErrorCodes::HostUnreachable) { // Make our metadata invalid diff --git a/src/mongo/db/s/metadata_loader.h b/src/mongo/db/s/metadata_loader.h index 15ca227926e..ef7048f2fc6 100644 --- a/src/mongo/db/s/metadata_loader.h +++ b/src/mongo/db/s/metadata_loader.h @@ -40,6 +40,7 @@ class CatalogManager; class CollectionMetadata; class CollectionType; class DBClientCursor; +class OperationContext; /** * The MetadataLoader is responsible for interfacing with the config servers and previous @@ -89,7 +90,8 @@ public: * @return HostUnreachable if there was an error contacting the config servers * @return RemoteChangeDetected if the data loaded was modified by another operation */ - Status makeCollectionMetadata(CatalogManager* catalogManager, + Status makeCollectionMetadata(OperationContext* txn, + CatalogManager* catalogManager, const std::string& ns, const std::string& shard, const CollectionMetadata* oldMetadata, @@ -131,7 +133,8 @@ private: * @return RemoteChangeDetected if the collection doc loaded is unexpectedly different * */ - Status _initCollection(CatalogManager* catalogManager, + Status _initCollection(OperationContext* txn, + CatalogManager* catalogManager, const std::string& ns, const std::string& shard, CollectionMetadata* metadata) const; @@ -149,7 +152,8 @@ private: * @return NamespaceNotFound if there are no chunks loaded and an epoch change is detected * TODO: @return FailedToParse */ - Status initChunks(CatalogManager* catalogManager, + Status initChunks(OperationContext* txn, + CatalogManager* catalogManager, const std::string& ns, const std::string& shard, const CollectionMetadata* oldMetadata, diff --git a/src/mongo/db/s/metadata_loader_test.cpp b/src/mongo/db/s/metadata_loader_test.cpp index 2d2adb706f2..2e409a5ac42 100644 --- a/src/mongo/db/s/metadata_loader_test.cpp +++ b/src/mongo/db/s/metadata_loader_test.cpp @@ -35,6 +35,7 @@ #include "mongo/client/connpool.h" #include "mongo/client/dbclientinterface.h" #include "mongo/db/jsobj.h" +#include "mongo/db/operation_context_noop.h" #include "mongo/db/s/collection_metadata.h" #include "mongo/db/s/metadata_loader.h" #include "mongo/dbtests/mock/mock_conn_registry.h" @@ -77,6 +78,7 @@ private: TEST_F(MetadataLoaderFixture, DroppedColl) { + OperationContextNoop txn; MockRemoteDBServer dummyConfig(CONFIG_HOST_PORT); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(&dummyConfig); @@ -95,7 +97,8 @@ TEST_F(MetadataLoaderFixture, DroppedColl) { string errmsg; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -108,6 +111,7 @@ TEST_F(MetadataLoaderFixture, DroppedColl) { } TEST_F(MetadataLoaderFixture, EmptyColl) { + OperationContextNoop txn; MockRemoteDBServer dummyConfig(CONFIG_HOST_PORT); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(&dummyConfig); @@ -116,7 +120,8 @@ TEST_F(MetadataLoaderFixture, EmptyColl) { string errmsg; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -129,6 +134,7 @@ TEST_F(MetadataLoaderFixture, EmptyColl) { } TEST_F(MetadataLoaderFixture, BadColl) { + OperationContextNoop txn; MockRemoteDBServer dummyConfig(CONFIG_HOST_PORT); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(&dummyConfig); @@ -139,7 +145,8 @@ TEST_F(MetadataLoaderFixture, BadColl) { string errmsg; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -152,6 +159,7 @@ TEST_F(MetadataLoaderFixture, BadColl) { } TEST_F(MetadataLoaderFixture, BadChunk) { + OperationContextNoop txn; MockRemoteDBServer dummyConfig(CONFIG_HOST_PORT); mongo::ConnectionString::setConnectionHook(MockConnRegistry::get()->getConnStrHook()); MockConnRegistry::get()->addServer(&dummyConfig); @@ -176,7 +184,8 @@ TEST_F(MetadataLoaderFixture, BadChunk) { string errmsg; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -218,10 +227,12 @@ private: }; TEST_F(NoChunkFixture, NoChunksIsDropped) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -280,10 +291,12 @@ private: }; TEST_F(NoChunkHereFixture, CheckNumChunk) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -348,9 +361,11 @@ private: }; TEST_F(ConfigServerFixture, SingleChunkCheckNumChunk) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -360,9 +375,11 @@ TEST_F(ConfigServerFixture, SingleChunkCheckNumChunk) { } TEST_F(ConfigServerFixture, SingleChunkGetNext) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - loader.makeCollectionMetadata(catalogManager(), + loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -372,9 +389,11 @@ TEST_F(ConfigServerFixture, SingleChunkGetNext) { } TEST_F(ConfigServerFixture, SingleChunkGetShardKey) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - loader.makeCollectionMetadata(catalogManager(), + loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -383,9 +402,11 @@ TEST_F(ConfigServerFixture, SingleChunkGetShardKey) { } TEST_F(ConfigServerFixture, SingleChunkGetMaxCollVersion) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - loader.makeCollectionMetadata(catalogManager(), + loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -395,9 +416,11 @@ TEST_F(ConfigServerFixture, SingleChunkGetMaxCollVersion) { } TEST_F(ConfigServerFixture, SingleChunkGetMaxShardVersion) { + OperationContextNoop txn; MetadataLoader loader; CollectionMetadata metadata; - loader.makeCollectionMetadata(catalogManager(), + loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -407,11 +430,13 @@ TEST_F(ConfigServerFixture, SingleChunkGetMaxShardVersion) { } TEST_F(ConfigServerFixture, NoChunks) { + OperationContextNoop txn; getConfigServer()->remove(ChunkType::ConfigNS, BSONObj()); MetadataLoader loader; CollectionMetadata metadata; - Status status = loader.makeCollectionMetadata(catalogManager(), + Status status = loader.makeCollectionMetadata(&txn, + catalogManager(), "test.foo", "shard0000", NULL, /* no old metadata */ @@ -439,7 +464,9 @@ protected: return *_loader; } - void getMetadataFor(const OwnedPointerVector<ChunkType>& chunks, CollectionMetadata* metadata) { + void getMetadataFor(OperationContext* txn, + const OwnedPointerVector<ChunkType>& chunks, + CollectionMetadata* metadata) { // Infer namespace, shard, epoch, keypattern from first chunk const ChunkType* firstChunk = *(chunks.vector().begin()); @@ -481,7 +508,7 @@ protected: } Status status = - loader().makeCollectionMetadata(catalogManager(), ns, shardName, NULL, metadata); + loader().makeCollectionMetadata(txn, catalogManager(), ns, shardName, NULL, metadata); ASSERT(status.isOK()); } @@ -495,6 +522,7 @@ private: }; TEST_F(MultipleMetadataFixture, PromotePendingNA) { + OperationContextNoop txn; unique_ptr<ChunkType> chunk(new ChunkType()); chunk->setNS("foo.bar"); chunk->setShard("shard0000"); @@ -506,13 +534,13 @@ TEST_F(MultipleMetadataFixture, PromotePendingNA) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata afterMetadata; - getMetadataFor(chunks, &afterMetadata); + getMetadataFor(&txn, chunks, &afterMetadata); // Metadata of different epoch (*chunks.vector().begin())->setVersion(ChunkVersion(1, 0, OID::gen())); CollectionMetadata remoteMetadata; - getMetadataFor(chunks, &remoteMetadata); + getMetadataFor(&txn, chunks, &remoteMetadata); Status status = loader().promotePendingChunks(&afterMetadata, &remoteMetadata); ASSERT(status.isOK()); @@ -531,6 +559,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingNA) { } TEST_F(MultipleMetadataFixture, PromotePendingNAVersion) { + OperationContextNoop txn; OID epoch = OID::gen(); unique_ptr<ChunkType> chunk(new ChunkType()); @@ -544,13 +573,13 @@ TEST_F(MultipleMetadataFixture, PromotePendingNAVersion) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata afterMetadata; - getMetadataFor(chunks, &afterMetadata); + getMetadataFor(&txn, chunks, &afterMetadata); // Metadata of same epoch, but lower version (*chunks.vector().begin())->setVersion(ChunkVersion(1, 0, epoch)); CollectionMetadata remoteMetadata; - getMetadataFor(chunks, &remoteMetadata); + getMetadataFor(&txn, chunks, &remoteMetadata); Status status = loader().promotePendingChunks(&afterMetadata, &remoteMetadata); ASSERT(status.isOK()); @@ -569,6 +598,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingNAVersion) { } TEST_F(MultipleMetadataFixture, PromotePendingGoodOverlap) { + OperationContextNoop txn; OID epoch = OID::gen(); // @@ -600,7 +630,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingGoodOverlap) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata remoteMetadata; - getMetadataFor(chunks, &remoteMetadata); + getMetadataFor(&txn, chunks, &remoteMetadata); // // Setup chunk and pending range for afterMetadata @@ -618,7 +648,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingGoodOverlap) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata afterMetadata; - getMetadataFor(chunks, &afterMetadata); + getMetadataFor(&txn, chunks, &afterMetadata); string errMsg; ChunkType pending; @@ -654,6 +684,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingGoodOverlap) { } TEST_F(MultipleMetadataFixture, PromotePendingBadOverlap) { + OperationContextNoop txn; OID epoch = OID::gen(); // @@ -672,7 +703,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingBadOverlap) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata remoteMetadata; - getMetadataFor(chunks, &remoteMetadata); + getMetadataFor(&txn, chunks, &remoteMetadata); // // Setup chunk and pending range for afterMetadata @@ -690,7 +721,7 @@ TEST_F(MultipleMetadataFixture, PromotePendingBadOverlap) { chunks.mutableVector().push_back(chunk.release()); CollectionMetadata afterMetadata; - getMetadataFor(chunks, &afterMetadata); + getMetadataFor(&txn, chunks, &afterMetadata); string errMsg; ChunkType pending; diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp index 5a39473a7de..d5f5517511d 100644 --- a/src/mongo/db/s/migration_destination_manager.cpp +++ b/src/mongo/db/s/migration_destination_manager.cpp @@ -955,8 +955,11 @@ MoveTimingHelper::~MoveTimingHelper() { _b.append("errmsg", *_cmdErrmsg); } - grid.catalogManager(_txn)->logChange( - _txn->getClient()->clientAddress(true), (string) "moveChunk." + _where, _ns, _b.obj()); + grid.catalogManager(_txn)->logChange(_txn, + _txn->getClient()->clientAddress(true), + (string) "moveChunk." + _where, + _ns, + _b.obj()); } catch (const std::exception& e) { warning() << "couldn't record timing for moveChunk '" << _where << "': " << e.what() << migrateLog; diff --git a/src/mongo/db/s/sharding_state.cpp b/src/mongo/db/s/sharding_state.cpp index ed832adbf2b..90b1a83af2a 100644 --- a/src/mongo/db/s/sharding_state.cpp +++ b/src/mongo/db/s/sharding_state.cpp @@ -557,7 +557,8 @@ Status ShardingState::doRefreshMetadata(OperationContext* txn, long long refreshMillis; { - Status status = mdLoader.makeCollectionMetadata(grid.catalogManager(txn), + Status status = mdLoader.makeCollectionMetadata(txn, + grid.catalogManager(txn), ns, getShardName(), fullReload ? NULL : beforeMetadata.get(), diff --git a/src/mongo/dbtests/config_upgrade_tests.cpp b/src/mongo/dbtests/config_upgrade_tests.cpp index d807fa83af0..88db3071a1a 100644 --- a/src/mongo/dbtests/config_upgrade_tests.cpp +++ b/src/mongo/dbtests/config_upgrade_tests.cpp @@ -221,7 +221,7 @@ TEST_F(ConfigUpgradeTests, InitialUpgrade) { // string errMsg; - ASSERT_OK(grid.catalogManager(&_txn)->initConfigVersion()); + ASSERT_OK(grid.catalogManager(&_txn)->initConfigVersion(&_txn)); VersionType version; ASSERT_OK(getConfigVersion(grid.catalogManager(&_txn), &version)); @@ -242,7 +242,7 @@ TEST_F(ConfigUpgradeTests, BadVersionUpgrade) { // Default version (not upgradeable) ASSERT_EQ(ErrorCodes::IncompatibleShardingMetadata, - grid.catalogManager(&_txn)->initConfigVersion()); + grid.catalogManager(&_txn)->initConfigVersion(&_txn)); } } // namespace diff --git a/src/mongo/s/balance.cpp b/src/mongo/s/balance.cpp index ff3a454fc4f..d9234b7f116 100644 --- a/src/mongo/s/balance.cpp +++ b/src/mongo/s/balance.cpp @@ -89,7 +89,7 @@ int Balancer::_moveChunks(OperationContext* txn, // If the balancer was disabled since we started this round, don't start new chunks // moves. const auto balSettingsResult = - grid.catalogManager(txn)->getGlobalSettings(SettingsType::BalancerDocKey); + grid.catalogManager(txn)->getGlobalSettings(txn, SettingsType::BalancerDocKey); const bool isBalSettingsAbsent = balSettingsResult.getStatus() == ErrorCodes::NoMatchingDocument; @@ -204,7 +204,8 @@ void Balancer::_ping(OperationContext* txn, bool waiting) { mType.setWaiting(waiting); mType.setMongoVersion(versionString); - grid.catalogManager(txn)->update(MongosType::ConfigNS, + grid.catalogManager(txn)->update(txn, + MongosType::ConfigNS, BSON(MongosType::name(_myid)), BSON("$set" << mType.toBSON()), true, @@ -288,7 +289,8 @@ void Balancer::_doBalanceRound(OperationContext* txn, invariant(candidateChunks); vector<CollectionType> collections; - Status collsStatus = grid.catalogManager(txn)->getCollections(nullptr, &collections, nullptr); + Status collsStatus = + grid.catalogManager(txn)->getCollections(txn, nullptr, &collections, nullptr); if (!collsStatus.isOK()) { warning() << "Failed to retrieve the set of collections during balancing round " << collsStatus; @@ -330,7 +332,8 @@ void Balancer::_doBalanceRound(OperationContext* txn, } std::vector<ChunkType> allNsChunks; - grid.catalogManager(txn)->getChunks(BSON(ChunkType::ns(nss.ns())), + grid.catalogManager(txn)->getChunks(txn, + BSON(ChunkType::ns(nss.ns())), BSON(ChunkType::min() << 1), boost::none, // all chunks &allNsChunks, @@ -366,7 +369,7 @@ void Balancer::_doBalanceRound(OperationContext* txn, { vector<TagsType> collectionTags; uassertStatusOK( - grid.catalogManager(txn)->getTagsForCollection(nss.ns(), &collectionTags)); + grid.catalogManager(txn)->getTagsForCollection(txn, nss.ns(), &collectionTags)); for (const auto& tt : collectionTags) { ranges.push_back( TagRange(tt.getMinKey().getOwned(), tt.getMaxKey().getOwned(), tt.getTag())); @@ -503,8 +506,8 @@ void Balancer::run() { // refresh chunk size (even though another balancer might be active) Chunk::refreshChunkSize(txn.get()); - auto balSettingsResult = - grid.catalogManager(txn.get())->getGlobalSettings(SettingsType::BalancerDocKey); + auto balSettingsResult = grid.catalogManager(txn.get())->getGlobalSettings( + txn.get(), SettingsType::BalancerDocKey); const bool isBalSettingsAbsent = balSettingsResult.getStatus() == ErrorCodes::NoMatchingDocument; if (!balSettingsResult.isOK() && !isBalSettingsAbsent) { @@ -529,8 +532,8 @@ void Balancer::run() { uassert(13258, "oids broken after resetting!", _checkOIDs()); { - auto scopedDistLock = - grid.catalogManager(txn.get())->distLock("balancer", "doing balance round"); + auto scopedDistLock = grid.catalogManager(txn.get()) + ->distLock(txn.get(), "balancer", "doing balance round"); if (!scopedDistLock.isOK()) { LOG(1) << "skipping balancing round" << causedBy(scopedDistLock.getStatus()); @@ -572,7 +575,7 @@ void Balancer::run() { _balancedLastTime); actionLog.setTime(jsTime()); - grid.catalogManager(txn.get())->logAction(actionLog); + grid.catalogManager(txn.get())->logAction(txn.get(), actionLog); LOG(1) << "*** end of balancing round"; } @@ -591,7 +594,7 @@ void Balancer::run() { actionLog.setDetails(string(e.what()), balanceRoundTimer.millis(), 0, 0); actionLog.setTime(jsTime()); - grid.catalogManager(txn.get())->logAction(actionLog); + grid.catalogManager(txn.get())->logAction(txn.get(), actionLog); // Sleep a fair amount before retrying because of the error sleepsecs(sleepTime); diff --git a/src/mongo/s/catalog/catalog_cache.cpp b/src/mongo/s/catalog/catalog_cache.cpp index cf062978991..50ab6539b80 100644 --- a/src/mongo/s/catalog/catalog_cache.cpp +++ b/src/mongo/s/catalog/catalog_cache.cpp @@ -55,7 +55,7 @@ StatusWith<shared_ptr<DBConfig>> CatalogCache::getDatabase(OperationContext* txn } // Need to load from the store - auto status = grid.catalogManager(txn)->getDatabase(dbName); + auto status = grid.catalogManager(txn)->getDatabase(txn, dbName); if (!status.isOK()) { return status.getStatus(); } diff --git a/src/mongo/s/catalog/catalog_manager.cpp b/src/mongo/s/catalog/catalog_manager.cpp index 9896b053a13..ca8585f8eec 100644 --- a/src/mongo/s/catalog/catalog_manager.cpp +++ b/src/mongo/s/catalog/catalog_manager.cpp @@ -74,7 +74,8 @@ Status getStatus(const BatchedCommandResponse& response) { } // namespace -Status CatalogManager::insert(const string& ns, +Status CatalogManager::insert(OperationContext* txn, + const string& ns, const BSONObj& doc, BatchedCommandResponse* response) { unique_ptr<BatchedInsertRequest> insert(new BatchedInsertRequest()); @@ -93,11 +94,12 @@ Status CatalogManager::insert(const string& ns, unique_ptr<BatchedCommandRequest> requestWithIds(BatchedCommandRequest::cloneWithIds(request)); const BatchedCommandRequest& requestToSend = requestWithIds.get() ? *requestWithIds : request; - writeConfigServerDirect(requestToSend, response); + writeConfigServerDirect(txn, requestToSend, response); return getStatus(*response); } -Status CatalogManager::update(const string& ns, +Status CatalogManager::update(OperationContext* txn, + const string& ns, const BSONObj& query, const BSONObj& update, bool upsert, @@ -121,11 +123,12 @@ Status CatalogManager::update(const string& ns, response = &dummyResponse; } - writeConfigServerDirect(request, response); + writeConfigServerDirect(txn, request, response); return getStatus(*response); } -Status CatalogManager::remove(const string& ns, +Status CatalogManager::remove(OperationContext* txn, + const string& ns, const BSONObj& query, int limit, BatchedCommandResponse* response) { @@ -145,7 +148,7 @@ Status CatalogManager::remove(const string& ns, response = &dummyResponse; } - writeConfigServerDirect(request, response); + writeConfigServerDirect(txn, request, response); return getStatus(*response); } diff --git a/src/mongo/s/catalog/catalog_manager.h b/src/mongo/s/catalog/catalog_manager.h index 1a0275ad708..8548368ed49 100644 --- a/src/mongo/s/catalog/catalog_manager.h +++ b/src/mongo/s/catalog/catalog_manager.h @@ -96,12 +96,12 @@ public: * Performs implementation-specific startup tasks. Must be run after the catalog manager * has been installed into the global 'grid' object. */ - virtual Status startup() = 0; + virtual Status startup(OperationContext* txn) = 0; /** * Performs necessary cleanup when shutting down cleanly. */ - virtual void shutDown(bool allowNetworking = true) = 0; + virtual void shutDown(OperationContext* txn, bool allowNetworking = true) = 0; /** * Returns what type of catalog manager this is - CSRS for the CatalogManagerReplicaSet and @@ -119,7 +119,7 @@ public: * - DatabaseDifferCase - database already exists, but with a different case * - ShardNotFound - could not find a shard to place the DB on */ - virtual Status enableSharding(const std::string& dbName) = 0; + virtual Status enableSharding(OperationContext* txn, const std::string& dbName) = 0; /** * Shards a collection. Assumes that the database is enabled for sharding. @@ -175,7 +175,9 @@ public: /** * Updates or creates the metadata for a given database. */ - virtual Status updateDatabase(const std::string& dbName, const DatabaseType& db) = 0; + virtual Status updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) = 0; /** * Retrieves the metadata for a given database, if it exists. @@ -187,12 +189,15 @@ public: * the failure. These are some of the known failures: * - DatabaseNotFound - database does not exist */ - virtual StatusWith<OpTimePair<DatabaseType>> getDatabase(const std::string& dbName) = 0; + virtual StatusWith<OpTimePair<DatabaseType>> getDatabase(OperationContext* txn, + const std::string& dbName) = 0; /** * Updates or creates the metadata for a given collection. */ - virtual Status updateCollection(const std::string& collNs, const CollectionType& coll) = 0; + virtual Status updateCollection(OperationContext* txn, + const std::string& collNs, + const CollectionType& coll) = 0; /** * Retrieves the metadata for a given collection, if it exists. @@ -204,7 +209,8 @@ public: * the failure. These are some of the known failures: * - NamespaceNotFound - collection does not exist */ - virtual StatusWith<OpTimePair<CollectionType>> getCollection(const std::string& collNs) = 0; + virtual StatusWith<OpTimePair<CollectionType>> getCollection(OperationContext* txn, + const std::string& collNs) = 0; /** * Retrieves all collections undera specified database (or in the system). @@ -218,7 +224,8 @@ public: * * Returns a !OK status if an error occurs. */ - virtual Status getCollections(const std::string* dbName, + virtual Status getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* optime) = 0; @@ -236,7 +243,8 @@ public: * * Returns a !OK status if an error occurs. */ - virtual Status getDatabasesForShard(const std::string& shardName, + virtual Status getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) = 0; /** @@ -252,7 +260,8 @@ public: * * Returns a !OK status if an error occurs. */ - virtual Status getChunks(const BSONObj& filter, + virtual Status getChunks(OperationContext* txn, + const BSONObj& filter, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, @@ -261,14 +270,16 @@ public: /** * Retrieves all tags for the specified collection. */ - virtual Status getTagsForCollection(const std::string& collectionNs, + virtual Status getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) = 0; /** * Retrieves the most appropriate tag, which overlaps with the specified chunk. If no tags * overlap, returns an empty string. */ - virtual StatusWith<std::string> getTagForChunk(const std::string& collectionNs, + virtual StatusWith<std::string> getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) = 0; /** @@ -287,7 +298,8 @@ public: * @param result: contains data returned from config servers * Returns true on success. */ - virtual bool runUserManagementWriteCommand(const std::string& commandName, + virtual bool runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) = 0; @@ -295,14 +307,16 @@ public: /** * Runs a read-only command on a config server. */ - virtual bool runReadCommand(const std::string& dbname, + virtual bool runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) = 0; /** * Runs a user management related read-only command on a config server. */ - virtual bool runUserManagementReadCommand(const std::string& dbname, + virtual bool runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) = 0; @@ -313,7 +327,8 @@ public: * @param updateOps: oplog entries to apply * @param preCondition: preconditions for applying oplog entries */ - virtual Status applyChunkOpsDeprecated(const BSONArray& updateOps, + virtual Status applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) = 0; /** @@ -322,7 +337,7 @@ public: * * NOTE: This method is best effort so it should never throw. */ - virtual void logAction(const ActionLogType& actionLog) = 0; + virtual void logAction(OperationContext* txn, const ActionLogType& actionLog) = 0; /** * Logs a diagnostic event locally and on the config server. @@ -334,7 +349,8 @@ public: * @param ns To which collection the metadata change is being applied * @param detail Additional info about the metadata change (not interpreted) */ - virtual void logChange(const std::string& clientAddress, + virtual void logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) = 0; @@ -348,7 +364,8 @@ public: * Returns ErrorCodes::FailedToParse if we encountered an error while parsing * the settings document. */ - virtual StatusWith<SettingsType> getGlobalSettings(const std::string& key) = 0; + virtual StatusWith<SettingsType> getGlobalSettings(OperationContext* txn, + const std::string& key) = 0; /** * Directly sends the specified command to the config server and returns the response. @@ -360,7 +377,8 @@ public: * @param request Request to be sent to the config server. * @param response Out parameter to receive the response. Can be nullptr. */ - virtual void writeConfigServerDirect(const BatchedCommandRequest& request, + virtual void writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) = 0; /** @@ -375,7 +393,7 @@ public: * - DatabaseDifferCase - database already exists, but with a different case * - ShardNotFound - could not find a shard to place the DB on */ - virtual Status createDatabase(const std::string& dbName) = 0; + virtual Status createDatabase(OperationContext* txn, const std::string& dbName) = 0; /** * Directly inserts a document in the specified namespace on the config server (only the @@ -387,7 +405,10 @@ public: * NOTE: Should not be used in new code. Instead add a new metadata operation to the * interface. */ - Status insert(const std::string& ns, const BSONObj& doc, BatchedCommandResponse* response); + Status insert(OperationContext* txn, + const std::string& ns, + const BSONObj& doc, + BatchedCommandResponse* response); /** * Updates a document in the specified namespace on the config server (only the config or @@ -398,7 +419,8 @@ public: * NOTE: Should not be used in new code. Instead add a new metadata operation to the * interface. */ - Status update(const std::string& ns, + Status update(OperationContext* txn, + const std::string& ns, const BSONObj& query, const BSONObj& update, bool upsert, @@ -414,7 +436,8 @@ public: * NOTE: Should not be used in new code. Instead add a new metadata operation to the * interface. */ - Status remove(const std::string& ns, + Status remove(OperationContext* txn, + const std::string& ns, const BSONObj& query, int limit, BatchedCommandResponse* response); @@ -423,7 +446,7 @@ public: * Performs the necessary checks for version compatibility and creates a new version document * if the current cluster config is empty. */ - virtual Status initConfigVersion() = 0; + virtual Status initConfigVersion(OperationContext* txn) = 0; protected: CatalogManager() = default; diff --git a/src/mongo/s/catalog/catalog_manager_common.cpp b/src/mongo/s/catalog/catalog_manager_common.cpp index da49f8fad0c..2d82b767c12 100644 --- a/src/mongo/s/catalog/catalog_manager_common.cpp +++ b/src/mongo/s/catalog/catalog_manager_common.cpp @@ -315,7 +315,7 @@ StatusWith<string> CatalogManagerCommon::addShard(OperationContext* txn, // Check that none of the existing shard candidate's dbs exist already for (const string& dbName : dbNamesStatus.getValue()) { - auto dbt = getDatabase(dbName); + auto dbt = getDatabase(txn, dbName); if (dbt.isOK()) { const auto& dbDoc = dbt.getValue().value; return Status(ErrorCodes::OperationFailed, @@ -344,7 +344,7 @@ StatusWith<string> CatalogManagerCommon::addShard(OperationContext* txn, log() << "going to add shard: " << shardType.toString(); - Status result = insert(ShardType::ConfigNS, shardType.toBSON(), NULL); + Status result = insert(txn, ShardType::ConfigNS, shardType.toBSON(), NULL); if (!result.isOK()) { log() << "error adding shard: " << shardType.toBSON() << " err: " << result.reason(); return result; @@ -360,7 +360,7 @@ StatusWith<string> CatalogManagerCommon::addShard(OperationContext* txn, dbt.setPrimary(shardType.getName()); dbt.setSharded(false); - Status status = updateDatabase(dbName, dbt); + Status status = updateDatabase(txn, dbName, dbt); if (!status.isOK()) { log() << "adding shard " << shardConnectionString.toString() << " even though could not add database " << dbName; @@ -372,17 +372,19 @@ StatusWith<string> CatalogManagerCommon::addShard(OperationContext* txn, shardDetails.append("name", shardType.getName()); shardDetails.append("host", shardConnectionString.toString()); - logChange(txn->getClient()->clientAddress(true), "addShard", "", shardDetails.obj()); + logChange(txn, txn->getClient()->clientAddress(true), "addShard", "", shardDetails.obj()); return shardType.getName(); } -Status CatalogManagerCommon::updateCollection(const std::string& collNs, +Status CatalogManagerCommon::updateCollection(OperationContext* txn, + const std::string& collNs, const CollectionType& coll) { fassert(28634, coll.validate()); BatchedCommandResponse response; - Status status = update(CollectionType::ConfigNS, + Status status = update(txn, + CollectionType::ConfigNS, BSON(CollectionType::fullNs(collNs)), coll.toBSON(), true, // upsert @@ -397,11 +399,14 @@ Status CatalogManagerCommon::updateCollection(const std::string& collNs, return Status::OK(); } -Status CatalogManagerCommon::updateDatabase(const std::string& dbName, const DatabaseType& db) { +Status CatalogManagerCommon::updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) { fassert(28616, db.validate()); BatchedCommandResponse response; - Status status = update(DatabaseType::ConfigNS, + Status status = update(txn, + DatabaseType::ConfigNS, BSON(DatabaseType::name(dbName)), db.toBSON(), true, // upsert @@ -416,7 +421,7 @@ Status CatalogManagerCommon::updateDatabase(const std::string& dbName, const Dat return Status::OK(); } -Status CatalogManagerCommon::createDatabase(const std::string& dbName) { +Status CatalogManagerCommon::createDatabase(OperationContext* txn, const std::string& dbName) { invariant(nsIsDbOnly(dbName)); // The admin and config databases should never be explicitly created. They "just exist", @@ -453,7 +458,7 @@ Status CatalogManagerCommon::createDatabase(const std::string& dbName) { db.setSharded(false); BatchedCommandResponse response; - status = insert(DatabaseType::ConfigNS, db.toBSON(), &response); + status = insert(txn, DatabaseType::ConfigNS, db.toBSON(), &response); if (status.code() == ErrorCodes::DuplicateKey) { return Status(ErrorCodes::NamespaceExists, "database " + dbName + " already exists"); @@ -500,7 +505,7 @@ StatusWith<ShardId> CatalogManagerCommon::selectShardForNewDatabase(ShardRegistr return candidateShardId; } -Status CatalogManagerCommon::enableSharding(const std::string& dbName) { +Status CatalogManagerCommon::enableSharding(OperationContext* txn, const std::string& dbName) { invariant(nsIsDbOnly(dbName)); DatabaseType db; @@ -538,7 +543,7 @@ Status CatalogManagerCommon::enableSharding(const std::string& dbName) { log() << "Enabling sharding for database [" << dbName << "] in config db"; - return updateDatabase(dbName, db); + return updateDatabase(txn, dbName, db); } } // namespace mongo diff --git a/src/mongo/s/catalog/catalog_manager_common.h b/src/mongo/s/catalog/catalog_manager_common.h index c6890d35de1..42bd0a00f33 100644 --- a/src/mongo/s/catalog/catalog_manager_common.h +++ b/src/mongo/s/catalog/catalog_manager_common.h @@ -48,18 +48,22 @@ class CatalogManagerCommon : public CatalogManager { public: virtual ~CatalogManagerCommon() = default; - Status enableSharding(const std::string& dbName) override; + Status enableSharding(OperationContext* txn, const std::string& dbName) override; StatusWith<std::string> addShard(OperationContext* txn, const std::string* shardProposedName, const ConnectionString& shardConnectionString, const long long maxSize) override; - Status updateDatabase(const std::string& dbName, const DatabaseType& db) override; + Status updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) override; - Status updateCollection(const std::string& collNs, const CollectionType& coll) override; + Status updateCollection(OperationContext* txn, + const std::string& collNs, + const CollectionType& coll) override; - Status createDatabase(const std::string& dbName) override; + Status createDatabase(OperationContext* txn, const std::string& dbName) override; protected: /** diff --git a/src/mongo/s/catalog/catalog_manager_mock.cpp b/src/mongo/s/catalog/catalog_manager_mock.cpp index 48745d1d5d1..ee4bba4f8ff 100644 --- a/src/mongo/s/catalog/catalog_manager_mock.cpp +++ b/src/mongo/s/catalog/catalog_manager_mock.cpp @@ -45,11 +45,11 @@ CatalogManagerMock::CatalogManagerMock() { } CatalogManagerMock::~CatalogManagerMock() = default; -Status CatalogManagerMock::startup() { +Status CatalogManagerMock::startup(OperationContext* txn) { return Status::OK(); } -void CatalogManagerMock::shutDown(bool allowNetworking) {} +void CatalogManagerMock::shutDown(OperationContext* txn, bool allowNetworking) {} Status CatalogManagerMock::shardCollection(OperationContext* txn, const string& ns, @@ -72,23 +72,30 @@ StatusWith<ShardDrainingStatus> CatalogManagerMock::removeShard(OperationContext return ShardDrainingStatus::COMPLETED; } -Status CatalogManagerMock::updateDatabase(const string& dbName, const DatabaseType& db) { +Status CatalogManagerMock::updateDatabase(OperationContext* txn, + const string& dbName, + const DatabaseType& db) { return Status::OK(); } -StatusWith<OpTimePair<DatabaseType>> CatalogManagerMock::getDatabase(const string& dbName) { +StatusWith<OpTimePair<DatabaseType>> CatalogManagerMock::getDatabase(OperationContext* txn, + const string& dbName) { return OpTimePair<DatabaseType>(); } -Status CatalogManagerMock::updateCollection(const string& collNs, const CollectionType& coll) { +Status CatalogManagerMock::updateCollection(OperationContext* txn, + const string& collNs, + const CollectionType& coll) { return Status::OK(); } -StatusWith<OpTimePair<CollectionType>> CatalogManagerMock::getCollection(const string& collNs) { +StatusWith<OpTimePair<CollectionType>> CatalogManagerMock::getCollection(OperationContext* txn, + const string& collNs) { return OpTimePair<CollectionType>(); } -Status CatalogManagerMock::getCollections(const string* dbName, +Status CatalogManagerMock::getCollections(OperationContext* txn, + const string* dbName, vector<CollectionType>* collections, repl::OpTime* optime) { return Status::OK(); @@ -98,11 +105,14 @@ Status CatalogManagerMock::dropCollection(OperationContext* txn, const Namespace return {ErrorCodes::InternalError, "Method not implemented"}; } -Status CatalogManagerMock::getDatabasesForShard(const string& shardName, vector<string>* dbs) { +Status CatalogManagerMock::getDatabasesForShard(OperationContext* txn, + const string& shardName, + vector<string>* dbs) { return Status::OK(); } -Status CatalogManagerMock::getChunks(const BSONObj& filter, +Status CatalogManagerMock::getChunks(OperationContext* txn, + const BSONObj& filter, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, @@ -110,12 +120,14 @@ Status CatalogManagerMock::getChunks(const BSONObj& filter, return Status::OK(); } -Status CatalogManagerMock::getTagsForCollection(const string& collectionNs, +Status CatalogManagerMock::getTagsForCollection(OperationContext* txn, + const string& collectionNs, vector<TagsType>* tags) { return Status::OK(); } -StatusWith<string> CatalogManagerMock::getTagForChunk(const string& collectionNs, +StatusWith<string> CatalogManagerMock::getTagForChunk(OperationContext* txn, + const string& collectionNs, const ChunkType& chunk) { return string(); } @@ -124,42 +136,49 @@ Status CatalogManagerMock::getAllShards(vector<ShardType>* shards) { return Status::OK(); } -bool CatalogManagerMock::runUserManagementWriteCommand(const string& commandName, +bool CatalogManagerMock::runUserManagementWriteCommand(OperationContext* txn, + const string& commandName, const string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return true; } -bool CatalogManagerMock::runReadCommand(const std::string& dbname, +bool CatalogManagerMock::runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return true; } -bool CatalogManagerMock::runUserManagementReadCommand(const string& dbname, +bool CatalogManagerMock::runUserManagementReadCommand(OperationContext* txn, + const string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return true; } -Status CatalogManagerMock::applyChunkOpsDeprecated(const BSONArray& updateOps, +Status CatalogManagerMock::applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) { return Status::OK(); } -void CatalogManagerMock::logAction(const ActionLogType& actionLog) {} +void CatalogManagerMock::logAction(OperationContext* txn, const ActionLogType& actionLog) {} -void CatalogManagerMock::logChange(const string& clientAddress, +void CatalogManagerMock::logChange(OperationContext* txn, + const string& clientAddress, const string& what, const string& ns, const BSONObj& detail) {} -StatusWith<SettingsType> CatalogManagerMock::getGlobalSettings(const string& key) { +StatusWith<SettingsType> CatalogManagerMock::getGlobalSettings(OperationContext* txn, + const string& key) { return SettingsType(); } -void CatalogManagerMock::writeConfigServerDirect(const BatchedCommandRequest& request, +void CatalogManagerMock::writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) {} DistLockManager* CatalogManagerMock::getDistLockManager() { @@ -174,7 +193,7 @@ StatusWith<std::string> CatalogManagerMock::_generateNewShardName() { return {ErrorCodes::InternalError, "Method not implemented"}; } -Status CatalogManagerMock::initConfigVersion() { +Status CatalogManagerMock::initConfigVersion(OperationContext* txn) { return Status::OK(); } diff --git a/src/mongo/s/catalog/catalog_manager_mock.h b/src/mongo/s/catalog/catalog_manager_mock.h index e53b114865f..9e183842af2 100644 --- a/src/mongo/s/catalog/catalog_manager_mock.h +++ b/src/mongo/s/catalog/catalog_manager_mock.h @@ -45,9 +45,9 @@ public: return ConfigServerMode::NONE; } - Status startup() override; + Status startup(OperationContext* txn) override; - void shutDown(bool allowNetworking) override; + void shutDown(OperationContext* txn, bool allowNetworking) override; Status shardCollection(OperationContext* txn, const std::string& ns, @@ -64,68 +64,86 @@ public: StatusWith<ShardDrainingStatus> removeShard(OperationContext* txn, const std::string& name) override; - Status updateDatabase(const std::string& dbName, const DatabaseType& db) override; + Status updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) override; - StatusWith<OpTimePair<DatabaseType>> getDatabase(const std::string& dbName) override; + StatusWith<OpTimePair<DatabaseType>> getDatabase(OperationContext* txn, + const std::string& dbName) override; - Status updateCollection(const std::string& collNs, const CollectionType& coll) override; + Status updateCollection(OperationContext* txn, + const std::string& collNs, + const CollectionType& coll) override; - StatusWith<OpTimePair<CollectionType>> getCollection(const std::string& collNs) override; + StatusWith<OpTimePair<CollectionType>> getCollection(OperationContext* txn, + const std::string& collNs) override; - Status getCollections(const std::string* dbName, + Status getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* optime) override; Status dropCollection(OperationContext* txn, const NamespaceString& ns) override; - Status getDatabasesForShard(const std::string& shardName, + Status getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) override; - Status getChunks(const BSONObj& filter, + Status getChunks(OperationContext* txn, + const BSONObj& filter, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, repl::OpTime* opTime) override; - Status getTagsForCollection(const std::string& collectionNs, + Status getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) override; - StatusWith<std::string> getTagForChunk(const std::string& collectionNs, + StatusWith<std::string> getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) override; Status getAllShards(std::vector<ShardType>* shards) override; - bool runUserManagementWriteCommand(const std::string& commandName, + bool runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - virtual bool runReadCommand(const std::string& dbname, + virtual bool runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runUserManagementReadCommand(const std::string& dbname, + bool runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - Status applyChunkOpsDeprecated(const BSONArray& updateOps, + Status applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) override; - void logAction(const ActionLogType& actionLog) override; + void logAction(OperationContext* txn, const ActionLogType& actionLog) override; - void logChange(const std::string& clientAddress, + void logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) override; - StatusWith<SettingsType> getGlobalSettings(const std::string& key) override; + StatusWith<SettingsType> getGlobalSettings(OperationContext* txn, + const std::string& key) override; - void writeConfigServerDirect(const BatchedCommandRequest& request, + void writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) override; DistLockManager* getDistLockManager() override; - Status initConfigVersion() override; + Status initConfigVersion(OperationContext* txn) override; private: Status _checkDbDoesNotExist(const std::string& dbName, DatabaseType* db) override; diff --git a/src/mongo/s/catalog/forwarding_catalog_manager.cpp b/src/mongo/s/catalog/forwarding_catalog_manager.cpp index d5f789ce61b..a3fae98e0ed 100644 --- a/src/mongo/s/catalog/forwarding_catalog_manager.cpp +++ b/src/mongo/s/catalog/forwarding_catalog_manager.cpp @@ -36,6 +36,7 @@ #include <vector> #include "mongo/client/connection_string.h" +#include "mongo/db/client.h" #include "mongo/db/service_context.h" #include "mongo/platform/random.h" #include "mongo/s/catalog/dist_lock_catalog_impl.h" @@ -165,22 +166,23 @@ void ForwardingCatalogManager::waitForCatalogManagerChange() { } CatalogManager::ConfigServerMode ForwardingCatalogManager::getMode() { - return retry([this] { return _actual->getMode(); }); + stdx::lock_guard<stdx::mutex> lk(_observerMutex); + return _actual->getMode(); } -Status ForwardingCatalogManager::startup() { - return retry([this] { return _actual->startup(); }); +Status ForwardingCatalogManager::startup(OperationContext* txn) { + return retry([this, txn] { return _actual->startup(txn); }); } -void ForwardingCatalogManager::shutDown(bool allowNetworking) { - retry([this, allowNetworking] { - _actual->shutDown(allowNetworking); +void ForwardingCatalogManager::shutDown(OperationContext* txn, bool allowNetworking) { + retry([this, txn, allowNetworking] { + _actual->shutDown(txn, allowNetworking); return 1; }); } -Status ForwardingCatalogManager::enableSharding(const std::string& dbName) { - return retry([&] { return _actual->enableSharding(dbName); }); +Status ForwardingCatalogManager::enableSharding(OperationContext* txn, const std::string& dbName) { + return retry([&] { return _actual->enableSharding(txn, dbName); }); } Status ForwardingCatalogManager::shardCollection(OperationContext* txn, @@ -208,32 +210,36 @@ StatusWith<ShardDrainingStatus> ForwardingCatalogManager::removeShard(OperationC return retry([&] { return _actual->removeShard(txn, name); }); } -Status ForwardingCatalogManager::updateDatabase(const std::string& dbName, const DatabaseType& db) { - return retry([&] { return _actual->updateDatabase(dbName, db); }); +Status ForwardingCatalogManager::updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) { + return retry([&] { return _actual->updateDatabase(txn, dbName, db); }); } StatusWith<OpTimePair<DatabaseType>> ForwardingCatalogManager::getDatabase( - const std::string& dbName) { - return retry([&] { return _actual->getDatabase(dbName); }); + OperationContext* txn, const std::string& dbName) { + return retry([&] { return _actual->getDatabase(txn, dbName); }); } -Status ForwardingCatalogManager::updateCollection(const std::string& collNs, +Status ForwardingCatalogManager::updateCollection(OperationContext* txn, + const std::string& collNs, const CollectionType& coll) { - return retry([&] { return _actual->updateCollection(collNs, coll); }); + return retry([&] { return _actual->updateCollection(txn, collNs, coll); }); } StatusWith<OpTimePair<CollectionType>> ForwardingCatalogManager::getCollection( - const std::string& collNs) { - return retry([&] { return _actual->getCollection(collNs); }); + OperationContext* txn, const std::string& collNs) { + return retry([&] { return _actual->getCollection(txn, collNs); }); } -Status ForwardingCatalogManager::getCollections(const std::string* dbName, +Status ForwardingCatalogManager::getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* opTime) { invariant(collections->empty()); return retry([&] { collections->clear(); - return _actual->getCollections(dbName, collections, opTime); + return _actual->getCollections(txn, dbName, collections, opTime); }); } @@ -241,16 +247,18 @@ Status ForwardingCatalogManager::dropCollection(OperationContext* txn, const Nam return retry([&] { return _actual->dropCollection(txn, ns); }); } -Status ForwardingCatalogManager::getDatabasesForShard(const std::string& shardName, +Status ForwardingCatalogManager::getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) { invariant(dbs->empty()); return retry([&] { dbs->clear(); - return _actual->getDatabasesForShard(shardName, dbs); + return _actual->getDatabasesForShard(txn, shardName, dbs); }); } -Status ForwardingCatalogManager::getChunks(const BSONObj& query, +Status ForwardingCatalogManager::getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, @@ -258,22 +266,24 @@ Status ForwardingCatalogManager::getChunks(const BSONObj& query, invariant(chunks->empty()); return retry([&] { chunks->clear(); - return _actual->getChunks(query, sort, limit, chunks, opTime); + return _actual->getChunks(txn, query, sort, limit, chunks, opTime); }); } -Status ForwardingCatalogManager::getTagsForCollection(const std::string& collectionNs, +Status ForwardingCatalogManager::getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) { invariant(tags->empty()); return retry([&] { tags->clear(); - return _actual->getTagsForCollection(collectionNs, tags); + return _actual->getTagsForCollection(txn, collectionNs, tags); }); } -StatusWith<std::string> ForwardingCatalogManager::getTagForChunk(const std::string& collectionNs, +StatusWith<std::string> ForwardingCatalogManager::getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) { - return retry([&] { return _actual->getTagForChunk(collectionNs, chunk); }); + return retry([&] { return _actual->getTagForChunk(txn, collectionNs, chunk); }); } Status ForwardingCatalogManager::getAllShards(std::vector<ShardType>* shards) { @@ -284,90 +294,100 @@ Status ForwardingCatalogManager::getAllShards(std::vector<ShardType>* shards) { }); } -bool ForwardingCatalogManager::runUserManagementWriteCommand(const std::string& commandName, +bool ForwardingCatalogManager::runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return retry([&] { BSONObjBuilder builder; const bool success = - _actual->runUserManagementWriteCommand(commandName, dbname, cmdObj, &builder); + _actual->runUserManagementWriteCommand(txn, commandName, dbname, cmdObj, &builder); result->appendElements(builder.done()); return success; }); } -bool ForwardingCatalogManager::runReadCommand(const std::string& dbname, +bool ForwardingCatalogManager::runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return retry([&] { BSONObjBuilder builder; - const bool success = _actual->runReadCommand(dbname, cmdObj, &builder); + const bool success = _actual->runReadCommand(txn, dbname, cmdObj, &builder); result->appendElements(builder.done()); return success; }); } -bool ForwardingCatalogManager::runUserManagementReadCommand(const std::string& dbname, +bool ForwardingCatalogManager::runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return retry([&] { BSONObjBuilder builder; - const bool success = _actual->runUserManagementReadCommand(dbname, cmdObj, &builder); + const bool success = _actual->runUserManagementReadCommand(txn, dbname, cmdObj, &builder); result->appendElements(builder.done()); return success; }); } -Status ForwardingCatalogManager::applyChunkOpsDeprecated(const BSONArray& updateOps, +Status ForwardingCatalogManager::applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) { - return retry([&] { return _actual->applyChunkOpsDeprecated(updateOps, preCondition); }); + return retry([&] { return _actual->applyChunkOpsDeprecated(txn, updateOps, preCondition); }); } -void ForwardingCatalogManager::logAction(const ActionLogType& actionLog) { +void ForwardingCatalogManager::logAction(OperationContext* txn, const ActionLogType& actionLog) { retry([&] { - _actual->logAction(actionLog); + _actual->logAction(txn, actionLog); return 1; }); } -void ForwardingCatalogManager::logChange(const std::string& clientAddress, +void ForwardingCatalogManager::logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) { retry([&] { - _actual->logChange(clientAddress, what, ns, detail); + _actual->logChange(txn, clientAddress, what, ns, detail); return 1; }); } -StatusWith<SettingsType> ForwardingCatalogManager::getGlobalSettings(const std::string& key) { - return retry([&] { return _actual->getGlobalSettings(key); }); +StatusWith<SettingsType> ForwardingCatalogManager::getGlobalSettings(OperationContext* txn, + const std::string& key) { + return retry([&] { return _actual->getGlobalSettings(txn, key); }); } -void ForwardingCatalogManager::writeConfigServerDirect(const BatchedCommandRequest& request, +void ForwardingCatalogManager::writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) { retry([&] { BatchedCommandResponse theResponse; - _actual->writeConfigServerDirect(request, &theResponse); + _actual->writeConfigServerDirect(txn, request, &theResponse); theResponse.cloneTo(response); return 1; }); } -Status ForwardingCatalogManager::createDatabase(const std::string& dbName) { - return retry([&] { return _actual->createDatabase(dbName); }); +Status ForwardingCatalogManager::createDatabase(OperationContext* txn, const std::string& dbName) { + return retry([&] { return _actual->createDatabase(txn, dbName); }); } DistLockManager* ForwardingCatalogManager::getDistLockManager() { - return retry([&] { return _actual->getDistLockManager(); }); + warning() << "getDistLockManager called on ForwardingCatalogManager which should never happen!"; + stdx::lock_guard<stdx::mutex> lk(_observerMutex); + return _actual->getDistLockManager(); } -Status ForwardingCatalogManager::initConfigVersion() { - return retry([&] { return _actual->initConfigVersion(); }); +Status ForwardingCatalogManager::initConfigVersion(OperationContext* txn) { + return retry([&] { return _actual->initConfigVersion(txn); }); } StatusWith<ForwardingCatalogManager::ScopedDistLock> ForwardingCatalogManager::distLock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor, @@ -376,7 +396,8 @@ StatusWith<ForwardingCatalogManager::ScopedDistLock> ForwardingCatalogManager::d try { _operationLock.lock_shared(); auto guard = MakeGuard([this] { _operationLock.unlock_shared(); }); - auto dlmLock = getDistLockManager()->lock(name, whyMessage, waitFor, lockTryInterval); + auto dlmLock = + _actual->getDistLockManager()->lock(name, whyMessage, waitFor, lockTryInterval); if (dlmLock.isOK()) { guard.Dismiss(); // Don't unlock _operationLock; hold it until the returned // ScopedDistLock goes out of scope! @@ -483,12 +504,15 @@ void ForwardingCatalogManager::_replaceCatalogManager(const TaskExecutor::Callba if (!args.status.isOK()) { return; } + Client::initThreadIfNotAlready(); + auto txn = cc().makeOperationContext(); + stdx::lock_guard<RWLock> oplk(_operationLock); stdx::lock_guard<stdx::mutex> oblk(_observerMutex); - _actual->shutDown(/* allowNetworking */ false); + _actual->shutDown(txn.get(), /* allowNetworking */ false); _actual = makeCatalogManager(_service, _nextConfigConnectionString, _shardRegistry, _thisHost); _shardRegistry->updateConfigServerConnectionString(_nextConfigConnectionString); - fassert(28790, _actual->startup()); + fassert(28790, _actual->startup(txn.get())); args.executor->signalEvent(_nextConfigChangeComplete); } diff --git a/src/mongo/s/catalog/forwarding_catalog_manager.h b/src/mongo/s/catalog/forwarding_catalog_manager.h index 1ad533ecefb..69d67658dcb 100644 --- a/src/mongo/s/catalog/forwarding_catalog_manager.h +++ b/src/mongo/s/catalog/forwarding_catalog_manager.h @@ -78,11 +78,11 @@ public: ConfigServerMode getMode() override; - Status startup() override; + Status startup(OperationContext* txn) override; - void shutDown(bool allowNetworking = true) override; + void shutDown(OperationContext* txn, bool allowNetworking = true) override; - Status enableSharding(const std::string& dbName) override; + Status enableSharding(OperationContext* txn, const std::string& dbName) override; Status shardCollection(OperationContext* txn, const std::string& ns, @@ -99,70 +99,88 @@ public: StatusWith<ShardDrainingStatus> removeShard(OperationContext* txn, const std::string& name) override; - Status updateDatabase(const std::string& dbName, const DatabaseType& db) override; + Status updateDatabase(OperationContext* txn, + const std::string& dbName, + const DatabaseType& db) override; - StatusWith<OpTimePair<DatabaseType>> getDatabase(const std::string& dbName) override; + StatusWith<OpTimePair<DatabaseType>> getDatabase(OperationContext* txn, + const std::string& dbName) override; - Status updateCollection(const std::string& collNs, const CollectionType& coll) override; + Status updateCollection(OperationContext* txn, + const std::string& collNs, + const CollectionType& coll) override; - StatusWith<OpTimePair<CollectionType>> getCollection(const std::string& collNs) override; + StatusWith<OpTimePair<CollectionType>> getCollection(OperationContext* txn, + const std::string& collNs) override; - Status getCollections(const std::string* dbName, + Status getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* opTime) override; Status dropCollection(OperationContext* txn, const NamespaceString& ns) override; - Status getDatabasesForShard(const std::string& shardName, + Status getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) override; - Status getChunks(const BSONObj& query, + Status getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, repl::OpTime* opTime) override; - Status getTagsForCollection(const std::string& collectionNs, + Status getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) override; - StatusWith<std::string> getTagForChunk(const std::string& collectionNs, + StatusWith<std::string> getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) override; Status getAllShards(std::vector<ShardType>* shards) override; - bool runUserManagementWriteCommand(const std::string& commandName, + bool runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runReadCommand(const std::string& dbname, + bool runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runUserManagementReadCommand(const std::string& dbname, + bool runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - Status applyChunkOpsDeprecated(const BSONArray& updateOps, + Status applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) override; - void logAction(const ActionLogType& actionLog) override; + void logAction(OperationContext* txn, const ActionLogType& actionLog) override; - void logChange(const std::string& clientAddress, + void logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) override; - StatusWith<SettingsType> getGlobalSettings(const std::string& key) override; + StatusWith<SettingsType> getGlobalSettings(OperationContext* txn, + const std::string& key) override; - void writeConfigServerDirect(const BatchedCommandRequest& request, + void writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) override; - Status createDatabase(const std::string& dbName) override; + Status createDatabase(OperationContext* txn, const std::string& dbName) override; DistLockManager* getDistLockManager() override; - Status initConfigVersion() override; + Status initConfigVersion(OperationContext* txn) override; class ScopedDistLock { MONGO_DISALLOW_COPYING(ScopedDistLock); @@ -184,6 +202,7 @@ public: }; StatusWith<ScopedDistLock> distLock( + OperationContext* txn, StringData name, StringData whyMessage, stdx::chrono::milliseconds waitFor = DistLockManager::kDefaultSingleLockAttemptTimeout, diff --git a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp index 40e5f50a9db..ccf6b7a2bb7 100644 --- a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp +++ b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp @@ -214,7 +214,7 @@ Status CatalogManagerLegacy::init(const ConnectionString& configDBCS) { return Status::OK(); } -Status CatalogManagerLegacy::startup() { +Status CatalogManagerLegacy::startup(OperationContext* txn) { Status status = _startConfigServerChecker(); if (!status.isOK()) { return status; @@ -223,8 +223,8 @@ Status CatalogManagerLegacy::startup() { return status; } -Status CatalogManagerLegacy::initConfigVersion() { - return checkAndInitConfigVersion(this, getDistLockManager()); +Status CatalogManagerLegacy::initConfigVersion(OperationContext* txn) { + return checkAndInitConfigVersion(txn, this, getDistLockManager()); } Status CatalogManagerLegacy::_startConfigServerChecker() { @@ -239,7 +239,7 @@ Status CatalogManagerLegacy::_startConfigServerChecker() { return Status::OK(); } -void CatalogManagerLegacy::shutDown(bool allowNetworking) { +void CatalogManagerLegacy::shutDown(OperationContext* txn, bool allowNetworking) { LOG(1) << "CatalogManagerLegacy::shutDown() called."; { stdx::lock_guard<stdx::mutex> lk(_mutex); @@ -268,7 +268,7 @@ Status CatalogManagerLegacy::shardCollection(OperationContext* txn, return scopedDistLock.getStatus(); } - auto status = getDatabase(nsToDatabase(ns)); + auto status = getDatabase(txn, nsToDatabase(ns)); if (!status.isOK()) { return status.getStatus(); } @@ -314,8 +314,11 @@ Status CatalogManagerLegacy::shardCollection(OperationContext* txn, collectionDetail.append("numChunks", static_cast<int>(initPoints.size() + 1)); - logChange( - txn->getClient()->clientAddress(true), "shardCollection.start", ns, collectionDetail.obj()); + logChange(txn, + txn->getClient()->clientAddress(true), + "shardCollection.start", + ns, + collectionDetail.obj()); shared_ptr<ChunkManager> manager(new ChunkManager(ns, fieldsAndOrder, unique)); manager->createFirstChunks(txn, dbPrimaryShardId, &initPoints, &initShardIds); @@ -361,7 +364,8 @@ Status CatalogManagerLegacy::shardCollection(OperationContext* txn, finishDetail.append("version", manager->getVersion().toString()); - logChange(txn->getClient()->clientAddress(true), "shardCollection", ns, finishDetail.obj()); + logChange( + txn, txn->getClient()->clientAddress(true), "shardCollection", ns, finishDetail.obj()); return Status::OK(); } @@ -391,7 +395,7 @@ StatusWith<ShardDrainingStatus> CatalogManagerLegacy::removeShard(OperationConte log() << "going to start draining shard: " << name; BSONObj newStatus = BSON("$set" << BSON(ShardType::draining(true))); - Status status = update(ShardType::ConfigNS, searchDoc, newStatus, false, false, NULL); + Status status = update(txn, ShardType::ConfigNS, searchDoc, newStatus, false, false, NULL); if (!status.isOK()) { log() << "error starting removeShard: " << name << "; err: " << status.reason(); return status; @@ -401,8 +405,11 @@ StatusWith<ShardDrainingStatus> CatalogManagerLegacy::removeShard(OperationConte conn.done(); // Record start in changelog - logChange( - txn->getClient()->clientAddress(true), "removeShard.start", "", BSON("shard" << name)); + logChange(txn, + txn->getClient()->clientAddress(true), + "removeShard.start", + "", + BSON("shard" << name)); return ShardDrainingStatus::STARTED; } @@ -416,7 +423,7 @@ StatusWith<ShardDrainingStatus> CatalogManagerLegacy::removeShard(OperationConte log() << "going to remove shard: " << name; audit::logRemoveShard(txn->getClient(), name); - Status status = remove(ShardType::ConfigNS, searchDoc, 0, NULL); + Status status = remove(txn, ShardType::ConfigNS, searchDoc, 0, NULL); if (!status.isOK()) { log() << "Error concluding removeShard operation on: " << name << "; err: " << status.reason(); @@ -428,7 +435,8 @@ StatusWith<ShardDrainingStatus> CatalogManagerLegacy::removeShard(OperationConte conn.done(); // Record finish in changelog - logChange(txn->getClient()->clientAddress(true), "removeShard", "", BSON("shard" << name)); + logChange( + txn, txn->getClient()->clientAddress(true), "removeShard", "", BSON("shard" << name)); return ShardDrainingStatus::COMPLETED; } @@ -436,7 +444,8 @@ StatusWith<ShardDrainingStatus> CatalogManagerLegacy::removeShard(OperationConte return ShardDrainingStatus::ONGOING; } -StatusWith<OpTimePair<DatabaseType>> CatalogManagerLegacy::getDatabase(const std::string& dbName) { +StatusWith<OpTimePair<DatabaseType>> CatalogManagerLegacy::getDatabase(OperationContext* txn, + const std::string& dbName) { invariant(nsIsDbOnly(dbName)); // The two databases that are hosted on the config server are config and admin @@ -469,7 +478,7 @@ StatusWith<OpTimePair<DatabaseType>> CatalogManagerLegacy::getDatabase(const std } StatusWith<OpTimePair<CollectionType>> CatalogManagerLegacy::getCollection( - const std::string& collNs) { + OperationContext* txn, const std::string& collNs) { ScopedDbConnection conn(_configServerConnectionString, 30.0); BSONObj collObj = conn->findOne(CollectionType::ConfigNS, BSON(CollectionType::fullNs(collNs))); @@ -490,7 +499,8 @@ StatusWith<OpTimePair<CollectionType>> CatalogManagerLegacy::getCollection( return OpTimePair<CollectionType>(parseStatus.getValue()); } -Status CatalogManagerLegacy::getCollections(const std::string* dbName, +Status CatalogManagerLegacy::getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* optime) { BSONObjBuilder b; @@ -526,7 +536,8 @@ Status CatalogManagerLegacy::getCollections(const std::string* dbName, } Status CatalogManagerLegacy::dropCollection(OperationContext* txn, const NamespaceString& ns) { - logChange(txn->getClient()->clientAddress(true), "dropCollection.start", ns.ns(), BSONObj()); + logChange( + txn, txn->getClient()->clientAddress(true), "dropCollection.start", ns.ns(), BSONObj()); vector<ShardType> allShards; Status status = getAllShards(&allShards); @@ -583,7 +594,7 @@ Status CatalogManagerLegacy::dropCollection(OperationContext* txn, const Namespa LOG(1) << "dropCollection " << ns << " shard data deleted"; // Remove chunk data - Status result = remove(ChunkType::ConfigNS, BSON(ChunkType::ns(ns.ns())), 0, nullptr); + Status result = remove(txn, ChunkType::ConfigNS, BSON(ChunkType::ns(ns.ns())), 0, nullptr); if (!result.isOK()) { return result; } @@ -597,7 +608,7 @@ Status CatalogManagerLegacy::dropCollection(OperationContext* txn, const Namespa coll.setEpoch(ChunkVersion::DROPPED().epoch()); coll.setUpdatedAt(grid.shardRegistry()->getNetwork()->now()); - result = updateCollection(ns.ns(), coll); + result = updateCollection(txn, ns.ns(), coll); if (!result.isOK()) { return result; } @@ -640,12 +651,12 @@ Status CatalogManagerLegacy::dropCollection(OperationContext* txn, const Namespa LOG(1) << "dropCollection " << ns << " completed"; - logChange(txn->getClient()->clientAddress(true), "dropCollection", ns.ns(), BSONObj()); + logChange(txn, txn->getClient()->clientAddress(true), "dropCollection", ns.ns(), BSONObj()); return Status::OK(); } -void CatalogManagerLegacy::logAction(const ActionLogType& actionLog) { +void CatalogManagerLegacy::logAction(OperationContext* txn, const ActionLogType& actionLog) { // Create the action log collection and ensure that it is capped. Wrap in try/catch, // because creating an existing collection throws. if (_actionLogCollectionCreated.load() == 0) { @@ -667,13 +678,14 @@ void CatalogManagerLegacy::logAction(const ActionLogType& actionLog) { } } - Status result = insert(ActionLogType::ConfigNS, actionLog.toBSON(), NULL); + Status result = insert(txn, ActionLogType::ConfigNS, actionLog.toBSON(), NULL); if (!result.isOK()) { log() << "error encountered while logging action: " << result; } } -void CatalogManagerLegacy::logChange(const string& clientAddress, +void CatalogManagerLegacy::logChange(OperationContext* txn, + const string& clientAddress, const string& what, const string& ns, const BSONObj& detail) { @@ -718,14 +730,15 @@ void CatalogManagerLegacy::logChange(const string& clientAddress, // config.changelog log() << "about to log metadata event: " << changeLogBSON; - Status result = insert(ChangeLogType::ConfigNS, changeLogBSON, NULL); + Status result = insert(txn, ChangeLogType::ConfigNS, changeLogBSON, NULL); if (!result.isOK()) { warning() << "Error encountered while logging config change with ID " << changeLog.getChangeId() << ": " << result; } } -StatusWith<SettingsType> CatalogManagerLegacy::getGlobalSettings(const string& key) { +StatusWith<SettingsType> CatalogManagerLegacy::getGlobalSettings(OperationContext* txn, + const string& key) { try { ScopedDbConnection conn(_configServerConnectionString, 30); BSONObj settingsDoc = conn->findOne(SettingsType::ConfigNS, BSON(SettingsType::key(key))); @@ -758,7 +771,9 @@ StatusWith<SettingsType> CatalogManagerLegacy::getGlobalSettings(const string& k } } -Status CatalogManagerLegacy::getDatabasesForShard(const string& shardName, vector<string>* dbs) { +Status CatalogManagerLegacy::getDatabasesForShard(OperationContext* txn, + const string& shardName, + vector<string>* dbs) { dbs->clear(); try { @@ -792,7 +807,8 @@ Status CatalogManagerLegacy::getDatabasesForShard(const string& shardName, vecto return Status::OK(); } -Status CatalogManagerLegacy::getChunks(const BSONObj& query, +Status CatalogManagerLegacy::getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, vector<ChunkType>* chunks, @@ -835,7 +851,8 @@ Status CatalogManagerLegacy::getChunks(const BSONObj& query, return Status::OK(); } -Status CatalogManagerLegacy::getTagsForCollection(const std::string& collectionNs, +Status CatalogManagerLegacy::getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) { tags->clear(); @@ -871,7 +888,8 @@ Status CatalogManagerLegacy::getTagsForCollection(const std::string& collectionN return Status::OK(); } -StatusWith<string> CatalogManagerLegacy::getTagForChunk(const std::string& collectionNs, +StatusWith<string> CatalogManagerLegacy::getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) { BSONObj tagDoc; @@ -924,7 +942,8 @@ Status CatalogManagerLegacy::getAllShards(vector<ShardType>* shards) { return Status::OK(); } -bool CatalogManagerLegacy::runUserManagementWriteCommand(const string& commandName, +bool CatalogManagerLegacy::runUserManagementWriteCommand(OperationContext* txn, + const string& commandName, const string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { @@ -1002,13 +1021,15 @@ bool CatalogManagerLegacy::runUserManagementWriteCommand(const string& commandNa return Command::appendCommandStatus(*result, status); } -bool CatalogManagerLegacy::runUserManagementReadCommand(const string& dbname, +bool CatalogManagerLegacy::runUserManagementReadCommand(OperationContext* txn, + const string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { - return runReadCommand(dbname, cmdObj, result); + return runReadCommand(txn, dbname, cmdObj, result); } -bool CatalogManagerLegacy::runReadCommand(const std::string& dbname, +bool CatalogManagerLegacy::runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { try { @@ -1026,7 +1047,8 @@ bool CatalogManagerLegacy::runReadCommand(const std::string& dbname, } } -Status CatalogManagerLegacy::applyChunkOpsDeprecated(const BSONArray& updateOps, +Status CatalogManagerLegacy::applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) { BSONObj cmd = BSON("applyOps" << updateOps << "preCondition" << preCondition); BSONObj cmdResult; @@ -1049,7 +1071,8 @@ Status CatalogManagerLegacy::applyChunkOpsDeprecated(const BSONArray& updateOps, return Status::OK(); } -void CatalogManagerLegacy::writeConfigServerDirect(const BatchedCommandRequest& request, +void CatalogManagerLegacy::writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) { // check if config servers are consistent if (!_isConsistentFromLastCheck()) { diff --git a/src/mongo/s/catalog/legacy/catalog_manager_legacy.h b/src/mongo/s/catalog/legacy/catalog_manager_legacy.h index 6ebb71323c6..70e0a9d69aa 100644 --- a/src/mongo/s/catalog/legacy/catalog_manager_legacy.h +++ b/src/mongo/s/catalog/legacy/catalog_manager_legacy.h @@ -55,9 +55,9 @@ public: */ Status init(const ConnectionString& configCS); - Status startup() override; + Status startup(OperationContext* txn) override; - void shutDown(bool allowNetworking) override; + void shutDown(OperationContext* txn, bool allowNetworking) override; Status shardCollection(OperationContext* txn, const std::string& ns, @@ -69,29 +69,36 @@ public: StatusWith<ShardDrainingStatus> removeShard(OperationContext* txn, const std::string& name) override; - StatusWith<OpTimePair<DatabaseType>> getDatabase(const std::string& dbName) override; + StatusWith<OpTimePair<DatabaseType>> getDatabase(OperationContext* txn, + const std::string& dbName) override; - StatusWith<OpTimePair<CollectionType>> getCollection(const std::string& collNs) override; + StatusWith<OpTimePair<CollectionType>> getCollection(OperationContext* txn, + const std::string& collNs) override; - Status getCollections(const std::string* dbName, + Status getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* optime); Status dropCollection(OperationContext* txn, const NamespaceString& ns) override; - Status getDatabasesForShard(const std::string& shardName, + Status getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) override; - Status getChunks(const BSONObj& query, + Status getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, repl::OpTime* opTime) override; - Status getTagsForCollection(const std::string& collectionNs, + Status getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) override; - StatusWith<std::string> getTagForChunk(const std::string& collectionNs, + StatusWith<std::string> getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) override; Status getAllShards(std::vector<ShardType>* shards) override; @@ -99,37 +106,44 @@ public: /** * Grabs a distributed lock and runs the command on all config servers. */ - bool runUserManagementWriteCommand(const std::string& commandName, + bool runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runReadCommand(const std::string& dbname, + bool runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runUserManagementReadCommand(const std::string& dbname, + bool runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - Status applyChunkOpsDeprecated(const BSONArray& updateOps, + Status applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) override; - void logAction(const ActionLogType& actionLog); + void logAction(OperationContext* txn, const ActionLogType& actionLog); - void logChange(const std::string& clientAddress, + void logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) override; - StatusWith<SettingsType> getGlobalSettings(const std::string& key) override; + StatusWith<SettingsType> getGlobalSettings(OperationContext* txn, + const std::string& key) override; - void writeConfigServerDirect(const BatchedCommandRequest& request, + void writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) override; DistLockManager* getDistLockManager() override; - Status initConfigVersion() override; + Status initConfigVersion(OperationContext* txn) override; private: Status _checkDbDoesNotExist(const std::string& dbName, DatabaseType* db) override; diff --git a/src/mongo/s/catalog/legacy/config_upgrade.cpp b/src/mongo/s/catalog/legacy/config_upgrade.cpp index 2e51aff26cb..f49043b6262 100644 --- a/src/mongo/s/catalog/legacy/config_upgrade.cpp +++ b/src/mongo/s/catalog/legacy/config_upgrade.cpp @@ -63,7 +63,7 @@ using str::stream; namespace { -Status makeConfigVersionDocument(CatalogManager* catalogManager) { +Status makeConfigVersionDocument(OperationContext* txn, CatalogManager* catalogManager) { // // Even though the initial config write is a single-document update, that single document // is on multiple config servers and requests can interleave. The upgrade lock prevents @@ -86,7 +86,8 @@ Status makeConfigVersionDocument(CatalogManager* catalogManager) { // If the cluster has not previously been initialized, we need to set the version before // using so subsequent mongoses use the config data the same way. This requires all three // config servers online initially. - return catalogManager->update(VersionType::ConfigNS, + return catalogManager->update(txn, + VersionType::ConfigNS, BSON("_id" << 1), versionInfo.toBSON(), true, // upsert @@ -253,7 +254,9 @@ Status getConfigVersion(CatalogManager* catalogManager, VersionType* versionInfo return Status::OK(); } -Status checkAndInitConfigVersion(CatalogManager* catalogManager, DistLockManager* distLockManager) { +Status checkAndInitConfigVersion(OperationContext* txn, + CatalogManager* catalogManager, + DistLockManager* distLockManager) { VersionType versionInfo; Status status = getConfigVersion(catalogManager, &versionInfo); if (!status.isOK()) { @@ -327,7 +330,7 @@ Status checkAndInitConfigVersion(CatalogManager* catalogManager, DistLockManager log() << "initializing config server version to " << CURRENT_CONFIG_VERSION; - status = makeConfigVersionDocument(catalogManager); + status = makeConfigVersionDocument(txn, catalogManager); if (!status.isOK()) return status; diff --git a/src/mongo/s/catalog/legacy/config_upgrade.h b/src/mongo/s/catalog/legacy/config_upgrade.h index 4266b381bb3..de4f9afcf6a 100644 --- a/src/mongo/s/catalog/legacy/config_upgrade.h +++ b/src/mongo/s/catalog/legacy/config_upgrade.h @@ -34,6 +34,7 @@ namespace mongo { class CatalogManager; class DistLockManager; +class OperationContext; class Status; class VersionType; @@ -49,6 +50,8 @@ Status getConfigVersion(CatalogManager* catalogManager, VersionType* versionInfo * * Returns Status::OK() on success, or an error status indicating the source of failure. */ -Status checkAndInitConfigVersion(CatalogManager* catalogManager, DistLockManager* distLockManager); +Status checkAndInitConfigVersion(OperationContext* txn, + CatalogManager* catalogManager, + DistLockManager* distLockManager); } // namespace mongo diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp index 01c747a44fe..a093c63b8ab 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp @@ -113,11 +113,11 @@ CatalogManagerReplicaSet::CatalogManagerReplicaSet(std::unique_ptr<DistLockManag CatalogManagerReplicaSet::~CatalogManagerReplicaSet() = default; -Status CatalogManagerReplicaSet::startup() { +Status CatalogManagerReplicaSet::startup(OperationContext* txn) { return Status::OK(); } -void CatalogManagerReplicaSet::shutDown(bool allowNetworking) { +void CatalogManagerReplicaSet::shutDown(OperationContext* txn, bool allowNetworking) { invariant(allowNetworking); LOG(1) << "CatalogManagerReplicaSet::shutDown() called."; { @@ -142,7 +142,7 @@ Status CatalogManagerReplicaSet::shardCollection(OperationContext* txn, return scopedDistLock.getStatus(); } - auto status = getDatabase(nsToDatabase(ns)); + auto status = getDatabase(txn, nsToDatabase(ns)); if (!status.isOK()) { return status.getStatus(); } @@ -191,7 +191,8 @@ Status CatalogManagerReplicaSet::shardCollection(OperationContext* txn, collectionDetail.append("numChunks", static_cast<int>(initPoints.size() + 1)); - logChange(txn->getClient()->clientAddress(true), + logChange(txn, + txn->getClient()->clientAddress(true), "shardCollection.start", ns, collectionDetail.obj()); @@ -224,7 +225,8 @@ Status CatalogManagerReplicaSet::shardCollection(OperationContext* txn, << dbPrimaryShardId << ssvStatus.getStatus(); } - logChange(txn->getClient()->clientAddress(true), + logChange(txn, + txn->getClient()->clientAddress(true), "shardCollection", ns, BSON("version" << manager->getVersion().toString())); @@ -274,7 +276,8 @@ StatusWith<ShardDrainingStatus> CatalogManagerReplicaSet::removeShard(OperationC if (countStatus.getValue() == 0) { log() << "going to start draining shard: " << name; - Status status = update(ShardType::ConfigNS, + Status status = update(txn, + ShardType::ConfigNS, BSON(ShardType::name() << name), BSON("$set" << BSON(ShardType::draining(true))), false, // upsert @@ -288,8 +291,11 @@ StatusWith<ShardDrainingStatus> CatalogManagerReplicaSet::removeShard(OperationC grid.shardRegistry()->reload(); // Record start in changelog - logChange( - txn->getClient()->clientAddress(true), "removeShard.start", "", BSON("shard" << name)); + logChange(txn, + txn->getClient()->clientAddress(true), + "removeShard.start", + "", + BSON("shard" << name)); return ShardDrainingStatus::STARTED; } @@ -319,7 +325,7 @@ StatusWith<ShardDrainingStatus> CatalogManagerReplicaSet::removeShard(OperationC log() << "going to remove shard: " << name; audit::logRemoveShard(txn->getClient(), name); - Status status = remove(ShardType::ConfigNS, BSON(ShardType::name() << name), 0, NULL); + Status status = remove(txn, ShardType::ConfigNS, BSON(ShardType::name() << name), 0, NULL); if (!status.isOK()) { log() << "Error concluding removeShard operation on: " << name << "; err: " << status.reason(); @@ -330,13 +336,13 @@ StatusWith<ShardDrainingStatus> CatalogManagerReplicaSet::removeShard(OperationC grid.shardRegistry()->reload(); // Record finish in changelog - logChange(txn->getClient()->clientAddress(true), "removeShard", "", BSON("shard" << name)); + logChange(txn, txn->getClient()->clientAddress(true), "removeShard", "", BSON("shard" << name)); return ShardDrainingStatus::COMPLETED; } StatusWith<OpTimePair<DatabaseType>> CatalogManagerReplicaSet::getDatabase( - const std::string& dbName) { + OperationContext* txn, const std::string& dbName) { invariant(nsIsDbOnly(dbName)); // The two databases that are hosted on the config server are config and admin @@ -380,7 +386,7 @@ StatusWith<OpTimePair<DatabaseType>> CatalogManagerReplicaSet::getDatabase( } StatusWith<OpTimePair<CollectionType>> CatalogManagerReplicaSet::getCollection( - const std::string& collNs) { + OperationContext* txn, const std::string& collNs) { auto configShard = grid.shardRegistry()->getShard("config"); auto readHostStatus = configShard->getTargeter()->findHost(kConfigReadSelector); @@ -414,7 +420,8 @@ StatusWith<OpTimePair<CollectionType>> CatalogManagerReplicaSet::getCollection( return OpTimePair<CollectionType>(parseStatus.getValue(), retOpTimePair.opTime); } -Status CatalogManagerReplicaSet::getCollections(const std::string* dbName, +Status CatalogManagerReplicaSet::getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, OpTime* opTime) { BSONObjBuilder b; @@ -462,7 +469,8 @@ Status CatalogManagerReplicaSet::getCollections(const std::string* dbName, } Status CatalogManagerReplicaSet::dropCollection(OperationContext* txn, const NamespaceString& ns) { - logChange(txn->getClient()->clientAddress(true), "dropCollection.start", ns.ns(), BSONObj()); + logChange( + txn, txn->getClient()->clientAddress(true), "dropCollection.start", ns.ns(), BSONObj()); vector<ShardType> allShards; Status status = getAllShards(&allShards); @@ -519,7 +527,7 @@ Status CatalogManagerReplicaSet::dropCollection(OperationContext* txn, const Nam LOG(1) << "dropCollection " << ns << " shard data deleted"; // Remove chunk data - Status result = remove(ChunkType::ConfigNS, BSON(ChunkType::ns(ns.ns())), 0, nullptr); + Status result = remove(txn, ChunkType::ConfigNS, BSON(ChunkType::ns(ns.ns())), 0, nullptr); if (!result.isOK()) { return result; } @@ -533,7 +541,7 @@ Status CatalogManagerReplicaSet::dropCollection(OperationContext* txn, const Nam coll.setEpoch(ChunkVersion::DROPPED().epoch()); coll.setUpdatedAt(grid.shardRegistry()->getNetwork()->now()); - result = updateCollection(ns.ns(), coll); + result = updateCollection(txn, ns.ns(), coll); if (!result.isOK()) { return result; } @@ -581,12 +589,12 @@ Status CatalogManagerReplicaSet::dropCollection(OperationContext* txn, const Nam LOG(1) << "dropCollection " << ns << " completed"; - logChange(txn->getClient()->clientAddress(true), "dropCollection", ns.ns(), BSONObj()); + logChange(txn, txn->getClient()->clientAddress(true), "dropCollection", ns.ns(), BSONObj()); return Status::OK(); } -void CatalogManagerReplicaSet::logAction(const ActionLogType& actionLog) { +void CatalogManagerReplicaSet::logAction(OperationContext* txn, const ActionLogType& actionLog) { if (_actionLogCollectionCreated.load() == 0) { BSONObj createCmd = BSON("create" << ActionLogType::ConfigNS << "capped" << true << "size" << kActionLogCollectionSize); @@ -605,13 +613,14 @@ void CatalogManagerReplicaSet::logAction(const ActionLogType& actionLog) { } } - Status result = insert(ActionLogType::ConfigNS, actionLog.toBSON(), NULL); + Status result = insert(txn, ActionLogType::ConfigNS, actionLog.toBSON(), NULL); if (!result.isOK()) { log() << "error encountered while logging action: " << result; } } -void CatalogManagerReplicaSet::logChange(const string& clientAddress, +void CatalogManagerReplicaSet::logChange(OperationContext* txn, + const string& clientAddress, const string& what, const string& ns, const BSONObj& detail) { @@ -649,14 +658,15 @@ void CatalogManagerReplicaSet::logChange(const string& clientAddress, BSONObj changeLogBSON = changeLog.toBSON(); log() << "about to log metadata event: " << changeLogBSON; - Status result = insert(ChangeLogType::ConfigNS, changeLogBSON, NULL); + Status result = insert(txn, ChangeLogType::ConfigNS, changeLogBSON, NULL); if (!result.isOK()) { warning() << "Error encountered while logging config change with ID " << changeId << ": " << result; } } -StatusWith<SettingsType> CatalogManagerReplicaSet::getGlobalSettings(const string& key) { +StatusWith<SettingsType> CatalogManagerReplicaSet::getGlobalSettings(OperationContext* txn, + const string& key) { const auto configShard = grid.shardRegistry()->getShard("config"); const auto readHost = configShard->getTargeter()->findHost(kConfigReadSelector); if (!readHost.isOK()) { @@ -696,7 +706,8 @@ StatusWith<SettingsType> CatalogManagerReplicaSet::getGlobalSettings(const strin return settingsResult; } -Status CatalogManagerReplicaSet::getDatabasesForShard(const string& shardName, +Status CatalogManagerReplicaSet::getDatabasesForShard(OperationContext* txn, + const string& shardName, vector<string>* dbs) { auto configShard = grid.shardRegistry()->getShard("config"); auto readHost = configShard->getTargeter()->findHost(kConfigReadSelector); @@ -727,7 +738,8 @@ Status CatalogManagerReplicaSet::getDatabasesForShard(const string& shardName, return Status::OK(); } -Status CatalogManagerReplicaSet::getChunks(const BSONObj& query, +Status CatalogManagerReplicaSet::getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, vector<ChunkType>* chunks, @@ -769,7 +781,8 @@ Status CatalogManagerReplicaSet::getChunks(const BSONObj& query, return Status::OK(); } -Status CatalogManagerReplicaSet::getTagsForCollection(const std::string& collectionNs, +Status CatalogManagerReplicaSet::getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) { tags->clear(); @@ -802,7 +815,8 @@ Status CatalogManagerReplicaSet::getTagsForCollection(const std::string& collect return Status::OK(); } -StatusWith<string> CatalogManagerReplicaSet::getTagForChunk(const std::string& collectionNs, +StatusWith<string> CatalogManagerReplicaSet::getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) { auto configShard = grid.shardRegistry()->getShard("config"); auto readHostStatus = configShard->getTargeter()->findHost(kConfigReadSelector); @@ -868,7 +882,8 @@ Status CatalogManagerReplicaSet::getAllShards(vector<ShardType>* shards) { return Status::OK(); } -bool CatalogManagerReplicaSet::runUserManagementWriteCommand(const std::string& commandName, +bool CatalogManagerReplicaSet::runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { @@ -885,7 +900,8 @@ bool CatalogManagerReplicaSet::runUserManagementWriteCommand(const std::string& return Command::getStatusFromCommandResult(response.getValue()).isOK(); } -bool CatalogManagerReplicaSet::runReadCommand(const std::string& dbname, +bool CatalogManagerReplicaSet::runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { BSONObjBuilder cmdBuilder; @@ -895,13 +911,15 @@ bool CatalogManagerReplicaSet::runReadCommand(const std::string& dbname, return _runReadCommand(dbname, cmdBuilder.done(), kConfigReadSelector, result); } -bool CatalogManagerReplicaSet::runUserManagementReadCommand(const std::string& dbname, +bool CatalogManagerReplicaSet::runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) { return _runReadCommand(dbname, cmdObj, kConfigPrimaryPreferredSelector, result); } -Status CatalogManagerReplicaSet::applyChunkOpsDeprecated(const BSONArray& updateOps, +Status CatalogManagerReplicaSet::applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) { BSONObj cmd = BSON("applyOps" << updateOps << "preCondition" << preCondition); auto response = _runCommandOnConfigWithNotMasterRetries("config", cmd); @@ -925,7 +943,8 @@ DistLockManager* CatalogManagerReplicaSet::getDistLockManager() { return _distLockManager.get(); } -void CatalogManagerReplicaSet::writeConfigServerDirect(const BatchedCommandRequest& batchRequest, +void CatalogManagerReplicaSet::writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& batchRequest, BatchedCommandResponse* batchResponse) { std::string dbname = batchRequest.getNS().db().toString(); invariant(dbname == "config" || dbname == "admin"); @@ -1063,7 +1082,7 @@ StatusWith<long long> CatalogManagerReplicaSet::_runCountCommandOnConfig(const H return result; } -Status CatalogManagerReplicaSet::initConfigVersion() { +Status CatalogManagerReplicaSet::initConfigVersion(OperationContext* txn) { auto versionStatus = _getConfigVersion(); if (!versionStatus.isOK()) { return versionStatus.getStatus(); @@ -1084,7 +1103,8 @@ Status CatalogManagerReplicaSet::initConfigVersion() { newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION); BSONObj versionObj(newVersion.toBSON()); - return update(VersionType::ConfigNS, + return update(txn, + VersionType::ConfigNS, versionObj, versionObj, true /* upsert*/, diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.h b/src/mongo/s/catalog/replset/catalog_manager_replica_set.h index a15e75365e0..3a9b6c51171 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.h +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.h @@ -52,9 +52,9 @@ public: return ConfigServerMode::CSRS; } - Status startup() override; + Status startup(OperationContext* txn) override; - void shutDown(bool allowNetworking) override; + void shutDown(OperationContext* txn, bool allowNetworking) override; Status shardCollection(OperationContext* txn, const std::string& ns, @@ -66,64 +66,78 @@ public: StatusWith<ShardDrainingStatus> removeShard(OperationContext* txn, const std::string& name) override; - StatusWith<OpTimePair<DatabaseType>> getDatabase(const std::string& dbName) override; + StatusWith<OpTimePair<DatabaseType>> getDatabase(OperationContext* txn, + const std::string& dbName) override; - StatusWith<OpTimePair<CollectionType>> getCollection(const std::string& collNs) override; + StatusWith<OpTimePair<CollectionType>> getCollection(OperationContext* txn, + const std::string& collNs) override; - Status getCollections(const std::string* dbName, + Status getCollections(OperationContext* txn, + const std::string* dbName, std::vector<CollectionType>* collections, repl::OpTime* optime) override; Status dropCollection(OperationContext* txn, const NamespaceString& ns) override; - Status getDatabasesForShard(const std::string& shardName, + Status getDatabasesForShard(OperationContext* txn, + const std::string& shardName, std::vector<std::string>* dbs) override; - Status getChunks(const BSONObj& query, + Status getChunks(OperationContext* txn, + const BSONObj& query, const BSONObj& sort, boost::optional<int> limit, std::vector<ChunkType>* chunks, repl::OpTime* opTime) override; - Status getTagsForCollection(const std::string& collectionNs, + Status getTagsForCollection(OperationContext* txn, + const std::string& collectionNs, std::vector<TagsType>* tags) override; - StatusWith<std::string> getTagForChunk(const std::string& collectionNs, + StatusWith<std::string> getTagForChunk(OperationContext* txn, + const std::string& collectionNs, const ChunkType& chunk) override; Status getAllShards(std::vector<ShardType>* shards) override; - bool runUserManagementWriteCommand(const std::string& commandName, + bool runUserManagementWriteCommand(OperationContext* txn, + const std::string& commandName, const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runReadCommand(const std::string& dbname, + bool runReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - bool runUserManagementReadCommand(const std::string& dbname, + bool runUserManagementReadCommand(OperationContext* txn, + const std::string& dbname, const BSONObj& cmdObj, BSONObjBuilder* result) override; - Status applyChunkOpsDeprecated(const BSONArray& updateOps, + Status applyChunkOpsDeprecated(OperationContext* txn, + const BSONArray& updateOps, const BSONArray& preCondition) override; - void logAction(const ActionLogType& actionLog) override; + void logAction(OperationContext* txn, const ActionLogType& actionLog) override; - void logChange(const std::string& clientAddress, + void logChange(OperationContext* txn, + const std::string& clientAddress, const std::string& what, const std::string& ns, const BSONObj& detail) override; - StatusWith<SettingsType> getGlobalSettings(const std::string& key) override; + StatusWith<SettingsType> getGlobalSettings(OperationContext* txn, + const std::string& key) override; - void writeConfigServerDirect(const BatchedCommandRequest& request, + void writeConfigServerDirect(OperationContext* txn, + const BatchedCommandRequest& request, BatchedCommandResponse* response) override; DistLockManager* getDistLockManager() override; - Status initConfigVersion() override; + Status initConfigVersion(OperationContext* txn) override; private: Status _checkDbDoesNotExist(const std::string& dbName, DatabaseType* db) override; diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp index 02e90693671..25144113704 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp @@ -109,8 +109,9 @@ TEST_F(LogActionTest, LogActionNoRetryAfterSuccessfulCreate) { expectedActionLog.setWhat("moved a chunk"); expectedActionLog.setDetails(boost::none, 0, 1, 1); - auto future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + auto future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); expectActionLogCreate(BSON("ok" << 1)); expectActionLogInsert(expectedActionLog); @@ -119,8 +120,9 @@ TEST_F(LogActionTest, LogActionNoRetryAfterSuccessfulCreate) { future.timed_get(kFutureTimeout); // Now log another action and confirm that we don't re-attempt to create the collection - future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); expectActionLogInsert(expectedActionLog); @@ -137,8 +139,9 @@ TEST_F(LogActionTest, LogActionNoRetryCreateIfAlreadyExists) { expectedActionLog.setWhat("moved a chunk"); expectedActionLog.setDetails(boost::none, 0, 1, 1); - auto future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + auto future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); BSONObjBuilder createResponseBuilder; Command::appendCommandStatus(createResponseBuilder, @@ -150,8 +153,9 @@ TEST_F(LogActionTest, LogActionNoRetryCreateIfAlreadyExists) { future.timed_get(kFutureTimeout); // Now log another action and confirm that we don't re-attempt to create the collection - future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); expectActionLogInsert(expectedActionLog); @@ -168,8 +172,9 @@ TEST_F(LogActionTest, LogActionCreateFailure) { expectedActionLog.setWhat("moved a chunk"); expectedActionLog.setDetails(boost::none, 0, 1, 1); - auto future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + auto future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); BSONObjBuilder createResponseBuilder; Command::appendCommandStatus(createResponseBuilder, @@ -181,8 +186,9 @@ TEST_F(LogActionTest, LogActionCreateFailure) { future.timed_get(kFutureTimeout); // Now log another action and confirm that we *do* attempt to re-create the collection - future = - launchAsync([this, &expectedActionLog] { catalogManager()->logAction(expectedActionLog); }); + future = launchAsync([this, &expectedActionLog] { + catalogManager()->logAction(operationContext(), expectedActionLog); + }); expectActionLogCreate(BSON("ok" << 1)); expectActionLogInsert(expectedActionLog); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_change_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_change_test.cpp index fae05d5aecd..3145e55ad4b 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_change_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_change_test.cpp @@ -64,8 +64,11 @@ TEST_F(LogChangeTest, NoRetryAfterSuccessfulCreate) { configTargeter()->setFindHostReturnValue(configHost); auto future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a chunk", "foo.bar", BSON("min" << 3 << "max" << 4)); + catalogManager()->logChange(operationContext(), + "client", + "moved a chunk", + "foo.bar", + BSON("min" << 3 << "max" << 4)); }); expectChangeLogCreate(configHost, BSON("ok" << 1)); @@ -81,8 +84,11 @@ TEST_F(LogChangeTest, NoRetryAfterSuccessfulCreate) { // Now log another change and confirm that we don't re-attempt to create the collection future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a second chunk", "foo.bar", BSON("min" << 4 << "max" << 5)); + catalogManager()->logChange(operationContext(), + "client", + "moved a second chunk", + "foo.bar", + BSON("min" << 4 << "max" << 5)); }); expectChangeLogInsert(configHost, @@ -101,8 +107,11 @@ TEST_F(LogChangeTest, NoRetryCreateIfAlreadyExists) { configTargeter()->setFindHostReturnValue(configHost); auto future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a chunk", "foo.bar", BSON("min" << 3 << "max" << 4)); + catalogManager()->logChange(operationContext(), + "client", + "moved a chunk", + "foo.bar", + BSON("min" << 3 << "max" << 4)); }); BSONObjBuilder createResponseBuilder; @@ -121,8 +130,11 @@ TEST_F(LogChangeTest, NoRetryCreateIfAlreadyExists) { // Now log another change and confirm that we don't re-attempt to create the collection future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a second chunk", "foo.bar", BSON("min" << 4 << "max" << 5)); + catalogManager()->logChange(operationContext(), + "client", + "moved a second chunk", + "foo.bar", + BSON("min" << 4 << "max" << 5)); }); expectChangeLogInsert(configHost, @@ -141,8 +153,11 @@ TEST_F(LogChangeTest, CreateFailure) { configTargeter()->setFindHostReturnValue(configHost); auto future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a chunk", "foo.bar", BSON("min" << 3 << "max" << 4)); + catalogManager()->logChange(operationContext(), + "client", + "moved a chunk", + "foo.bar", + BSON("min" << 3 << "max" << 4)); }); BSONObjBuilder createResponseBuilder; @@ -155,8 +170,11 @@ TEST_F(LogChangeTest, CreateFailure) { // Now log another change and confirm that we *do* attempt to create the collection future = launchAsync([this] { - catalogManager()->logChange( - "client", "moved a second chunk", "foo.bar", BSON("min" << 4 << "max" << 5)); + catalogManager()->logChange(operationContext(), + "client", + "moved a second chunk", + "foo.bar", + BSON("min" << 4 << "max" << 5)); }); expectChangeLogCreate(configHost, BSON("ok" << 1)); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp index c02fb31cd34..3cbf3cc1cd9 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp @@ -86,7 +86,8 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionExisting) { const OpTime newOpTime(Timestamp(7, 6), 5); auto future = launchAsync([this, &expectedColl] { - return assertGet(catalogManager()->getCollection(expectedColl.getNs().ns())); + return assertGet( + catalogManager()->getCollection(operationContext(), expectedColl.getNs().ns())); }); onFindWithMetadataCommand([this, &expectedColl, newOpTime]( @@ -124,7 +125,7 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionNotExisting) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); auto future = launchAsync([this] { - auto status = catalogManager()->getCollection("NonExistent"); + auto status = catalogManager()->getCollection(operationContext(), "NonExistent"); ASSERT_EQUALS(status.getStatus(), ErrorCodes::NamespaceNotFound); }); @@ -145,7 +146,7 @@ TEST_F(CatalogManagerReplSetTest, GetDatabaseExisting) { const OpTime newOpTime(Timestamp(7, 6), 5); auto future = launchAsync([this, &expectedDb] { - return assertGet(catalogManager()->getDatabase(expectedDb.getName())); + return assertGet(catalogManager()->getDatabase(operationContext(), expectedDb.getName())); }); onFindWithMetadataCommand([this, &expectedDb, newOpTime](const RemoteCommandRequest& request) { @@ -179,7 +180,7 @@ TEST_F(CatalogManagerReplSetTest, GetDatabaseNotExisting) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); auto future = launchAsync([this] { - auto dbResult = catalogManager()->getDatabase("NonExistent"); + auto dbResult = catalogManager()->getDatabase(operationContext(), "NonExistent"); ASSERT_EQ(dbResult.getStatus(), ErrorCodes::DatabaseNotFound); }); @@ -199,7 +200,8 @@ TEST_F(CatalogManagerReplSetTest, UpdateCollection) { collection.setKeyPattern(KeyPattern(BSON("_id" << 1))); auto future = launchAsync([this, collection] { - auto status = catalogManager()->updateCollection(collection.getNs().toString(), collection); + auto status = catalogManager()->updateCollection( + operationContext(), collection.getNs().toString(), collection); ASSERT_OK(status); }); @@ -220,7 +222,8 @@ TEST_F(CatalogManagerReplSetTest, UpdateCollectionNotMaster) { collection.setKeyPattern(KeyPattern(BSON("_id" << 1))); auto future = launchAsync([this, collection] { - auto status = catalogManager()->updateCollection(collection.getNs().toString(), collection); + auto status = catalogManager()->updateCollection( + operationContext(), collection.getNs().toString(), collection); ASSERT_EQUALS(ErrorCodes::NotMaster, status); }); @@ -250,7 +253,8 @@ TEST_F(CatalogManagerReplSetTest, UpdateCollectionNotMasterFromTargeter) { collection.setKeyPattern(KeyPattern(BSON("_id" << 1))); auto future = launchAsync([this, collection] { - auto status = catalogManager()->updateCollection(collection.getNs().toString(), collection); + auto status = catalogManager()->updateCollection( + operationContext(), collection.getNs().toString(), collection); ASSERT_EQUALS(ErrorCodes::NotMaster, status); }); @@ -271,7 +275,8 @@ TEST_F(CatalogManagerReplSetTest, UpdateCollectionNotMasterRetrySuccess) { collection.setKeyPattern(KeyPattern(BSON("_id" << 1))); auto future = launchAsync([this, collection] { - auto status = catalogManager()->updateCollection(collection.getNs().toString(), collection); + auto status = catalogManager()->updateCollection( + operationContext(), collection.getNs().toString(), collection); ASSERT_OK(status); }); @@ -408,8 +413,12 @@ TEST_F(CatalogManagerReplSetTest, GetChunksForNSWithSortAndLimit) { vector<ChunkType> chunks; OpTime opTime; - ASSERT_OK(catalogManager()->getChunks( - chunksQuery, BSON(ChunkType::version() << -1), 1, &chunks, &opTime)); + ASSERT_OK(catalogManager()->getChunks(operationContext(), + chunksQuery, + BSON(ChunkType::version() << -1), + 1, + &chunks, + &opTime)); ASSERT_EQ(2U, chunks.size()); ASSERT_EQ(newOpTime, opTime); @@ -457,8 +466,8 @@ TEST_F(CatalogManagerReplSetTest, GetChunksForNSNoSortNoLimit) { auto future = launchAsync([this, &chunksQuery] { vector<ChunkType> chunks; - ASSERT_OK( - catalogManager()->getChunks(chunksQuery, BSONObj(), boost::none, &chunks, nullptr)); + ASSERT_OK(catalogManager()->getChunks( + operationContext(), chunksQuery, BSONObj(), boost::none, &chunks, nullptr)); ASSERT_EQ(0U, chunks.size()); return chunks; @@ -497,8 +506,8 @@ TEST_F(CatalogManagerReplSetTest, GetChunksForNSInvalidChunk) { auto future = launchAsync([this, &chunksQuery] { vector<ChunkType> chunks; - Status status = - catalogManager()->getChunks(chunksQuery, BSONObj(), boost::none, &chunks, nullptr); + Status status = catalogManager()->getChunks( + operationContext(), chunksQuery, BSONObj(), boost::none, &chunks, nullptr); ASSERT_EQUALS(ErrorCodes::FailedToParse, status); ASSERT_EQ(0U, chunks.size()); @@ -533,7 +542,7 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementReadCommand) { auto future = launchAsync([this] { BSONObjBuilder responseBuilder; bool ok = catalogManager()->runUserManagementReadCommand( - "test", BSON("usersInfo" << 1), &responseBuilder); + operationContext(), "test", BSON("usersInfo" << 1), &responseBuilder); ASSERT_TRUE(ok); BSONObj response = responseBuilder.obj(); @@ -561,7 +570,7 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementReadCommandUnsatisfiedReadPre BSONObjBuilder responseBuilder; bool ok = catalogManager()->runUserManagementReadCommand( - "test", BSON("usersInfo" << 1), &responseBuilder); + operationContext(), "test", BSON("usersInfo" << 1), &responseBuilder); ASSERT_FALSE(ok); Status commandStatus = Command::getStatusFromCommandResult(responseBuilder.obj()); @@ -582,7 +591,8 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandDistLockHeld) { Status(ErrorCodes::LockBusy, "lock already held")); BSONObjBuilder responseBuilder; - bool ok = catalogManager()->runUserManagementWriteCommand("dropUser", + bool ok = catalogManager()->runUserManagementWriteCommand(operationContext(), + "dropUser", "test", BSON("dropUser" << "test"), @@ -607,7 +617,8 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandSuccess) { auto future = launchAsync([this] { BSONObjBuilder responseBuilder; - bool ok = catalogManager()->runUserManagementWriteCommand("dropUser", + bool ok = catalogManager()->runUserManagementWriteCommand(operationContext(), + "dropUser", "test", BSON("dropUser" << "test"), @@ -651,7 +662,8 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandNotMaster) { auto future = launchAsync([this] { BSONObjBuilder responseBuilder; - bool ok = catalogManager()->runUserManagementWriteCommand("dropUser", + bool ok = catalogManager()->runUserManagementWriteCommand(operationContext(), + "dropUser", "test", BSON("dropUser" << "test"), @@ -694,7 +706,8 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandNotMasterRetrySuc auto future = launchAsync([this] { BSONObjBuilder responseBuilder; - bool ok = catalogManager()->runUserManagementWriteCommand("dropUser", + bool ok = catalogManager()->runUserManagementWriteCommand(operationContext(), + "dropUser", "test", BSON("dropUser" << "test"), @@ -742,7 +755,8 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsBalancerDoc) { st1.setBalancerStopped(true); auto future = launchAsync([this] { - return assertGet(catalogManager()->getGlobalSettings(SettingsType::BalancerDocKey)); + return assertGet( + catalogManager()->getGlobalSettings(operationContext(), SettingsType::BalancerDocKey)); }); onFindCommand([this, st1](const RemoteCommandRequest& request) { @@ -774,7 +788,8 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsChunkSizeDoc) { st1.setChunkSizeMB(80); auto future = launchAsync([this] { - return assertGet(catalogManager()->getGlobalSettings(SettingsType::ChunkSizeDocKey)); + return assertGet( + catalogManager()->getGlobalSettings(operationContext(), SettingsType::ChunkSizeDocKey)); }); onFindCommand([this, st1](const RemoteCommandRequest& request) { @@ -801,7 +816,8 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsInvalidDoc) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); auto future = launchAsync([this] { - const auto balSettings = catalogManager()->getGlobalSettings("invalidKey"); + const auto balSettings = + catalogManager()->getGlobalSettings(operationContext(), "invalidKey"); ASSERT_EQ(balSettings.getStatus(), ErrorCodes::FailedToParse); }); @@ -833,7 +849,7 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsNonExistent) { auto future = launchAsync([this] { const auto chunkSizeSettings = - catalogManager()->getGlobalSettings(SettingsType::ChunkSizeDocKey); + catalogManager()->getGlobalSettings(operationContext(), SettingsType::ChunkSizeDocKey); ASSERT_EQ(chunkSizeSettings.getStatus(), ErrorCodes::NoMatchingDocument); }); @@ -890,7 +906,8 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsValidResultsNoDb) { vector<CollectionType> collections; OpTime opTime; - const auto status = catalogManager()->getCollections(nullptr, &collections, &opTime); + const auto status = + catalogManager()->getCollections(operationContext(), nullptr, &collections, &opTime); ASSERT_OK(status); ASSERT_EQ(newOpTime, opTime); @@ -949,7 +966,8 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsValidResultsWithDb) { string dbName = "test"; vector<CollectionType> collections; - const auto status = catalogManager()->getCollections(&dbName, &collections, nullptr); + const auto status = + catalogManager()->getCollections(operationContext(), &dbName, &collections, nullptr); ASSERT_OK(status); return collections; @@ -988,7 +1006,8 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsInvalidCollectionType) { string dbName = "test"; vector<CollectionType> collections; - const auto status = catalogManager()->getCollections(&dbName, &collections, nullptr); + const auto status = + catalogManager()->getCollections(operationContext(), &dbName, &collections, nullptr); ASSERT_EQ(ErrorCodes::FailedToParse, status); ASSERT_EQ(0U, collections.size()); @@ -1041,7 +1060,8 @@ TEST_F(CatalogManagerReplSetTest, GetDatabasesForShardValid) { auto future = launchAsync([this] { vector<string> dbs; - const auto status = catalogManager()->getDatabasesForShard("shard0000", &dbs); + const auto status = + catalogManager()->getDatabasesForShard(operationContext(), "shard0000", &dbs); ASSERT_OK(status); return dbs; @@ -1075,7 +1095,8 @@ TEST_F(CatalogManagerReplSetTest, GetDatabasesForShardInvalidDoc) { auto future = launchAsync([this] { vector<string> dbs; - const auto status = catalogManager()->getDatabasesForShard("shard0000", &dbs); + const auto status = + catalogManager()->getDatabasesForShard(operationContext(), "shard0000", &dbs); ASSERT_EQ(ErrorCodes::TypeMismatch, status); ASSERT_EQ(0U, dbs.size()); @@ -1113,7 +1134,8 @@ TEST_F(CatalogManagerReplSetTest, GetTagsForCollection) { auto future = launchAsync([this] { vector<TagsType> tags; - ASSERT_OK(catalogManager()->getTagsForCollection("TestDB.TestColl", &tags)); + ASSERT_OK( + catalogManager()->getTagsForCollection(operationContext(), "TestDB.TestColl", &tags)); ASSERT_EQ(2U, tags.size()); return tags; @@ -1147,7 +1169,8 @@ TEST_F(CatalogManagerReplSetTest, GetTagsForCollectionNoTags) { auto future = launchAsync([this] { vector<TagsType> tags; - ASSERT_OK(catalogManager()->getTagsForCollection("TestDB.TestColl", &tags)); + ASSERT_OK( + catalogManager()->getTagsForCollection(operationContext(), "TestDB.TestColl", &tags)); ASSERT_EQ(0U, tags.size()); return tags; @@ -1163,7 +1186,8 @@ TEST_F(CatalogManagerReplSetTest, GetTagsForCollectionInvalidTag) { auto future = launchAsync([this] { vector<TagsType> tags; - Status status = catalogManager()->getTagsForCollection("TestDB.TestColl", &tags); + Status status = + catalogManager()->getTagsForCollection(operationContext(), "TestDB.TestColl", &tags); ASSERT_EQUALS(ErrorCodes::FailedToParse, status); ASSERT_EQ(0U, tags.size()); @@ -1200,8 +1224,9 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkOneTagFound) { chunk.setShard("shard0000"); ASSERT_OK(chunk.validate()); - auto future = launchAsync( - [this, chunk] { return assertGet(catalogManager()->getTagForChunk("test.coll", chunk)); }); + auto future = launchAsync([this, chunk] { + return assertGet(catalogManager()->getTagForChunk(operationContext(), "test.coll", chunk)); + }); onFindCommand([this, chunk](const RemoteCommandRequest& request) { ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); @@ -1244,8 +1269,9 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkNoTagFound) { chunk.setShard("shard0000"); ASSERT_OK(chunk.validate()); - auto future = launchAsync( - [this, chunk] { return assertGet(catalogManager()->getTagForChunk("test.coll", chunk)); }); + auto future = launchAsync([this, chunk] { + return assertGet(catalogManager()->getTagForChunk(operationContext(), "test.coll", chunk)); + }); onFindCommand([this, chunk](const RemoteCommandRequest& request) { ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); @@ -1283,7 +1309,8 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkInvalidTagDoc) { ASSERT_OK(chunk.validate()); auto future = launchAsync([this, chunk] { - const auto tagResult = catalogManager()->getTagForChunk("test.coll", chunk); + const auto tagResult = + catalogManager()->getTagForChunk(operationContext(), "test.coll", chunk); ASSERT_EQ(ErrorCodes::FailedToParse, tagResult.getStatus()); }); @@ -1321,7 +1348,7 @@ TEST_F(CatalogManagerReplSetTest, UpdateDatabase) { dbt.setSharded(true); auto future = launchAsync([this, dbt] { - auto status = catalogManager()->updateDatabase(dbt.getName(), dbt); + auto status = catalogManager()->updateDatabase(operationContext(), dbt.getName(), dbt); ASSERT_OK(status); }); @@ -1364,7 +1391,7 @@ TEST_F(CatalogManagerReplSetTest, UpdateDatabaseHostUnreachable) { dbt.setSharded(false); auto future = launchAsync([this, dbt] { - auto status = catalogManager()->updateDatabase(dbt.getName(), dbt); + auto status = catalogManager()->updateDatabase(operationContext(), dbt.getName(), dbt); ASSERT_EQ(ErrorCodes::HostUnreachable, status); }); @@ -1396,7 +1423,8 @@ TEST_F(CatalogManagerReplSetTest, ApplyChunkOpsDeprecated) { << "second precondition")); auto future = launchAsync([this, updateOps, preCondition] { - auto status = catalogManager()->applyChunkOpsDeprecated(updateOps, preCondition); + auto status = + catalogManager()->applyChunkOpsDeprecated(operationContext(), updateOps, preCondition); ASSERT_OK(status); }); @@ -1428,7 +1456,8 @@ TEST_F(CatalogManagerReplSetTest, ApplyChunkOpsDeprecatedCommandFailed) { << "second precondition")); auto future = launchAsync([this, updateOps, preCondition] { - auto status = catalogManager()->applyChunkOpsDeprecated(updateOps, preCondition); + auto status = + catalogManager()->applyChunkOpsDeprecated(operationContext(), updateOps, preCondition); ASSERT_EQUALS(ErrorCodes::BadValue, status); }); @@ -1507,7 +1536,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseSuccess) { future = launchAsync([this, dbname] { - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_OK(status); }); @@ -1607,7 +1636,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDistLockHeld) { }, Status(ErrorCodes::LockBusy, "lock already held")); - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_EQUALS(ErrorCodes::LockBusy, status); } @@ -1625,7 +1654,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDBExists) { auto future = launchAsync([this, dbname] { - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_EQUALS(ErrorCodes::NamespaceExists, status); }); @@ -1664,7 +1693,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDBExistsDifferentCase) { auto future = launchAsync([this, dbname] { - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_EQUALS(ErrorCodes::DatabaseDifferCase, status); }); @@ -1702,7 +1731,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseNoShards) { auto future = launchAsync([this, dbname] { - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_EQUALS(ErrorCodes::ShardNotFound, status); }); @@ -1791,7 +1820,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDuplicateKeyOnInsert) { future = launchAsync([this, dbname] { - Status status = catalogManager()->createDatabase(dbname); + Status status = catalogManager()->createDatabase(operationContext(), dbname); ASSERT_EQUALS(ErrorCodes::NamespaceExists, status); }); @@ -1903,7 +1932,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingNoDBExists) { Status::OK()); auto future = launchAsync([this] { - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_OK(status); }); @@ -1983,7 +2012,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingLockBusy) { [](StringData, StringData, stdx::chrono::milliseconds, stdx::chrono::milliseconds) {}, {ErrorCodes::LockBusy, "lock taken"}); - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_EQ(ErrorCodes::LockBusy, status.code()); } @@ -2002,7 +2031,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingDBExistsWithDifferentCase) { Status::OK()); auto future = launchAsync([this] { - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_EQ(ErrorCodes::DatabaseDifferCase, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -2031,7 +2060,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingDBExists) { Status::OK()); auto future = launchAsync([this] { - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_OK(status); }); @@ -2088,7 +2117,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingDBExistsInvalidFormat) { Status::OK()); auto future = launchAsync([this] { - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_EQ(ErrorCodes::TypeMismatch, status.code()); }); @@ -2110,7 +2139,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingNoDBExistsNoShards) { Status::OK()); auto future = launchAsync([this] { - auto status = catalogManager()->enableSharding("test"); + auto status = catalogManager()->enableSharding(operationContext(), "test"); ASSERT_EQ(ErrorCodes::ShardNotFound, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -2131,8 +2160,8 @@ TEST_F(CatalogManagerReplSetTest, BasicReadAfterOpTime) { for (int x = 0; x < 3; x++) { auto future = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE( - catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); const OpTime newOpTime(Timestamp(x + 2, x + 6), x + 5); @@ -2165,7 +2194,8 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { // Initialize the internal config OpTime auto future1 = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE(catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); OpTime highestOpTime; @@ -2193,7 +2223,8 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { // Return an older OpTime auto future2 = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE(catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); const OpTime oldOpTime(Timestamp(3, 10), 5); @@ -2218,7 +2249,8 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { // Check that older OpTime does not override highest OpTime auto future3 = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE(catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); onCommandWithMetadata([this, &oldOpTime, &highestOpTime](const RemoteCommandRequest& request) { @@ -2242,8 +2274,9 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeFindThenCmd) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); - auto future1 = launchAsync( - [this] { ASSERT_OK(catalogManager()->getGlobalSettings("chunksize").getStatus()); }); + auto future1 = launchAsync([this] { + ASSERT_OK(catalogManager()->getGlobalSettings(operationContext(), "chunksize").getStatus()); + }); OpTime highestOpTime; const OpTime newOpTime(Timestamp(7, 6), 5); @@ -2271,7 +2304,8 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeFindThenCmd) { // Return an older OpTime auto future2 = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE(catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); const OpTime oldOpTime(Timestamp(3, 10), 5); @@ -2296,7 +2330,8 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeCmdThenFind) { // Initialize the internal config OpTime auto future1 = launchAsync([this] { BSONObjBuilder responseBuilder; - ASSERT_TRUE(catalogManager()->runReadCommand("test", BSON("dummy" << 1), &responseBuilder)); + ASSERT_TRUE(catalogManager()->runReadCommand( + operationContext(), "test", BSON("dummy" << 1), &responseBuilder)); }); OpTime highestOpTime; @@ -2322,8 +2357,9 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeCmdThenFind) { highestOpTime = newOpTime; // Return an older OpTime - auto future2 = launchAsync( - [this] { ASSERT_OK(catalogManager()->getGlobalSettings("chunksize").getStatus()); }); + auto future2 = launchAsync([this] { + ASSERT_OK(catalogManager()->getGlobalSettings(operationContext(), "chunksize").getStatus()); + }); const OpTime oldOpTime(Timestamp(3, 10), 5); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp index ebc77d46b13..b4294394dfb 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp @@ -52,7 +52,8 @@ using CatalogManagerReplSetTest = CatalogManagerReplSetTestFixture; TEST_F(CatalogManagerReplSetTestFixture, UpgradeNotNeeded) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); - auto future = launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion()); }); + auto future = + launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion(operationContext())); }); onFindCommand([this](const RemoteCommandRequest& request) { ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); @@ -81,7 +82,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeTargetError) { configTargeter()->setFindHostReturnValue({ErrorCodes::InternalError, "Bad test network"}); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::InternalError, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -93,7 +94,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeClusterMultiVersion) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::RemoteValidationError, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -124,7 +125,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeInvalidConfigVersionDoc) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::UnsupportedFormat, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -146,7 +147,8 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeInvalidConfigVersionDoc) { TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfig) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); - auto future = launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion()); }); + auto future = + launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion(operationContext())); }); onFindCommand([](const RemoteCommandRequest& request) { return vector<BSONObj>{}; }); @@ -209,7 +211,8 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfig) { TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfigWithAdmin) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); - auto future = launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion()); }); + auto future = + launchAsync([this] { ASSERT_OK(catalogManager()->initConfigVersion(operationContext())); }); onFindCommand([](const RemoteCommandRequest& request) { return vector<BSONObj>{}; }); @@ -255,7 +258,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeWriteError) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::DuplicateKey, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -298,7 +301,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocNonEmptyConfigServer configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::IncompatibleShardingConfigVersion, status.code()); ASSERT_FALSE(status.reason().empty()); }); @@ -329,7 +332,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeTooOld) { configTargeter()->setFindHostReturnValue(HostAndPort("config:123")); auto future = launchAsync([this] { - auto status = catalogManager()->initConfigVersion(); + auto status = catalogManager()->initConfigVersion(operationContext()); ASSERT_EQ(ErrorCodes::IncompatibleShardingConfigVersion, status.code()); ASSERT_FALSE(status.reason().empty()); }); diff --git a/src/mongo/s/chunk.cpp b/src/mongo/s/chunk.cpp index da6cbc196df..ffe7f865650 100644 --- a/src/mongo/s/chunk.cpp +++ b/src/mongo/s/chunk.cpp @@ -95,7 +95,8 @@ bool tryMoveToOtherShard(OperationContext* txn, map<string, vector<ChunkType>> shardToChunkMap; DistributionStatus::populateShardToChunksMap(shardInfo, *chunkMgr, &shardToChunkMap); - StatusWith<string> tagStatus = grid.catalogManager(txn)->getTagForChunk(manager.getns(), chunk); + StatusWith<string> tagStatus = + grid.catalogManager(txn)->getTagForChunk(txn, manager.getns(), chunk); if (!tagStatus.isOK()) { warning() << "Not auto-moving chunk because of an error encountered while " << "checking tag for chunk: " << tagStatus.getStatus(); @@ -580,7 +581,7 @@ bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) const { bool shouldBalance = grid.getConfigShouldBalance(txn); if (shouldBalance) { - auto status = grid.catalogManager(txn)->getCollection(_manager->getns()); + auto status = grid.catalogManager(txn)->getCollection(txn, _manager->getns()); if (!status.isOK()) { log() << "Auto-split for " << _manager->getns() << " failed to load collection metadata due to " << status.getStatus(); @@ -707,7 +708,8 @@ void Chunk::markAsJumbo(OperationContext* txn) const { // at least this mongos won't try and keep moving _jumbo = true; - Status result = grid.catalogManager(txn)->update(ChunkType::ConfigNS, + Status result = grid.catalogManager(txn)->update(txn, + ChunkType::ConfigNS, BSON(ChunkType::name(genID())), BSON("$set" << BSON(ChunkType::jumbo(true))), false, // upsert @@ -720,7 +722,7 @@ void Chunk::markAsJumbo(OperationContext* txn) const { void Chunk::refreshChunkSize(OperationContext* txn) { auto chunkSizeSettingsResult = - grid.catalogManager(txn)->getGlobalSettings(SettingsType::ChunkSizeDocKey); + grid.catalogManager(txn)->getGlobalSettings(txn, SettingsType::ChunkSizeDocKey); if (!chunkSizeSettingsResult.isOK()) { log() << chunkSizeSettingsResult.getStatus(); return; diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp index e98b6259ccf..e9465705e3a 100644 --- a/src/mongo/s/chunk_manager.cpp +++ b/src/mongo/s/chunk_manager.cpp @@ -264,7 +264,7 @@ bool ChunkManager::_load(OperationContext* txn, repl::OpTime opTime; std::vector<ChunkType> chunks; uassertStatusOK(grid.catalogManager(txn)->getChunks( - diffQuery.query, diffQuery.sort, boost::none, &chunks, &opTime)); + txn, diffQuery.query, diffQuery.sort, boost::none, &chunks, &opTime)); invariant(opTime >= _configOpTime); _configOpTime = opTime; @@ -426,8 +426,13 @@ void ChunkManager::createFirstChunks(OperationContext* txn, BSONObj chunkObj = chunkBuilder.obj(); - Status result = grid.catalogManager(txn)->update( - ChunkType::ConfigNS, BSON(ChunkType::name(temp.genID())), chunkObj, true, false, NULL); + Status result = grid.catalogManager(txn)->update(txn, + ChunkType::ConfigNS, + BSON(ChunkType::name(temp.genID())), + chunkObj, + true, + false, + NULL); version.incMinor(); diff --git a/src/mongo/s/cluster_write.cpp b/src/mongo/s/cluster_write.cpp index 459960b83cd..4660e8dbabd 100644 --- a/src/mongo/s/cluster_write.cpp +++ b/src/mongo/s/cluster_write.cpp @@ -244,7 +244,7 @@ void ClusterWriter::write(OperationContext* txn, const string dbName = nss.db().toString(); if (dbName == "config" || dbName == "admin") { - grid.catalogManager(txn)->writeConfigServerDirect(request, response); + grid.catalogManager(txn)->writeConfigServerDirect(txn, request, response); } else { ChunkManagerTargeter targeter(request.getTargetingNSS()); Status targetInitStatus = targeter.init(txn); diff --git a/src/mongo/s/commands/cluster_enable_sharding_cmd.cpp b/src/mongo/s/commands/cluster_enable_sharding_cmd.cpp index 37ef726dfb1..49bdcdba2b4 100644 --- a/src/mongo/s/commands/cluster_enable_sharding_cmd.cpp +++ b/src/mongo/s/commands/cluster_enable_sharding_cmd.cpp @@ -104,7 +104,7 @@ public: return false; } - Status status = grid.catalogManager(txn)->enableSharding(dbname); + Status status = grid.catalogManager(txn)->enableSharding(txn, dbname); if (status.isOK()) { audit::logEnableSharding(ClientBasic::getCurrent(), dbname); } diff --git a/src/mongo/s/commands/cluster_list_databases_cmd.cpp b/src/mongo/s/commands/cluster_list_databases_cmd.cpp index 213bcc17b1c..0878123bc39 100644 --- a/src/mongo/s/commands/cluster_list_databases_cmd.cpp +++ b/src/mongo/s/commands/cluster_list_databases_cmd.cpp @@ -163,7 +163,7 @@ public: // get config db from the config servers BSONObjBuilder builder; - if (!catalogManager->runReadCommand("config", BSON("dbstats" << 1), &builder)) { + if (!catalogManager->runReadCommand(txn, "config", BSON("dbstats" << 1), &builder)) { bb.append(BSON("name" << "config")); } else { @@ -184,7 +184,7 @@ public: // get admin db from the config servers BSONObjBuilder builder; - if (!catalogManager->runReadCommand("admin", BSON("dbstats" << 1), &builder)) { + if (!catalogManager->runReadCommand(txn, "admin", BSON("dbstats" << 1), &builder)) { bb.append(BSON("name" << "admin")); } else { diff --git a/src/mongo/s/commands/cluster_map_reduce_cmd.cpp b/src/mongo/s/commands/cluster_map_reduce_cmd.cpp index 7e082246040..728ebc76bd7 100644 --- a/src/mongo/s/commands/cluster_map_reduce_cmd.cpp +++ b/src/mongo/s/commands/cluster_map_reduce_cmd.cpp @@ -455,6 +455,7 @@ public: { // Take distributed lock to prevent split / migration. auto scopedDistLock = grid.catalogManager(txn)->distLock( + txn, finalColLong, "mr-post-process", stdx::chrono::milliseconds(-1), // retry indefinitely diff --git a/src/mongo/s/commands/cluster_move_primary_cmd.cpp b/src/mongo/s/commands/cluster_move_primary_cmd.cpp index 609dd8b09dc..dff18f954c2 100644 --- a/src/mongo/s/commands/cluster_move_primary_cmd.cpp +++ b/src/mongo/s/commands/cluster_move_primary_cmd.cpp @@ -147,7 +147,7 @@ public: string whyMessage(str::stream() << "Moving primary shard of " << dbname); auto catalogManager = grid.catalogManager(txn); - auto scopedDistLock = catalogManager->distLock(dbname + "-movePrimary", whyMessage); + auto scopedDistLock = catalogManager->distLock(txn, dbname + "-movePrimary", whyMessage); if (!scopedDistLock.isOK()) { return appendCommandStatus(result, scopedDistLock.getStatus()); @@ -160,8 +160,11 @@ public: BSONObj moveStartDetails = _buildMoveEntry(dbname, fromShard->toString(), toShard->toString(), shardedColls); - catalogManager->logChange( - txn->getClient()->clientAddress(true), "movePrimary.start", dbname, moveStartDetails); + catalogManager->logChange(txn, + txn->getClient()->clientAddress(true), + "movePrimary.start", + dbname, + moveStartDetails); BSONArrayBuilder barr; barr.append(shardedColls); @@ -240,7 +243,7 @@ public: _buildMoveEntry(dbname, oldPrimary, toShard->toString(), shardedColls); catalogManager->logChange( - txn->getClient()->clientAddress(true), "movePrimary", dbname, moveFinishDetails); + txn, txn->getClient()->clientAddress(true), "movePrimary", dbname, moveFinishDetails); return true; } diff --git a/src/mongo/s/commands/cluster_remove_shard_cmd.cpp b/src/mongo/s/commands/cluster_remove_shard_cmd.cpp index 75af3d2ed9d..a9ad5bd122d 100644 --- a/src/mongo/s/commands/cluster_remove_shard_cmd.cpp +++ b/src/mongo/s/commands/cluster_remove_shard_cmd.cpp @@ -102,7 +102,7 @@ public: } vector<string> databases; - catalogManager->getDatabasesForShard(s->getId(), &databases); + catalogManager->getDatabasesForShard(txn, s->getId(), &databases); // Get BSONObj containing: // 1) note about moving or dropping databases in a shard @@ -132,7 +132,8 @@ public: break; case ShardDrainingStatus::ONGOING: { vector<ChunkType> chunks; - Status status = catalogManager->getChunks(BSON(ChunkType::shard(s->getId())), + Status status = catalogManager->getChunks(txn, + BSON(ChunkType::shard(s->getId())), BSONObj(), boost::none, // return all &chunks, diff --git a/src/mongo/s/commands/cluster_user_management_commands.cpp b/src/mongo/s/commands/cluster_user_management_commands.cpp index 7985a305503..75fca86dc7a 100644 --- a/src/mongo/s/commands/cluster_user_management_commands.cpp +++ b/src/mongo/s/commands/cluster_user_management_commands.cpp @@ -79,7 +79,7 @@ public: string& errmsg, BSONObjBuilder& result) { return grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + ->runUserManagementWriteCommand(txn, this->name, dbname, cmdObj, &result); } virtual void redactForLogging(mutablebson::Document* cmdObj) { @@ -121,8 +121,8 @@ public: if (!status.isOK()) { return appendCommandStatus(result, status); } - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -172,8 +172,8 @@ public: if (!status.isOK()) { return appendCommandStatus(result, status); } - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -212,8 +212,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -260,8 +260,8 @@ public: if (!status.isOK()) { return appendCommandStatus(result, status); } - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -308,8 +308,8 @@ public: if (!status.isOK()) { return appendCommandStatus(result, status); } - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -352,7 +352,7 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - return grid.catalogManager(txn)->runUserManagementReadCommand(dbname, cmdObj, &result); + return grid.catalogManager(txn)->runUserManagementReadCommand(txn, dbname, cmdObj, &result); } } cmdUsersInfo; @@ -386,7 +386,7 @@ public: string& errmsg, BSONObjBuilder& result) { return grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + ->runUserManagementWriteCommand(txn, this->name, dbname, cmdObj, &result); } } cmdCreateRole; @@ -419,8 +419,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -459,8 +459,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -499,8 +499,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -539,8 +539,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -579,8 +579,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -622,8 +622,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -666,8 +666,8 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - const bool ok = grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + const bool ok = grid.catalogManager(txn)->runUserManagementWriteCommand( + txn, this->name, dbname, cmdObj, &result); AuthorizationManager* authzManager = getGlobalAuthorizationManager(); invariant(authzManager); @@ -710,7 +710,7 @@ public: int options, string& errmsg, BSONObjBuilder& result) { - return grid.catalogManager(txn)->runUserManagementReadCommand(dbname, cmdObj, &result); + return grid.catalogManager(txn)->runUserManagementReadCommand(txn, dbname, cmdObj, &result); } } cmdRolesInfo; @@ -798,7 +798,7 @@ public: string& errmsg, BSONObjBuilder& result) { return grid.catalogManager(txn) - ->runUserManagementWriteCommand(this->name, dbname, cmdObj, &result); + ->runUserManagementWriteCommand(txn, this->name, dbname, cmdObj, &result); } } cmdMergeAuthzCollections; diff --git a/src/mongo/s/config.cpp b/src/mongo/s/config.cpp index dc1560c20a2..6d4977089d0 100644 --- a/src/mongo/s/config.cpp +++ b/src/mongo/s/config.cpp @@ -132,7 +132,7 @@ void CollectionInfo::save(OperationContext* txn, const string& ns) { coll.setUpdatedAt(Date_t::now()); } - uassertStatusOK(grid.catalogManager(txn)->updateCollection(ns, coll)); + uassertStatusOK(grid.catalogManager(txn)->updateCollection(txn, ns, coll)); _dirty = false; } @@ -317,7 +317,8 @@ std::shared_ptr<ChunkManager> DBConfig::getChunkManager(OperationContext* txn, vector<ChunkType> newestChunk; if (oldVersion.isSet() && !forceReload) { uassertStatusOK( - grid.catalogManager(txn)->getChunks(BSON(ChunkType::ns(ns)), + grid.catalogManager(txn)->getChunks(txn, + BSON(ChunkType::ns(ns)), BSON(ChunkType::DEPRECATED_lastmod() << -1), 1, &newestChunk, @@ -440,7 +441,7 @@ bool DBConfig::load(OperationContext* txn) { } bool DBConfig::_load(OperationContext* txn) { - auto status = grid.catalogManager(txn)->getDatabase(_name); + auto status = grid.catalogManager(txn)->getDatabase(txn, _name); if (status == ErrorCodes::DatabaseNotFound) { return false; } @@ -461,7 +462,7 @@ bool DBConfig::_load(OperationContext* txn) { vector<CollectionType> collections; repl::OpTime configOpTimeWhenLoadingColl; uassertStatusOK(grid.catalogManager(txn) - ->getCollections(&_name, &collections, &configOpTimeWhenLoadingColl)); + ->getCollections(txn, &_name, &collections, &configOpTimeWhenLoadingColl)); int numCollsErased = 0; int numCollsSharded = 0; @@ -497,7 +498,7 @@ void DBConfig::_save(OperationContext* txn, bool db, bool coll) { dbt.setPrimary(_primaryId); dbt.setSharded(_shardingEnabled); - uassertStatusOK(grid.catalogManager(txn)->updateDatabase(_name, dbt)); + uassertStatusOK(grid.catalogManager(txn)->updateDatabase(txn, _name, dbt)); } if (coll) { @@ -537,14 +538,14 @@ bool DBConfig::dropDatabase(OperationContext* txn, string& errmsg) { */ log() << "DBConfig::dropDatabase: " << _name; - grid.catalogManager(txn) - ->logChange(txn->getClient()->clientAddress(true), "dropDatabase.start", _name, BSONObj()); + grid.catalogManager(txn)->logChange( + txn, txn->getClient()->clientAddress(true), "dropDatabase.start", _name, BSONObj()); // 1 grid.catalogCache()->invalidate(_name); - Status result = grid.catalogManager(txn) - ->remove(DatabaseType::ConfigNS, BSON(DatabaseType::name(_name)), 0, NULL); + Status result = grid.catalogManager(txn)->remove( + txn, DatabaseType::ConfigNS, BSON(DatabaseType::name(_name)), 0, NULL); if (!result.isOK()) { errmsg = result.reason(); log() << "could not drop '" << _name << "': " << errmsg; @@ -600,7 +601,7 @@ bool DBConfig::dropDatabase(OperationContext* txn, string& errmsg) { LOG(1) << "\t dropped primary db for: " << _name; grid.catalogManager(txn) - ->logChange(txn->getClient()->clientAddress(true), "dropDatabase", _name, BSONObj()); + ->logChange(txn, txn->getClient()->clientAddress(true), "dropDatabase", _name, BSONObj()); return true; } @@ -679,7 +680,7 @@ void DBConfig::getAllShardedCollections(set<string>& namespaces) { void ConfigServer::reloadSettings(OperationContext* txn) { auto catalogManager = grid.catalogManager(txn); - auto chunkSizeResult = catalogManager->getGlobalSettings(SettingsType::ChunkSizeDocKey); + auto chunkSizeResult = catalogManager->getGlobalSettings(txn, SettingsType::ChunkSizeDocKey); if (chunkSizeResult.isOK()) { const int csize = chunkSizeResult.getValue().getChunkSizeMB(); LOG(1) << "Found MaxChunkSize: " << csize; @@ -690,7 +691,8 @@ void ConfigServer::reloadSettings(OperationContext* txn) { } else if (chunkSizeResult.getStatus() == ErrorCodes::NoMatchingDocument) { const int chunkSize = Chunk::MaxChunkSize / (1024 * 1024); Status result = - grid.catalogManager(txn)->insert(SettingsType::ConfigNS, + grid.catalogManager(txn)->insert(txn, + SettingsType::ConfigNS, BSON(SettingsType::key(SettingsType::ChunkSizeDocKey) << SettingsType::chunkSizeMB(chunkSize)), NULL); @@ -801,7 +803,8 @@ void ConfigServer::replicaSetChange(const string& setName, const string& newConn fassertStatusOK(28783, ConnectionString::parse(newConnectionString))); } else { Status result = grid.catalogManager(txn.get()) - ->update(ShardType::ConfigNS, + ->update(txn.get(), + ShardType::ConfigNS, BSON(ShardType::name(s->getId())), BSON("$set" << BSON(ShardType::host(newConnectionString))), false, // upsert diff --git a/src/mongo/s/d_merge.cpp b/src/mongo/s/d_merge.cpp index 4a2aaefe708..d4cbce0df57 100644 --- a/src/mongo/s/d_merge.cpp +++ b/src/mongo/s/d_merge.cpp @@ -70,7 +70,7 @@ bool mergeChunks(OperationContext* txn, // Get the distributed lock string whyMessage = stream() << "merging chunks in " << nss.ns() << " from " << minKey << " to " << maxKey; - auto scopedDistLock = grid.catalogManager(txn)->distLock(nss.ns(), whyMessage); + auto scopedDistLock = grid.catalogManager(txn)->distLock(txn, nss.ns(), whyMessage); if (!scopedDistLock.isOK()) { *errMsg = stream() << "could not acquire collection lock for " << nss.ns() @@ -254,7 +254,7 @@ bool mergeChunks(OperationContext* txn, BSONObj mergeLogEntry = buildMergeLogEntry(chunksToMerge, shardVersion, mergeVersion); grid.catalogManager(txn) - ->logChange(txn->getClient()->clientAddress(true), "merge", nss.ns(), mergeLogEntry); + ->logChange(txn, txn->getClient()->clientAddress(true), "merge", nss.ns(), mergeLogEntry); return true; } @@ -355,6 +355,6 @@ Status runApplyOpsCmd(OperationContext* txn, } BSONArray preCond = buildOpPrecond(firstChunk.getNS(), firstChunk.getShard(), currShardVersion); - return grid.catalogManager(txn)->applyChunkOpsDeprecated(updatesB.arr(), preCond); + return grid.catalogManager(txn)->applyChunkOpsDeprecated(txn, updatesB.arr(), preCond); } } diff --git a/src/mongo/s/d_migrate.cpp b/src/mongo/s/d_migrate.cpp index 64d1043141c..f74d1b45265 100644 --- a/src/mongo/s/d_migrate.cpp +++ b/src/mongo/s/d_migrate.cpp @@ -442,7 +442,7 @@ public: string whyMessage(str::stream() << "migrating chunk [" << minKey << ", " << maxKey << ") in " << ns); - auto scopedDistLock = grid.catalogManager(txn)->distLock(ns, whyMessage); + auto scopedDistLock = grid.catalogManager(txn)->distLock(txn, ns, whyMessage); if (!scopedDistLock.isOK()) { errmsg = stream() << "could not acquire collection lock for " << ns @@ -456,8 +456,8 @@ public: BSONObj chunkInfo = BSON("min" << min << "max" << max << "from" << fromShardName << "to" << toShardName); - grid.catalogManager(txn) - ->logChange(txn->getClient()->clientAddress(true), "moveChunk.start", ns, chunkInfo); + grid.catalogManager(txn)->logChange( + txn, txn->getClient()->clientAddress(true), "moveChunk.start", ns, chunkInfo); // Always refresh our metadata remotely ChunkVersion origShardVersion; @@ -907,8 +907,8 @@ public: PrepareConfigsFailedCode); } - applyOpsStatus = - grid.catalogManager(txn)->applyChunkOpsDeprecated(updates.arr(), preCond.arr()); + applyOpsStatus = grid.catalogManager(txn) + ->applyChunkOpsDeprecated(txn, updates.arr(), preCond.arr()); if (MONGO_FAIL_POINT(failMigrationApplyOps)) { throw SocketException(SocketException::RECV_ERROR, @@ -961,7 +961,8 @@ public: try { std::vector<ChunkType> newestChunk; Status status = grid.catalogManager(txn) - ->getChunks(BSON(ChunkType::ns(ns)), + ->getChunks(txn, + BSON(ChunkType::ns(ns)), BSON(ChunkType::DEPRECATED_lastmod() << -1), 1, &newestChunk, @@ -1000,8 +1001,11 @@ public: commitInfo.appendElements(res["counts"].Obj()); } - grid.catalogManager(txn)->logChange( - txn->getClient()->clientAddress(true), "moveChunk.commit", ns, commitInfo.obj()); + grid.catalogManager(txn)->logChange(txn, + txn->getClient()->clientAddress(true), + "moveChunk.commit", + ns, + commitInfo.obj()); } shardingState->migrationSourceManager()->done(txn); diff --git a/src/mongo/s/d_split.cpp b/src/mongo/s/d_split.cpp index ad6a3f8434f..43f5c444e75 100644 --- a/src/mongo/s/d_split.cpp +++ b/src/mongo/s/d_split.cpp @@ -623,7 +623,7 @@ public: string whyMessage(str::stream() << "splitting chunk [" << minKey << ", " << maxKey << ") in " << ns); - auto scopedDistLock = grid.catalogManager(txn)->distLock(ns, whyMessage); + auto scopedDistLock = grid.catalogManager(txn)->distLock(txn, ns, whyMessage); if (!scopedDistLock.isOK()) { errmsg = str::stream() << "could not acquire collection lock for " << ns @@ -792,7 +792,7 @@ public: // 4. apply the batch of updates to remote and local metadata // Status applyOpsStatus = - grid.catalogManager(txn)->applyChunkOpsDeprecated(updates.arr(), preCond.arr()); + grid.catalogManager(txn)->applyChunkOpsDeprecated(txn, updates.arr(), preCond.arr()); if (!applyOpsStatus.isOK()) { return appendCommandStatus(result, applyOpsStatus); } @@ -828,8 +828,8 @@ public: appendShortVersion(logDetail.subobjStart("left"), *newChunks[0]); appendShortVersion(logDetail.subobjStart("right"), *newChunks[1]); - grid.catalogManager(txn) - ->logChange(txn->getClient()->clientAddress(true), "split", ns, logDetail.obj()); + grid.catalogManager(txn)->logChange( + txn, txn->getClient()->clientAddress(true), "split", ns, logDetail.obj()); } else { BSONObj beforeDetailObj = logDetail.obj(); BSONObj firstDetailObj = beforeDetailObj.getOwned(); @@ -842,8 +842,11 @@ public: chunkDetail.append("of", newChunksSize); appendShortVersion(chunkDetail.subobjStart("chunk"), *newChunks[i]); - grid.catalogManager(txn)->logChange( - txn->getClient()->clientAddress(true), "multi-split", ns, chunkDetail.obj()); + grid.catalogManager(txn)->logChange(txn, + txn->getClient()->clientAddress(true), + "multi-split", + ns, + chunkDetail.obj()); } } diff --git a/src/mongo/s/grid.cpp b/src/mongo/s/grid.cpp index c5fe9f26e63..33c6cba8eb3 100644 --- a/src/mongo/s/grid.cpp +++ b/src/mongo/s/grid.cpp @@ -68,7 +68,7 @@ StatusWith<std::shared_ptr<DBConfig>> Grid::implicitCreateDb(OperationContext* t } if (status == ErrorCodes::DatabaseNotFound) { - auto statusCreateDb = catalogManager(txn)->createDatabase(dbName); + auto statusCreateDb = catalogManager(txn)->createDatabase(txn, dbName); if (statusCreateDb.isOK() || statusCreateDb == ErrorCodes::NamespaceExists) { return catalogCache()->getDatabase(txn, dbName); } @@ -106,7 +106,7 @@ bool Grid::shouldBalance(const SettingsType& balancerSettings) const { bool Grid::getConfigShouldBalance(OperationContext* txn) const { auto balSettingsResult = - grid.catalogManager(txn)->getGlobalSettings(SettingsType::BalancerDocKey); + grid.catalogManager(txn)->getGlobalSettings(txn, SettingsType::BalancerDocKey); if (!balSettingsResult.isOK()) { warning() << balSettingsResult.getStatus(); return false; diff --git a/src/mongo/s/grid.h b/src/mongo/s/grid.h index 927c454e2e5..0eeaa2de3db 100644 --- a/src/mongo/s/grid.h +++ b/src/mongo/s/grid.h @@ -93,8 +93,8 @@ public: */ bool getConfigShouldBalance(OperationContext* txn) const; - ForwardingCatalogManager* catalogManager(OperationContext* txn); - ForwardingCatalogManager* catalogManager(); // TODO(spencer): remove + ForwardingCatalogManager* catalogManager(OperationContext* txn); // TODO(spencer): remove + ForwardingCatalogManager* catalogManager(); CatalogCache* catalogCache() { return _catalogCache.get(); diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp index 7de16a4d739..cc627cdf324 100644 --- a/src/mongo/s/server.cpp +++ b/src/mongo/s/server.cpp @@ -203,12 +203,12 @@ static Status initializeSharding(OperationContext* txn) { } auto catalogManager = grid.catalogManager(txn); - status = catalogManager->initConfigVersion(); + status = catalogManager->initConfigVersion(txn); if (!status.isOK()) { return status; } - status = catalogManager->startup(); + status = catalogManager->startup(txn); if (!status.isOK()) { return status; } @@ -447,7 +447,7 @@ void mongo::exitCleanly(ExitCode code) { } auto catalogMgr = grid.catalogManager(txn); - catalogMgr->shutDown(); + catalogMgr->shutDown(txn); } mongo::dbexit(code); |