diff options
author | Benety Goh <benety@mongodb.com> | 2015-09-25 15:01:33 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2015-09-28 13:20:01 -0400 |
commit | 3f6f2bd0b7df6bee794e91c0a1a3ab7ab7e64bc2 (patch) | |
tree | 8b552fded38fcc96b0f7056f21999e0205368a16 /src/mongo/db/repl/replica_set_config.cpp | |
parent | 22d0b32f071f572ae47422748f310159a1ee4ae5 (diff) | |
download | mongo-3f6f2bd0b7df6bee794e91c0a1a3ab7ab7e64bc2.tar.gz |
SERVER-20374 replica set configuration field electionTimeoutOffsetLimitMillis must be positive
Diffstat (limited to 'src/mongo/db/repl/replica_set_config.cpp')
-rw-r--r-- | src/mongo/db/repl/replica_set_config.cpp | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/src/mongo/db/repl/replica_set_config.cpp b/src/mongo/db/repl/replica_set_config.cpp index 2f33d82c689..f076fb5a2f1 100644 --- a/src/mongo/db/repl/replica_set_config.cpp +++ b/src/mongo/db/repl/replica_set_config.cpp @@ -53,6 +53,7 @@ const Milliseconds ReplicaSetConfig::kDefaultHeartbeatInterval(2000); const Seconds ReplicaSetConfig::kDefaultHeartbeatTimeoutPeriod(10); const Milliseconds ReplicaSetConfig::kDefaultElectionTimeoutPeriod(10000); const int ReplicaSetConfig::kDefaultElectionTimeoutOffsetLimit(2000); +const bool ReplicaSetConfig::kDefaultChainingAllowed(true); namespace { @@ -203,18 +204,19 @@ Status ReplicaSetConfig::_parseSettingsSubdocument(const BSONObj& settings) { // // Parse electionTimeoutOffsetLimit // - BSONElement electionTimeoutOffsetLimitElement = settings[kElectionTimeoutOffsetLimitFieldName]; - if (electionTimeoutOffsetLimitElement.eoo()) { - _electionTimeoutOffsetLimit = kDefaultElectionTimeoutOffsetLimit; - } else if (electionTimeoutOffsetLimitElement.isNumber()) { - _electionTimeoutOffsetLimit = electionTimeoutOffsetLimitElement.numberInt(); - } else { - return Status(ErrorCodes::TypeMismatch, - str::stream() << "Expected type of " << kSettingsFieldName << "." - << kElectionTimeoutOffsetLimitFieldName - << " to be a number, but found a value of type " - << typeName(electionTimeoutOffsetLimitElement.type())); - } + auto greaterThanZero = stdx::bind(std::greater<long long>(), stdx::placeholders::_1, 0); + long long electionTimeoutOffsetLimitMillis; + auto electionTimeoutOffsetLimitStatus = + bsonExtractIntegerFieldWithDefaultIf(settings, + kElectionTimeoutOffsetLimitFieldName, + kDefaultElectionTimeoutOffsetLimit, + greaterThanZero, + "election timeout offset limit must be greater than 0", + &electionTimeoutOffsetLimitMillis); + if (!electionTimeoutOffsetLimitStatus.isOK()) { + return electionTimeoutOffsetLimitStatus; + } + _electionTimeoutOffsetLimit = electionTimeoutOffsetLimitMillis; // // Parse heartbeatTimeoutSecs @@ -236,7 +238,7 @@ Status ReplicaSetConfig::_parseSettingsSubdocument(const BSONObj& settings) { // Parse chainingAllowed // Status status = bsonExtractBooleanFieldWithDefault( - settings, kChainingAllowedFieldName, true, &_chainingAllowed); + settings, kChainingAllowedFieldName, kDefaultChainingAllowed, &_chainingAllowed); if (!status.isOK()) return status; @@ -343,13 +345,6 @@ Status ReplicaSetConfig::validate() const { "but found " << durationCount<Seconds>(_heartbeatTimeoutPeriod)); } - if (_electionTimeoutOffsetLimit < 0) { - return Status(ErrorCodes::BadValue, - str::stream() << kSettingsFieldName << '.' - << kElectionTimeoutOffsetLimitFieldName - << " field value must be non-negative, " - "but found " << _electionTimeoutOffsetLimit); - } if (_electionTimeoutPeriod < Milliseconds(0)) { return Status(ErrorCodes::BadValue, str::stream() << kSettingsFieldName << '.' << kElectionTimeoutFieldName |