summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2020-03-03 14:53:48 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-03-03 21:46:20 +0000
commit57636201bf8b92a697ebc6089f62aae4572a650f (patch)
treeafb0cca83b038d41f96cea17cde0f633460c374f
parent40de1061816ea7e9b115ac728fb80ba46cc2176d (diff)
downloadmongo-57636201bf8b92a697ebc6089f62aae4572a650f.tar.gz
SERVER-46579 Permit multinode reconfigs in FCV 4.2
-rw-r--r--src/mongo/db/repl/repl_set_config_checks.cpp4
-rw-r--r--src/mongo/db/repl/repl_set_config_checks_test.cpp17
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 =