diff options
| author | Randolph Tan <randolph@10gen.com> | 2016-06-22 14:31:55 -0400 |
|---|---|---|
| committer | Randolph Tan <randolph@10gen.com> | 2016-06-24 17:32:19 -0400 |
| commit | 4d14ddf06f49ff55c90451dcff2da1a6edcaf366 (patch) | |
| tree | f12b599389fdee66d8feeb3c57db23f0cad88419 | |
| parent | 587afac9ca7ff084aeb8bf74e98ecb9688b3afdb (diff) | |
SERVER-24701 Add option to set writeConcern for ShardingCatalogClient write ops
| -rw-r--r-- | src/mongo/db/write_concern.cpp | 9 | ||||
| -rw-r--r-- | src/mongo/s/balancer/balancer_configuration.cpp | 3 | ||||
| -rw-r--r-- | src/mongo/s/catalog/SConscript | 11 | ||||
| -rw-r--r-- | src/mongo/s/catalog/replset/SConscript | 1 | ||||
| -rw-r--r-- | src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp | 77 | ||||
| -rw-r--r-- | src/mongo/s/catalog/replset/sharding_catalog_client_impl.h | 9 | ||||
| -rw-r--r-- | src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp | 19 | ||||
| -rw-r--r-- | src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp | 60 | ||||
| -rw-r--r-- | src/mongo/s/catalog/sharding_catalog_client.cpp | 45 | ||||
| -rw-r--r-- | src/mongo/s/catalog/sharding_catalog_client.h | 12 | ||||
| -rw-r--r-- | src/mongo/s/catalog/sharding_catalog_client_mock.cpp | 18 | ||||
| -rw-r--r-- | src/mongo/s/catalog/sharding_catalog_client_mock.h | 9 | ||||
| -rw-r--r-- | src/mongo/s/chunk.cpp | 3 | ||||
| -rw-r--r-- | src/mongo/s/chunk_manager.cpp | 4 | ||||
| -rw-r--r-- | src/mongo/s/config.cpp | 8 | ||||
| -rw-r--r-- | src/mongo/s/sharding_uptime_reporter.cpp | 3 |
16 files changed, 206 insertions, 85 deletions
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp index 9956f833d78..1fbb5b9d827 100644 --- a/src/mongo/db/write_concern.cpp +++ b/src/mongo/db/write_concern.cpp @@ -121,8 +121,13 @@ Status validateWriteConcern(OperationContext* txn, << writeConcern.toBSON().toString()); } - if (replMode == repl::ReplicationCoordinator::modeReplSet && !isLocalDb && - writeConcern.wMode.empty()) { + if (replMode == repl::ReplicationCoordinator::modeReplSet && + // Allow writes performed within the server to have a write concern of { w: 1 }. + // This is so commands have the option to skip waiting for replication if they are + // holding locks (ex. addShardToZone). This also allows commands that perform + // multiple writes to batch the wait at the end. + !txn->getClient()->isInDirectClient() && + !isLocalDb && writeConcern.wMode.empty()) { invariant(writeConcern.wNumNodes == 1); return Status( ErrorCodes::BadValue, diff --git a/src/mongo/s/balancer/balancer_configuration.cpp b/src/mongo/s/balancer/balancer_configuration.cpp index 56336676603..17a47331eaf 100644 --- a/src/mongo/s/balancer/balancer_configuration.cpp +++ b/src/mongo/s/balancer/balancer_configuration.cpp @@ -70,7 +70,8 @@ Status BalancerConfiguration::setBalancerActive(OperationContext* txn, bool acti kSettingsNamespace.ns(), BSON("_id" << BalancerSettingsType::kKey), BSON("$set" << BSON(kStopped << !active)), - true); + true, + ShardingCatalogClient::kMajorityWriteConcern); Status refreshStatus = refreshAndCheck(txn); if (!refreshStatus.isOK()) { diff --git a/src/mongo/s/catalog/SConscript b/src/mongo/s/catalog/SConscript index 5363683be08..80c55c6d8bf 100644 --- a/src/mongo/s/catalog/SConscript +++ b/src/mongo/s/catalog/SConscript @@ -9,6 +9,16 @@ env.SConscript( ) env.Library( + target='sharding_catalog_client', + source=[ + 'sharding_catalog_client.cpp', + ], + LIBDEPS=[ + '$BUILD_DIR/mongo/db/write_concern_options', + ] +) + +env.Library( target='sharding_catalog_mock', source=[ 'sharding_catalog_client_mock.cpp', @@ -16,6 +26,7 @@ env.Library( ], LIBDEPS=[ 'dist_lock_manager_mock', + 'sharding_catalog_client', ] ) diff --git a/src/mongo/s/catalog/replset/SConscript b/src/mongo/s/catalog/replset/SConscript index 3fee8b6cab1..ce9eed01430 100644 --- a/src/mongo/s/catalog/replset/SConscript +++ b/src/mongo/s/catalog/replset/SConscript @@ -69,6 +69,7 @@ env.Library( '$BUILD_DIR/mongo/db/s/type_shard_identity', '$BUILD_DIR/mongo/executor/network_interface', '$BUILD_DIR/mongo/s/catalog/dist_lock_manager', + '$BUILD_DIR/mongo/s/catalog/sharding_catalog_client', '$BUILD_DIR/mongo/s/client/sharding_client', ], LIBDEPS_TAGS=[ diff --git a/src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp b/src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp index 2316739dc3a..ae8801ebbe9 100644 --- a/src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp +++ b/src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp @@ -101,15 +101,6 @@ const char kWriteConcernField[] = "writeConcern"; const ReadPreferenceSetting kConfigReadSelector(ReadPreference::Nearest, TagSet{}); const ReadPreferenceSetting kConfigPrimaryPreferredSelector(ReadPreference::PrimaryPreferred, TagSet{}); -const WriteConcernOptions kMajorityWriteConcern(WriteConcernOptions::kMajority, - // Note: Even though we're setting UNSET here, - // kMajority implies JOURNAL if journaling is - // supported by mongod and - // writeConcernMajorityJournalDefault is set to true - // in the ReplicaSetConfig. - WriteConcernOptions::SyncMode::UNSET, - Seconds(15)); - const int kMaxConfigVersionInitRetry = 3; const int kMaxReadRetry = 3; const int kMaxWriteRetry = 3; @@ -163,8 +154,12 @@ Status ShardingCatalogClientImpl::updateCollection(OperationContext* txn, const CollectionType& coll) { fassert(28634, coll.validate()); - auto status = updateConfigDocument( - txn, CollectionType::ConfigNS, BSON(CollectionType::fullNs(collNs)), coll.toBSON(), true); + auto status = updateConfigDocument(txn, + CollectionType::ConfigNS, + BSON(CollectionType::fullNs(collNs)), + coll.toBSON(), + true, + ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { return Status(status.getStatus().code(), str::stream() << "collection metadata write failed" @@ -179,8 +174,12 @@ Status ShardingCatalogClientImpl::updateDatabase(OperationContext* txn, const DatabaseType& db) { fassert(28616, db.validate()); - auto status = updateConfigDocument( - txn, DatabaseType::ConfigNS, BSON(DatabaseType::name(dbName)), db.toBSON(), true); + auto status = updateConfigDocument(txn, + DatabaseType::ConfigNS, + BSON(DatabaseType::name(dbName)), + db.toBSON(), + true, + ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { return Status(status.getStatus().code(), str::stream() << "database metadata write failed" @@ -225,7 +224,8 @@ Status ShardingCatalogClientImpl::createDatabase(OperationContext* txn, const st db.setPrimary(newShardId); db.setSharded(false); - status = insertConfigDocument(txn, DatabaseType::ConfigNS, db.toBSON()); + status = insertConfigDocument( + txn, DatabaseType::ConfigNS, db.toBSON(), ShardingCatalogClient::kMajorityWriteConcern); if (status.code() == ErrorCodes::DuplicateKey) { return Status(ErrorCodes::NamespaceExists, "database " + dbName + " already exists"); } @@ -375,7 +375,8 @@ Status ShardingCatalogClientImpl::_log(OperationContext* txn, log() << "about to log metadata event into " << logCollName << ": " << changeLogBSON; const NamespaceString nss("config", logCollName); - Status result = insertConfigDocument(txn, nss.ns(), changeLogBSON); + Status result = insertConfigDocument( + txn, nss.ns(), changeLogBSON, ShardingCatalogClient::kMajorityWriteConcern); if (!result.isOK()) { warning() << "Error encountered while logging config change with ID [" << changeId << "] into collection " << logCollName << ": " << result; @@ -536,7 +537,8 @@ StatusWith<ShardDrainingStatus> ShardingCatalogClientImpl::removeShard(Operation ShardType::ConfigNS, BSON(ShardType::name() << name), BSON("$set" << BSON(ShardType::draining(true))), - false); + false, + ShardingCatalogClient::kMajorityWriteConcern); if (!updateStatus.isOK()) { log() << "error starting removeShard: " << name << causedBy(updateStatus.getStatus()); return updateStatus.getStatus(); @@ -574,8 +576,10 @@ StatusWith<ShardDrainingStatus> ShardingCatalogClientImpl::removeShard(Operation log() << "going to remove shard: " << name; audit::logRemoveShard(txn->getClient(), name); - Status status = - removeConfigDocuments(txn, ShardType::ConfigNS, BSON(ShardType::name() << name)); + Status status = removeConfigDocuments(txn, + ShardType::ConfigNS, + BSON(ShardType::name() << name), + ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { log() << "Error concluding removeShard operation on: " << name << "; err: " << status.reason(); @@ -812,7 +816,10 @@ Status ShardingCatalogClientImpl::dropCollection(OperationContext* txn, const Na LOG(1) << "dropCollection " << ns << " shard data deleted"; // Remove chunk data - Status result = removeConfigDocuments(txn, ChunkType::ConfigNS, BSON(ChunkType::ns(ns.ns()))); + Status result = removeConfigDocuments(txn, + ChunkType::ConfigNS, + BSON(ChunkType::ns(ns.ns())), + ShardingCatalogClient::kMajorityWriteConcern); if (!result.isOK()) { return result; } @@ -1304,7 +1311,8 @@ void ShardingCatalogClientImpl::_runBatchWriteCommand(OperationContext* txn, Status ShardingCatalogClientImpl::insertConfigDocument(OperationContext* txn, const std::string& ns, - const BSONObj& doc) { + const BSONObj& doc, + const WriteConcernOptions& writeConcern) { const NamespaceString nss(ns); invariant(nss.db() == "config"); @@ -1316,7 +1324,7 @@ Status ShardingCatalogClientImpl::insertConfigDocument(OperationContext* txn, BatchedCommandRequest request(insert.release()); request.setNS(nss); - request.setWriteConcern(kMajorityWriteConcern.toBSON()); + request.setWriteConcern(writeConcern.toBSON()); auto configShard = Grid::get(txn)->shardRegistry()->getConfigShard(); for (int retry = 1; retry <= kMaxWriteRetry; retry++) { @@ -1375,11 +1383,13 @@ Status ShardingCatalogClientImpl::insertConfigDocument(OperationContext* txn, MONGO_UNREACHABLE; } -StatusWith<bool> ShardingCatalogClientImpl::updateConfigDocument(OperationContext* txn, - const string& ns, - const BSONObj& query, - const BSONObj& update, - bool upsert) { +StatusWith<bool> ShardingCatalogClientImpl::updateConfigDocument( + OperationContext* txn, + const string& ns, + const BSONObj& query, + const BSONObj& update, + bool upsert, + const WriteConcernOptions& writeConcern) { const NamespaceString nss(ns); invariant(nss.db() == "config"); @@ -1397,7 +1407,7 @@ StatusWith<bool> ShardingCatalogClientImpl::updateConfigDocument(OperationContex BatchedCommandRequest request(updateRequest.release()); request.setNS(nss); - request.setWriteConcern(kMajorityWriteConcern.toBSON()); + request.setWriteConcern(writeConcern.toBSON()); BatchedCommandResponse response; _runBatchWriteCommand(txn, request, &response, Shard::RetryPolicy::kIdempotent); @@ -1414,7 +1424,8 @@ StatusWith<bool> ShardingCatalogClientImpl::updateConfigDocument(OperationContex Status ShardingCatalogClientImpl::removeConfigDocuments(OperationContext* txn, const string& ns, - const BSONObj& query) { + const BSONObj& query, + const WriteConcernOptions& writeConcern) { const NamespaceString nss(ns); invariant(nss.db() == "config"); @@ -1427,7 +1438,7 @@ Status ShardingCatalogClientImpl::removeConfigDocuments(OperationContext* txn, BatchedCommandRequest request(deleteRequest.release()); request.setNS(nss); - request.setWriteConcern(kMajorityWriteConcern.toBSON()); + request.setWriteConcern(writeConcern.toBSON()); BatchedCommandResponse response; _runBatchWriteCommand(txn, request, &response, Shard::RetryPolicy::kIdempotent); @@ -1566,8 +1577,12 @@ Status ShardingCatalogClientImpl::initConfigVersion(OperationContext* txn) { newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION); BSONObj versionObj(newVersion.toBSON()); - auto upsertStatus = - updateConfigDocument(txn, VersionType::ConfigNS, versionObj, versionObj, true); + auto upsertStatus = updateConfigDocument(txn, + VersionType::ConfigNS, + versionObj, + versionObj, + true, + ShardingCatalogClient::kMajorityWriteConcern); if ((upsertStatus.isOK() && !upsertStatus.getValue()) || upsertStatus == ErrorCodes::DuplicateKey) { diff --git a/src/mongo/s/catalog/replset/sharding_catalog_client_impl.h b/src/mongo/s/catalog/replset/sharding_catalog_client_impl.h index a31dac7b353..8607e31c824 100644 --- a/src/mongo/s/catalog/replset/sharding_catalog_client_impl.h +++ b/src/mongo/s/catalog/replset/sharding_catalog_client_impl.h @@ -157,17 +157,20 @@ public: Status insertConfigDocument(OperationContext* txn, const std::string& ns, - const BSONObj& doc) override; + const BSONObj& doc, + const WriteConcernOptions& writeConcern) override; StatusWith<bool> updateConfigDocument(OperationContext* txn, const std::string& ns, const BSONObj& query, const BSONObj& update, - bool upsert) override; + bool upsert, + const WriteConcernOptions& writeConcern) override; Status removeConfigDocuments(OperationContext* txn, const std::string& ns, - const BSONObj& query) override; + const BSONObj& query, + const WriteConcernOptions& writeConcern) override; DistLockManager* getDistLockManager() override; diff --git a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp index 45979ef8154..251fc199daf 100644 --- a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp +++ b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp @@ -72,14 +72,7 @@ using str::stream; namespace { const ReadPreferenceSetting kConfigReadSelector(ReadPreference::Nearest, TagSet{}); -const WriteConcernOptions kMajorityWriteConcern(WriteConcernOptions::kMajority, - // Note: Even though we're setting UNSET here, - // kMajority implies JOURNAL if journaling is - // supported by mongod and - // writeConcernMajorityJournalDefault is set to true - // in the ReplicaSetConfig. - WriteConcernOptions::SyncMode::UNSET, - Seconds(15)); +const WriteConcernOptions kNoWaitWriteConcern(1, WriteConcernOptions::SyncMode::UNSET, Seconds(0)); void toBatchError(const Status& status, BatchedCommandResponse* response) { response->clear(); @@ -512,7 +505,7 @@ StatusWith<string> ShardingCatalogManagerImpl::addShard( auto updateRequest = shardIdentity.createUpsertForAddShard(); BatchedCommandRequest commandRequest(updateRequest.release()); commandRequest.setNS(NamespaceString::kConfigCollectionNamespace); - commandRequest.setWriteConcern(kMajorityWriteConcern.toBSON()); + commandRequest.setWriteConcern(ShardingCatalogClient::kMajorityWriteConcern.toBSON()); auto swCommandResponse = _runCommandForAddShard(txn, targeter.get(), "admin", commandRequest.toBSON()); @@ -532,8 +525,8 @@ StatusWith<string> ShardingCatalogManagerImpl::addShard( log() << "going to insert new entry for shard into config.shards: " << shardType.toString(); - Status result = - _catalogClient->insertConfigDocument(txn, ShardType::ConfigNS, shardType.toBSON()); + Status result = _catalogClient->insertConfigDocument( + txn, ShardType::ConfigNS, shardType.toBSON(), ShardingCatalogClient::kMajorityWriteConcern); if (!result.isOK()) { log() << "error adding shard: " << shardType.toBSON() << " err: " << result.reason(); if (result == ErrorCodes::DuplicateKey) { @@ -589,13 +582,13 @@ Status ShardingCatalogManagerImpl::addShardToZone(OperationContext* txn, const std::string& zoneName) { ScopedZoneOpExclusiveLock scopedLock(txn); - // TODO: SERVER-24701 use w: 1 auto updateStatus = _catalogClient->updateConfigDocument( txn, ShardType::ConfigNS, BSON(ShardType::name(shardName)), BSON("$addToSet" << BSON(ShardType::tags() << zoneName)), - false); + false, + kNoWaitWriteConcern); if (!updateStatus.isOK()) { return updateStatus.getStatus(); diff --git a/src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp b/src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp index b4aa492b92d..e520857395f 100644 --- a/src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp +++ b/src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp @@ -84,8 +84,11 @@ TEST_F(InsertRetryTest, RetryOnInterruptedAndNetworkErrorSuccess) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_OK(status); }); @@ -113,8 +116,11 @@ TEST_F(InsertRetryTest, RetryOnNetworkErrorFails) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_EQ(ErrorCodes::NetworkTimeout, status.code()); }); @@ -145,8 +151,11 @@ TEST_F(InsertRetryTest, DuplicateKeyErrorAfterNetworkErrorMatch) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_OK(status); }); @@ -180,8 +189,11 @@ TEST_F(InsertRetryTest, DuplicateKeyErrorAfterNetworkErrorNotFound) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_EQ(ErrorCodes::DuplicateKey, status.code()); }); @@ -215,8 +227,11 @@ TEST_F(InsertRetryTest, DuplicateKeyErrorAfterNetworkErrorMismatch) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_EQ(ErrorCodes::DuplicateKey, status.code()); }); @@ -251,8 +266,11 @@ TEST_F(InsertRetryTest, DuplicateKeyErrorAfterWriteConcernFailureMatch) { << "TestValue"); auto future = launchAsync([&] { - Status status = catalogClient()->insertConfigDocument( - operationContext(), kTestNamespace.ns(), objToInsert); + Status status = + catalogClient()->insertConfigDocument(operationContext(), + kTestNamespace.ns(), + objToInsert, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_OK(status); }); @@ -308,8 +326,13 @@ TEST_F(UpdateRetryTest, OperationInterruptedDueToPrimaryStepDown) { << "NewTestValue")); auto future = launchAsync([&] { - auto status = catalogClient()->updateConfigDocument( - operationContext(), kTestNamespace.ns(), objToUpdate, updateExpr, false); + auto status = + catalogClient()->updateConfigDocument(operationContext(), + kTestNamespace.ns(), + objToUpdate, + updateExpr, + false, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_OK(status); }); @@ -355,8 +378,13 @@ TEST_F(UpdateRetryTest, WriteConcernFailure) { << "NewTestValue")); auto future = launchAsync([&] { - auto status = catalogClient()->updateConfigDocument( - operationContext(), kTestNamespace.ns(), objToUpdate, updateExpr, false); + auto status = + catalogClient()->updateConfigDocument(operationContext(), + kTestNamespace.ns(), + objToUpdate, + updateExpr, + false, + ShardingCatalogClient::kMajorityWriteConcern); ASSERT_OK(status); }); diff --git a/src/mongo/s/catalog/sharding_catalog_client.cpp b/src/mongo/s/catalog/sharding_catalog_client.cpp new file mode 100644 index 00000000000..1eb3a53489b --- /dev/null +++ b/src/mongo/s/catalog/sharding_catalog_client.cpp @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2016 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" + +#include "mongo/s/catalog/sharding_catalog_client.h" + +namespace mongo { + +const WriteConcernOptions ShardingCatalogClient::kMajorityWriteConcern( + WriteConcernOptions::kMajority, + // Note: Even though we're setting UNSET here, + // kMajority implies JOURNAL if journaling is + // supported by mongod and + // writeConcernMajorityJournalDefault is set to true + // in the ReplicaSetConfig. + WriteConcernOptions::SyncMode::UNSET, + Seconds(15)); + +} // namespace mongo diff --git a/src/mongo/s/catalog/sharding_catalog_client.h b/src/mongo/s/catalog/sharding_catalog_client.h index 004482b938a..69ad148860a 100644 --- a/src/mongo/s/catalog/sharding_catalog_client.h +++ b/src/mongo/s/catalog/sharding_catalog_client.h @@ -35,6 +35,7 @@ #include "mongo/base/disallow_copying.h" #include "mongo/db/repl/optime_with.h" +#include "mongo/db/write_concern_options.h" #include "mongo/s/catalog/dist_lock_manager.h" #include "mongo/s/client/shard.h" @@ -91,6 +92,8 @@ class ShardingCatalogClient { MONGO_DISALLOW_COPYING(ShardingCatalogClient); public: + static const WriteConcernOptions kMajorityWriteConcern; + virtual ~ShardingCatalogClient() = default; /** @@ -377,7 +380,8 @@ public: */ virtual Status insertConfigDocument(OperationContext* txn, const std::string& ns, - const BSONObj& doc) = 0; + const BSONObj& doc, + const WriteConcernOptions& writeConcern) = 0; /** * Updates a single document in the specified namespace on the config server. The document must @@ -397,7 +401,8 @@ public: const std::string& ns, const BSONObj& query, const BSONObj& update, - bool upsert) = 0; + bool upsert, + const WriteConcernOptions& writeConcern) = 0; /** * Removes documents matching a particular query predicate from the specified namespace on the @@ -407,7 +412,8 @@ public: */ virtual Status removeConfigDocuments(OperationContext* txn, const std::string& ns, - const BSONObj& query) = 0; + const BSONObj& query, + const WriteConcernOptions& writeConcern) = 0; /** * Performs the necessary checks for version compatibility and creates a new version document diff --git a/src/mongo/s/catalog/sharding_catalog_client_mock.cpp b/src/mongo/s/catalog/sharding_catalog_client_mock.cpp index 2095ceef887..2481a5336e2 100644 --- a/src/mongo/s/catalog/sharding_catalog_client_mock.cpp +++ b/src/mongo/s/catalog/sharding_catalog_client_mock.cpp @@ -190,21 +190,25 @@ void ShardingCatalogClientMock::writeConfigServerDirect(OperationContext* txn, Status ShardingCatalogClientMock::insertConfigDocument(OperationContext* txn, const std::string& ns, - const BSONObj& doc) { + const BSONObj& doc, + const WriteConcernOptions& writeConcern) { return {ErrorCodes::InternalError, "Method not implemented"}; } -StatusWith<bool> ShardingCatalogClientMock::updateConfigDocument(OperationContext* txn, - const std::string& ns, - const BSONObj& query, - const BSONObj& update, - bool upsert) { +StatusWith<bool> ShardingCatalogClientMock::updateConfigDocument( + OperationContext* txn, + const std::string& ns, + const BSONObj& query, + const BSONObj& update, + bool upsert, + const WriteConcernOptions& writeConcern) { return {ErrorCodes::InternalError, "Method not implemented"}; } Status ShardingCatalogClientMock::removeConfigDocuments(OperationContext* txn, const std::string& ns, - const BSONObj& query) { + const BSONObj& query, + const WriteConcernOptions& writeConcern) { return {ErrorCodes::InternalError, "Method not implemented"}; } diff --git a/src/mongo/s/catalog/sharding_catalog_client_mock.h b/src/mongo/s/catalog/sharding_catalog_client_mock.h index 9edcf9b1391..60b09546631 100644 --- a/src/mongo/s/catalog/sharding_catalog_client_mock.h +++ b/src/mongo/s/catalog/sharding_catalog_client_mock.h @@ -135,17 +135,20 @@ public: Status insertConfigDocument(OperationContext* txn, const std::string& ns, - const BSONObj& doc) override; + const BSONObj& doc, + const WriteConcernOptions& writeConcern) override; StatusWith<bool> updateConfigDocument(OperationContext* txn, const std::string& ns, const BSONObj& query, const BSONObj& update, - bool upsert) override; + bool upsert, + const WriteConcernOptions& writeConcern) override; Status removeConfigDocuments(OperationContext* txn, const std::string& ns, - const BSONObj& query) override; + const BSONObj& query, + const WriteConcernOptions& writeConcern) override; Status createDatabase(OperationContext* txn, const std::string& dbName); diff --git a/src/mongo/s/chunk.cpp b/src/mongo/s/chunk.cpp index 24c72267772..1e27e44f416 100644 --- a/src/mongo/s/chunk.cpp +++ b/src/mongo/s/chunk.cpp @@ -443,7 +443,8 @@ void Chunk::markAsJumbo(OperationContext* txn) const { ChunkType::ConfigNS, BSON(ChunkType::name(chunkName)), BSON("$set" << BSON(ChunkType::jumbo(true))), - false); + false, + ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { warning() << "couldn't set jumbo for chunk: " << chunkName << causedBy(status.getStatus()); } diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp index 031721d6324..84c34e1d3f9 100644 --- a/src/mongo/s/chunk_manager.cpp +++ b/src/mongo/s/chunk_manager.cpp @@ -427,8 +427,8 @@ Status ChunkManager::createFirstChunks(OperationContext* txn, chunk.setShard(shardIds[i % shardIds.size()]); chunk.setVersion(version); - Status status = - grid.catalogClient(txn)->insertConfigDocument(txn, ChunkType::ConfigNS, chunk.toBSON()); + Status status = grid.catalogClient(txn)->insertConfigDocument( + txn, ChunkType::ConfigNS, chunk.toBSON(), ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { const string errMsg = str::stream() << "Creating first chunks failed: " << status.reason(); diff --git a/src/mongo/s/config.cpp b/src/mongo/s/config.cpp index 723e474ca74..42a418fe40a 100644 --- a/src/mongo/s/config.cpp +++ b/src/mongo/s/config.cpp @@ -548,7 +548,10 @@ bool DBConfig::dropDatabase(OperationContext* txn, string& errmsg) { grid.catalogCache()->invalidate(_name); Status result = grid.catalogClient(txn)->removeConfigDocuments( - txn, DatabaseType::ConfigNS, BSON(DatabaseType::name(_name))); + txn, + DatabaseType::ConfigNS, + BSON(DatabaseType::name(_name)), + ShardingCatalogClient::kMajorityWriteConcern); if (!result.isOK()) { errmsg = result.reason(); log() << "could not drop '" << _name << "': " << errmsg; @@ -726,7 +729,8 @@ void ConfigServer::replicaSetChangeConfigServerUpdateHook(const string& setName, ShardType::ConfigNS, BSON(ShardType::name(s->getId().toString())), BSON("$set" << BSON(ShardType::host(newConnectionString))), - false); + false, + ShardingCatalogClient::kMajorityWriteConcern); if (!status.isOK()) { error() << "RSChangeWatcher: could not update config db for set: " << setName << " to: " << newConnectionString << causedBy(status.getStatus()); diff --git a/src/mongo/s/sharding_uptime_reporter.cpp b/src/mongo/s/sharding_uptime_reporter.cpp index 8ee3cca9472..8ec02ea20a9 100644 --- a/src/mongo/s/sharding_uptime_reporter.cpp +++ b/src/mongo/s/sharding_uptime_reporter.cpp @@ -92,7 +92,8 @@ void ShardingUptimeReporter::reportStatus(OperationContext* txn, bool isBalancer MongosType::ConfigNS, BSON(MongosType::name(getInstanceId())), BSON("$set" << mType.toBSON()), - true); + true, + ShardingCatalogClient::kMajorityWriteConcern); } catch (const std::exception& e) { log() << "Caught exception while reporting uptime: " << e.what(); } |
