diff options
author | Xuerui Fa <xuerui.fa@mongodb.com> | 2020-02-25 18:21:06 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-03-05 21:52:54 +0000 |
commit | a4cc0fda2778dcc2c39d1e1d471fcfdd98534b38 (patch) | |
tree | d79ba2602d21866fe5d3ba68deed14414080298e /src/mongo/db/repl/member_config.cpp | |
parent | 661cf616f53875383fa3ef20103d2f3f2324f73d (diff) | |
download | mongo-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.cpp | 30 |
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); |