summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/replica_set_config.cpp
diff options
context:
space:
mode:
authorEric Milkie <milkie@10gen.com>2015-03-26 15:03:28 -0400
committerEric Milkie <milkie@10gen.com>2015-03-27 11:44:53 -0400
commit0fb262fb082e1a8b64bb1f5c0099ed2ee4c432d9 (patch)
treed730c103703f28eba6f5ce56043b763fe9d4dd6b /src/mongo/db/repl/replica_set_config.cpp
parent67cf6c0d51bf59a1933325c793b02c220283f331 (diff)
downloadmongo-0fb262fb082e1a8b64bb1f5c0099ed2ee4c432d9.tar.gz
SERVER-17602 add protocolVersion replica set config field
Diffstat (limited to 'src/mongo/db/repl/replica_set_config.cpp')
-rw-r--r--src/mongo/db/repl/replica_set_config.cpp56
1 files changed, 38 insertions, 18 deletions
diff --git a/src/mongo/db/repl/replica_set_config.cpp b/src/mongo/db/repl/replica_set_config.cpp
index 9f6100783f3..236b64b4c47 100644
--- a/src/mongo/db/repl/replica_set_config.cpp
+++ b/src/mongo/db/repl/replica_set_config.cpp
@@ -45,21 +45,24 @@ namespace repl {
const size_t ReplicaSetConfig::kMaxVotingMembers;
#endif
- const Seconds ReplicaSetConfig::kDefaultHeartbeatTimeoutPeriod(10);
- const std::string ReplicaSetConfig::kIdFieldName = "_id";
const std::string ReplicaSetConfig::kVersionFieldName = "version";
- const std::string ReplicaSetConfig::kMembersFieldName = "members";
- const std::string ReplicaSetConfig::kSettingsFieldName = "settings";
- const std::string ReplicaSetConfig::kMajorityWriteConcernModeName = "$majority";
- const std::string ReplicaSetConfig::kStepDownCheckWriteConcernModeName = "$stepDownCheck";
+ const Seconds ReplicaSetConfig::kDefaultHeartbeatTimeoutPeriod(10);
namespace {
+ const std::string kIdFieldName = "_id";
+ const std::string kMembersFieldName = "members";
+ const std::string kSettingsFieldName = "settings";
+ const std::string kMajorityWriteConcernModeName = "$majority";
+ const std::string kStepDownCheckWriteConcernModeName = "$stepDownCheck";
+ const std::string kProtocolVersionFieldName = "protocolVersion";
+
const std::string kLegalConfigTopFieldNames[] = {
- ReplicaSetConfig::kIdFieldName,
+ kIdFieldName,
ReplicaSetConfig::kVersionFieldName,
- ReplicaSetConfig::kMembersFieldName,
- ReplicaSetConfig::kSettingsFieldName
+ kMembersFieldName,
+ kSettingsFieldName,
+ kProtocolVersionFieldName
};
const std::string kHeartbeatTimeoutFieldName = "heartbeatTimeoutSecs";
@@ -69,7 +72,9 @@ namespace {
} // namespace
- ReplicaSetConfig::ReplicaSetConfig() : _isInitialized(false), _heartbeatTimeoutPeriod(0) {}
+ ReplicaSetConfig::ReplicaSetConfig() : _isInitialized(false),
+ _heartbeatTimeoutPeriod(0),
+ _protocolVersion(0) {}
Status ReplicaSetConfig::initialize(const BSONObj& cfg) {
_isInitialized = false;
@@ -131,6 +136,15 @@ namespace {
if (!status.isOK())
return status;
+ //
+ // Parse protocol version
+ //
+ BSONElement protocolVersionElement;
+ status = bsonExtractIntegerField(cfg, kProtocolVersionFieldName, &_protocolVersion);
+ if (!status.isOK() && status != ErrorCodes::NoSuchKey) {
+ return status;
+ }
+
_calculateMajorities();
_addInternalWriteConcernModes();
_isInitialized = true;
@@ -353,6 +367,11 @@ namespace {
}
}
+ if (_protocolVersion < 0 || _protocolVersion > std::numeric_limits<int>::max()) {
+ return Status(ErrorCodes::BadValue, str::stream() << kProtocolVersionFieldName <<
+ " field value of " << _protocolVersion << " is out of range");
+ }
+
return Status::OK();
}
@@ -497,20 +516,20 @@ namespace {
BSONObj ReplicaSetConfig::toBSON() const {
BSONObjBuilder configBuilder;
- configBuilder.append("_id", _replSetName);
- configBuilder.appendIntOrLL("version", _version);
+ configBuilder.append(kIdFieldName, _replSetName);
+ configBuilder.appendIntOrLL(kVersionFieldName, _version);
- BSONArrayBuilder members(configBuilder.subarrayStart("members"));
+ BSONArrayBuilder members(configBuilder.subarrayStart(kMembersFieldName));
for (MemberIterator mem = membersBegin(); mem != membersEnd(); mem++) {
members.append(mem->toBSON(getTagConfig()));
}
members.done();
- BSONObjBuilder settingsBuilder(configBuilder.subobjStart("settings"));
- settingsBuilder.append("chainingAllowed", _chainingAllowed);
- settingsBuilder.append("heartbeatTimeoutSecs", _heartbeatTimeoutPeriod.total_seconds());
+ BSONObjBuilder settingsBuilder(configBuilder.subobjStart(kSettingsFieldName));
+ settingsBuilder.append(kChainingAllowedFieldName, _chainingAllowed);
+ settingsBuilder.append(kHeartbeatTimeoutFieldName, _heartbeatTimeoutPeriod.total_seconds());
- BSONObjBuilder gleModes(settingsBuilder.subobjStart("getLastErrorModes"));
+ BSONObjBuilder gleModes(settingsBuilder.subobjStart(kGetLastErrorModesFieldName));
for (StringMap<ReplicaSetTagPattern>::const_iterator mode =
_customWriteConcernModes.begin();
mode != _customWriteConcernModes.end();
@@ -530,7 +549,8 @@ namespace {
}
gleModes.done();
- settingsBuilder.append("getLastErrorDefaults", _defaultWriteConcern.toBSON());
+ settingsBuilder.append(kGetLastErrorDefaultsFieldName, _defaultWriteConcern.toBSON());
+ settingsBuilder.append(kProtocolVersionFieldName, _protocolVersion);
settingsBuilder.done();
return configBuilder.obj();
}