summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/replica_set_config.cpp
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-08-12 08:58:34 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-08-13 04:16:32 -0400
commit7e3b287e3f829323a06b397eb927d7316efd6629 (patch)
treefcae34318541729e65392d58690fdd7b1057f7a2 /src/mongo/db/repl/replica_set_config.cpp
parent312fe328972341c071516b2e92227325471293ea (diff)
downloadmongo-7e3b287e3f829323a06b397eb927d7316efd6629.tar.gz
SERVER-19637 add election timeout to replica set config
Diffstat (limited to 'src/mongo/db/repl/replica_set_config.cpp')
-rw-r--r--src/mongo/db/repl/replica_set_config.cpp34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/mongo/db/repl/replica_set_config.cpp b/src/mongo/db/repl/replica_set_config.cpp
index 583db8e9d35..dd17e7c161e 100644
--- a/src/mongo/db/repl/replica_set_config.cpp
+++ b/src/mongo/db/repl/replica_set_config.cpp
@@ -50,6 +50,7 @@ const std::string ReplicaSetConfig::kVersionFieldName = "version";
const std::string ReplicaSetConfig::kMajorityWriteConcernModeName = "$majority";
const Milliseconds ReplicaSetConfig::kDefaultHeartbeatInterval(2000);
const Seconds ReplicaSetConfig::kDefaultHeartbeatTimeoutPeriod(10);
+const Milliseconds ReplicaSetConfig::kDefaultElectionTimeoutPeriod(2000);
namespace {
@@ -66,6 +67,7 @@ const std::string kLegalConfigTopFieldNames[] = {kIdFieldName,
kProtocolVersionFieldName,
ReplicaSetConfig::kConfigServerFieldName};
+const std::string kElectionTimeoutFieldName = "electionTimeoutMillis";
const std::string kHeartbeatIntervalFieldName = "heartbeatIntervalMillis";
const std::string kHeartbeatTimeoutFieldName = "heartbeatTimeoutSecs";
const std::string kChainingAllowedFieldName = "chainingAllowed";
@@ -74,13 +76,6 @@ const std::string kGetLastErrorModesFieldName = "getLastErrorModes";
} // namespace
-ReplicaSetConfig::ReplicaSetConfig()
- : _isInitialized(false),
- _heartbeatInterval(kDefaultHeartbeatInterval),
- _heartbeatTimeoutPeriod(0),
- _protocolVersion(0),
- _configServer(false) {}
-
Status ReplicaSetConfig::initialize(const BSONObj& cfg) {
_isInitialized = false;
_members.clear();
@@ -171,6 +166,21 @@ Status ReplicaSetConfig::_parseSettingsSubdocument(const BSONObj& settings) {
}
_heartbeatInterval = Milliseconds(heartbeatIntervalMillis);
+ // Parse electionTimeoutMillis
+ //
+ BSONElement electionTimeoutMillisElement = settings[kElectionTimeoutFieldName];
+ if (electionTimeoutMillisElement.eoo()) {
+ _electionTimeoutPeriod = Milliseconds(kDefaultElectionTimeoutPeriod);
+ } else if (electionTimeoutMillisElement.isNumber()) {
+ _electionTimeoutPeriod = Milliseconds(electionTimeoutMillisElement.numberInt());
+ } else {
+ return Status(ErrorCodes::TypeMismatch,
+ str::stream() << "Expected type of " << kSettingsFieldName << "."
+ << kElectionTimeoutFieldName
+ << " to be a number, but found a value of type "
+ << typeName(electionTimeoutMillisElement.type()));
+ }
+
//
// Parse heartbeatTimeoutSecs
//
@@ -306,6 +316,13 @@ Status ReplicaSetConfig::validate() const {
"but found "
<< durationCount<Seconds>(_heartbeatTimeoutPeriod));
}
+ if (_electionTimeoutPeriod < Milliseconds(0)) {
+ return Status(ErrorCodes::BadValue,
+ str::stream() << kSettingsFieldName << '.' << kElectionTimeoutFieldName
+ << " field value must be non-negative, "
+ "but found "
+ << durationCount<Milliseconds>(_electionTimeoutPeriod));
+ }
if (_members.size() > kMaxMembers || _members.empty()) {
return Status(ErrorCodes::BadValue,
str::stream() << "Replica set configuration contains " << _members.size()
@@ -580,6 +597,9 @@ BSONObj ReplicaSetConfig::toBSON() const {
durationCount<Milliseconds>(_heartbeatInterval));
settingsBuilder.appendIntOrLL(kHeartbeatTimeoutFieldName,
durationCount<Seconds>(_heartbeatTimeoutPeriod));
+ settingsBuilder.appendIntOrLL(kElectionTimeoutFieldName,
+ durationCount<Milliseconds>(_electionTimeoutPeriod));
+
BSONObjBuilder gleModes(settingsBuilder.subobjStart(kGetLastErrorModesFieldName));
for (StringMap<ReplicaSetTagPattern>::const_iterator mode = _customWriteConcernModes.begin();