summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2016-06-22 14:31:55 -0400
committerRandolph Tan <randolph@10gen.com>2016-06-24 17:32:19 -0400
commit4d14ddf06f49ff55c90451dcff2da1a6edcaf366 (patch)
treef12b599389fdee66d8feeb3c57db23f0cad88419
parent587afac9ca7ff084aeb8bf74e98ecb9688b3afdb (diff)
SERVER-24701 Add option to set writeConcern for ShardingCatalogClient write ops
-rw-r--r--src/mongo/db/write_concern.cpp9
-rw-r--r--src/mongo/s/balancer/balancer_configuration.cpp3
-rw-r--r--src/mongo/s/catalog/SConscript11
-rw-r--r--src/mongo/s/catalog/replset/SConscript1
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_client_impl.cpp77
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_client_impl.h9
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp19
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_write_retry_test.cpp60
-rw-r--r--src/mongo/s/catalog/sharding_catalog_client.cpp45
-rw-r--r--src/mongo/s/catalog/sharding_catalog_client.h12
-rw-r--r--src/mongo/s/catalog/sharding_catalog_client_mock.cpp18
-rw-r--r--src/mongo/s/catalog/sharding_catalog_client_mock.h9
-rw-r--r--src/mongo/s/chunk.cpp3
-rw-r--r--src/mongo/s/chunk_manager.cpp4
-rw-r--r--src/mongo/s/config.cpp8
-rw-r--r--src/mongo/s/sharding_uptime_reporter.cpp3
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();
}