diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2020-03-03 14:53:48 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-03-03 21:46:20 +0000 |
commit | 57636201bf8b92a697ebc6089f62aae4572a650f (patch) | |
tree | afb0cca83b038d41f96cea17cde0f633460c374f | |
parent | 40de1061816ea7e9b115ac728fb80ba46cc2176d (diff) | |
download | mongo-57636201bf8b92a697ebc6089f62aae4572a650f.tar.gz |
SERVER-46579 Permit multinode reconfigs in FCV 4.2
-rw-r--r-- | src/mongo/db/repl/repl_set_config_checks.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_set_config_checks_test.cpp | 17 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/mongo/db/repl/repl_set_config_checks.cpp b/src/mongo/db/repl/repl_set_config_checks.cpp index 9c7deaad980..bf72b9cca0c 100644 --- a/src/mongo/db/repl/repl_set_config_checks.cpp +++ b/src/mongo/db/repl/repl_set_config_checks.cpp @@ -361,7 +361,9 @@ StatusWith<int> validateConfigForReconfig(ReplicationCoordinatorExternalState* e // For non-force reconfigs, verify that the reconfig only adds or removes a single node. This // ensures that all quorums of the new config overlap with all quorums of the old config. - if (!force) { + if (!force && + serverGlobalParams.featureCompatibility.getVersion() == + ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo44) { status = validateSingleNodeChange(oldConfig, newConfig); if (!status.isOK()) { return StatusWith<int>(status); diff --git a/src/mongo/db/repl/repl_set_config_checks_test.cpp b/src/mongo/db/repl/repl_set_config_checks_test.cpp index 22c17222c11..63c33f7c1de 100644 --- a/src/mongo/db/repl/repl_set_config_checks_test.cpp +++ b/src/mongo/db/repl/repl_set_config_checks_test.cpp @@ -38,12 +38,15 @@ #include "mongo/db/server_options.h" #include "mongo/db/service_context.h" #include "mongo/db/service_context_test_fixture.h" +#include "mongo/unittest/ensure_fcv.h" #include "mongo/unittest/unittest.h" namespace mongo { namespace repl { namespace { +using unittest::EnsureFCV; + TEST_F(ServiceContextTest, ValidateConfigForInitiate_VersionMustBe1) { ReplicationCoordinatorExternalStateMock rses; rses.addSelf(HostAndPort("h1")); @@ -1100,6 +1103,20 @@ TEST_F(ServiceContextTest, ValidateForReconfig_MultiNodeRemovalDisallowed) { validateMemberReconfig(oldMembers, newMembers, m1)); } +TEST_F(ServiceContextTest, ValidateForReconfig_MultiNodeAdditionAllowedFCV42) { + EnsureFCV fcv{ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo42}; + BSONArray oldMembers = BSON_ARRAY(m1 << m2); + BSONArray newMembers = BSON_ARRAY(m1 << m2 << m3 << m4); // add 2 voting nodes. + ASSERT_OK(validateMemberReconfig(oldMembers, newMembers, m1)); +} + +TEST_F(ServiceContextTest, ValidateForReconfig_MultiNodeRemovalAllowedFCV42) { + EnsureFCV fcv{ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo42}; + BSONArray oldMembers = BSON_ARRAY(m1 << m2 << m3 << m4); + BSONArray newMembers = BSON_ARRAY(m1 << m2); // remove 2 voting nodes. + ASSERT_OK(validateMemberReconfig(oldMembers, newMembers, m1)); +} + TEST_F(ServiceContextTest, ValidateForReconfig_MultiNodeAdditionOfNonVotingNodesAllowed) { BSONArray oldMembers = BSON_ARRAY(m1 << m2); BSONArray newMembers = |