summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorSpencer T Brody <spencer@mongodb.com>2015-08-19 16:46:53 -0400
committerSpencer T Brody <spencer@mongodb.com>2015-08-25 12:56:27 -0400
commiteb0430ee860d22b164cd603ce7186842f72c8537 (patch)
tree86064e9a015fa76e537eba6640dc6e37da0067f5 /src/mongo
parent0931a7e2eff3fcb6c8b06b0649069fbb625d05ae (diff)
downloadmongo-eb0430ee860d22b164cd603ce7186842f72c8537.tar.gz
SERVER-19875 Make (almost) all CatalogManager methods take OperationContext
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/db/auth/authz_manager_external_state_s.cpp18
-rw-r--r--src/mongo/db/auth/user_cache_invalidator_job.cpp2
-rw-r--r--src/mongo/db/instance.cpp2
-rw-r--r--src/mongo/db/s/collection_metadata_test.cpp16
-rw-r--r--src/mongo/db/s/metadata_loader.cpp17
-rw-r--r--src/mongo/db/s/metadata_loader.h10
-rw-r--r--src/mongo/db/s/metadata_loader_test.cpp75
-rw-r--r--src/mongo/db/s/migration_destination_manager.cpp7
-rw-r--r--src/mongo/db/s/sharding_state.cpp3
-rw-r--r--src/mongo/dbtests/config_upgrade_tests.cpp4
-rw-r--r--src/mongo/s/balance.cpp25
-rw-r--r--src/mongo/s/catalog/catalog_cache.cpp2
-rw-r--r--src/mongo/s/catalog/catalog_manager.cpp15
-rw-r--r--src/mongo/s/catalog/catalog_manager.h73
-rw-r--r--src/mongo/s/catalog/catalog_manager_common.cpp29
-rw-r--r--src/mongo/s/catalog/catalog_manager_common.h12
-rw-r--r--src/mongo/s/catalog/catalog_manager_mock.cpp59
-rw-r--r--src/mongo/s/catalog/catalog_manager_mock.h58
-rw-r--r--src/mongo/s/catalog/forwarding_catalog_manager.cpp124
-rw-r--r--src/mongo/s/catalog/forwarding_catalog_manager.h63
-rw-r--r--src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp93
-rw-r--r--src/mongo/s/catalog/legacy/catalog_manager_legacy.h50
-rw-r--r--src/mongo/s/catalog/legacy/config_upgrade.cpp11
-rw-r--r--src/mongo/s/catalog/legacy/config_upgrade.h5
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp86
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set.h50
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp30
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_log_change_test.cpp42
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp164
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp21
-rw-r--r--src/mongo/s/chunk.cpp10
-rw-r--r--src/mongo/s/chunk_manager.cpp11
-rw-r--r--src/mongo/s/cluster_write.cpp2
-rw-r--r--src/mongo/s/commands/cluster_enable_sharding_cmd.cpp2
-rw-r--r--src/mongo/s/commands/cluster_list_databases_cmd.cpp4
-rw-r--r--src/mongo/s/commands/cluster_map_reduce_cmd.cpp1
-rw-r--r--src/mongo/s/commands/cluster_move_primary_cmd.cpp11
-rw-r--r--src/mongo/s/commands/cluster_remove_shard_cmd.cpp5
-rw-r--r--src/mongo/s/commands/cluster_user_management_commands.cpp58
-rw-r--r--src/mongo/s/config.cpp29
-rw-r--r--src/mongo/s/d_merge.cpp6
-rw-r--r--src/mongo/s/d_migrate.cpp20
-rw-r--r--src/mongo/s/d_split.cpp15
-rw-r--r--src/mongo/s/grid.cpp4
-rw-r--r--src/mongo/s/grid.h4
-rw-r--r--src/mongo/s/server.cpp6
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);