summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/replica_set_config.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2015-09-25 15:01:33 -0400
committerBenety Goh <benety@mongodb.com>2015-09-28 13:20:01 -0400
commit3f6f2bd0b7df6bee794e91c0a1a3ab7ab7e64bc2 (patch)
tree8b552fded38fcc96b0f7056f21999e0205368a16 /src/mongo/db/repl/replica_set_config.cpp
parent22d0b32f071f572ae47422748f310159a1ee4ae5 (diff)
downloadmongo-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.cpp35
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