summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/member_config.cpp
diff options
context:
space:
mode:
authorXuerui Fa <xuerui.fa@mongodb.com>2020-02-25 18:21:06 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-03-05 21:52:54 +0000
commita4cc0fda2778dcc2c39d1e1d471fcfdd98534b38 (patch)
treed79ba2602d21866fe5d3ba68deed14414080298e /src/mongo/db/repl/member_config.cpp
parent661cf616f53875383fa3ef20103d2f3f2324f73d (diff)
downloadmongo-a4cc0fda2778dcc2c39d1e1d471fcfdd98534b38.tar.gz
SERVER-46344: Add 'newlyAdded' field to new nodes with votes: 1 in reconfig
Diffstat (limited to 'src/mongo/db/repl/member_config.cpp')
-rw-r--r--src/mongo/db/repl/member_config.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/mongo/db/repl/member_config.cpp b/src/mongo/db/repl/member_config.cpp
index 54984b70b82..a0b5d6b5adc 100644
--- a/src/mongo/db/repl/member_config.cpp
+++ b/src/mongo/db/repl/member_config.cpp
@@ -36,6 +36,7 @@
#include "mongo/bson/util/bson_check.h"
#include "mongo/bson/util/bson_extract.h"
#include "mongo/db/jsobj.h"
+#include "mongo/db/repl/repl_server_parameters_gen.h"
#include "mongo/util/str.h"
namespace mongo {
@@ -48,6 +49,7 @@ const std::string MemberConfig::kHostFieldName = "host";
const std::string MemberConfig::kHiddenFieldName = "hidden";
const std::string MemberConfig::kSlaveDelayFieldName = "slaveDelay";
const std::string MemberConfig::kArbiterOnlyFieldName = "arbiterOnly";
+const std::string MemberConfig::kNewlyAddedFieldName = "newlyAdded";
const std::string MemberConfig::kBuildIndexesFieldName = "buildIndexes";
const std::string MemberConfig::kTagsFieldName = "tags";
const std::string MemberConfig::kHorizonsFieldName = "horizons";
@@ -65,6 +67,7 @@ const std::string kLegalMemberConfigFieldNames[] = {MemberConfig::kIdFieldName,
MemberConfig::kHiddenFieldName,
MemberConfig::kSlaveDelayFieldName,
MemberConfig::kArbiterOnlyFieldName,
+ MemberConfig::kNewlyAddedFieldName,
MemberConfig::kBuildIndexesFieldName,
MemberConfig::kTagsFieldName,
MemberConfig::kHorizonsFieldName};
@@ -131,6 +134,23 @@ MemberConfig::MemberConfig(const BSONObj& mcfg, ReplSetTagConfig* tagConfig) {
mcfg, kArbiterOnlyFieldName, kArbiterOnlyFieldDefault, &_arbiterOnly));
//
+ // Parse newlyAdded field.
+ //
+ if (mcfg.hasField(kNewlyAddedFieldName)) {
+ // If the `enableAutomaticReconfig` flag is not set, there should not be a `newlyAdded`
+ // field in the obj.
+ uassert(
+ ErrorCodes::InvalidReplicaSetConfig,
+ str::stream() << kNewlyAddedFieldName
+ << " field cannot be specified if enableAutomaticReconfig is turned off",
+ enableAutomaticReconfig);
+
+ bool newlyAdded;
+ uassertStatusOK(bsonExtractBooleanField(mcfg, kNewlyAddedFieldName, &newlyAdded));
+ setNewlyAdded(newlyAdded);
+ }
+
+ //
// Parse priority field.
//
BSONElement priorityElement = mcfg[kPriorityFieldName];
@@ -250,6 +270,10 @@ Status MemberConfig::validate() const {
return Status(ErrorCodes::BadValue, "Cannot set tags on arbiters.");
}
}
+ if (!(_newlyAdded == boost::none || _newlyAdded.get())) {
+ return Status(ErrorCodes::InvalidReplicaSetConfig,
+ str::stream() << kNewlyAddedFieldName << " field cannot be false");
+ }
if (_slaveDelay < Seconds(0) || _slaveDelay > kMaxSlaveDelay) {
return Status(ErrorCodes::BadValue,
str::stream()
@@ -291,6 +315,12 @@ BSONObj MemberConfig::toBSON(const ReplSetTagConfig& tagConfig) const {
configBuilder.append("_id", _id.getData());
configBuilder.append("host", _host().toString());
configBuilder.append("arbiterOnly", _arbiterOnly);
+
+ if (_newlyAdded) {
+ // We should never have _newlyAdded if automatic reconfigs aren't enabled.
+ invariant(enableAutomaticReconfig);
+ configBuilder.append("newlyAdded", _newlyAdded.get());
+ }
configBuilder.append("buildIndexes", _buildIndexes);
configBuilder.append("hidden", _hidden);
configBuilder.append("priority", _priority);