summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/replica_set_config.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl/replica_set_config.cpp')
-rw-r--r--src/mongo/db/repl/replica_set_config.cpp39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/mongo/db/repl/replica_set_config.cpp b/src/mongo/db/repl/replica_set_config.cpp
index 2e83b80a000..5f9220918fd 100644
--- a/src/mongo/db/repl/replica_set_config.cpp
+++ b/src/mongo/db/repl/replica_set_config.cpp
@@ -61,20 +61,23 @@ const std::string kMembersFieldName = "members";
const std::string kSettingsFieldName = "settings";
const std::string kStepDownCheckWriteConcernModeName = "$stepDownCheck";
const std::string kProtocolVersionFieldName = "protocolVersion";
+const std::string kWriteConcernMajorityJournalDefaultFieldName =
+ "writeConcernMajorityJournalDefault";
const std::string kLegalConfigTopFieldNames[] = {kIdFieldName,
ReplicaSetConfig::kVersionFieldName,
kMembersFieldName,
kSettingsFieldName,
kProtocolVersionFieldName,
- ReplicaSetConfig::kConfigServerFieldName};
+ ReplicaSetConfig::kConfigServerFieldName,
+ kWriteConcernMajorityJournalDefaultFieldName};
-const std::string kElectionTimeoutFieldName = "electionTimeoutMillis";
-const std::string kHeartbeatIntervalFieldName = "heartbeatIntervalMillis";
-const std::string kHeartbeatTimeoutFieldName = "heartbeatTimeoutSecs";
const std::string kChainingAllowedFieldName = "chainingAllowed";
+const std::string kElectionTimeoutFieldName = "electionTimeoutMillis";
const std::string kGetLastErrorDefaultsFieldName = "getLastErrorDefaults";
const std::string kGetLastErrorModesFieldName = "getLastErrorModes";
+const std::string kHeartbeatIntervalFieldName = "heartbeatIntervalMillis";
+const std::string kHeartbeatTimeoutFieldName = "heartbeatTimeoutSecs";
} // namespace
@@ -158,6 +161,16 @@ Status ReplicaSetConfig::_initialize(const BSONObj& cfg, bool forInitiate, bool
}
//
+ // Parse writeConcernMajorityJournalDefault
+ //
+ status = bsonExtractBooleanFieldWithDefault(cfg,
+ kWriteConcernMajorityJournalDefaultFieldName,
+ _protocolVersion == 1,
+ &_writeConcernMajorityJournalDefault);
+ if (!status.isOK())
+ return status;
+
+ //
// Parse settings
//
BSONElement settingsElement;
@@ -454,6 +467,12 @@ Status ReplicaSetConfig::validate() const {
"Nodes being used for config servers must be started with the "
"--configsvr flag");
}
+ if (!_writeConcernMajorityJournalDefault) {
+ return Status(ErrorCodes::BadValue,
+ str::stream() << kWriteConcernMajorityJournalDefaultFieldName
+ << " must be true in replica set configurations being "
+ "used for config servers");
+ }
} else if (serverGlobalParams.configsvr) {
return Status(ErrorCodes::BadValue,
"Nodes started with the --configsvr flag must have configsvr:true in "
@@ -616,8 +635,20 @@ BSONObj ReplicaSetConfig::toBSON() const {
configBuilder.append(kConfigServerFieldName, _configServer);
}
+ // Only include writeConcernMajorityJournalDefault if it is not the default version for this
+ // ProtocolVersion to prevent breaking cross version-3.2.1 compatibilty of ReplicaSetConfigs.
if (_protocolVersion > 0) {
configBuilder.append(kProtocolVersionFieldName, _protocolVersion);
+ // Only include writeConcernMajorityJournalDefault if it is not the default version for this
+ // ProtocolVersion to prevent breaking cross version-3.2.1 compatibilty of
+ // ReplicaSetConfigs.
+ if (!_writeConcernMajorityJournalDefault) {
+ configBuilder.append(kWriteConcernMajorityJournalDefaultFieldName,
+ _writeConcernMajorityJournalDefault);
+ }
+ } else if (_writeConcernMajorityJournalDefault) {
+ configBuilder.append(kWriteConcernMajorityJournalDefaultFieldName,
+ _writeConcernMajorityJournalDefault);
}
BSONArrayBuilder members(configBuilder.subarrayStart(kMembersFieldName));