From 7e3b287e3f829323a06b397eb927d7316efd6629 Mon Sep 17 00:00:00 2001 From: matt dannenberg Date: Wed, 12 Aug 2015 08:58:34 -0400 Subject: SERVER-19637 add election timeout to replica set config --- src/mongo/db/repl/replica_set_config.cpp | 34 +++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'src/mongo/db/repl/replica_set_config.cpp') 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(_heartbeatTimeoutPeriod)); } + if (_electionTimeoutPeriod < Milliseconds(0)) { + return Status(ErrorCodes::BadValue, + str::stream() << kSettingsFieldName << '.' << kElectionTimeoutFieldName + << " field value must be non-negative, " + "but found " + << durationCount(_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(_heartbeatInterval)); settingsBuilder.appendIntOrLL(kHeartbeatTimeoutFieldName, durationCount(_heartbeatTimeoutPeriod)); + settingsBuilder.appendIntOrLL(kElectionTimeoutFieldName, + durationCount(_electionTimeoutPeriod)); + BSONObjBuilder gleModes(settingsBuilder.subobjStart(kGetLastErrorModesFieldName)); for (StringMap::const_iterator mode = _customWriteConcernModes.begin(); -- cgit v1.2.1