summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands
diff options
context:
space:
mode:
authorLuxi Liu <71409449+lliu17@users.noreply.github.com>2022-08-19 16:06:38 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-08-19 17:36:41 +0000
commitc7ef5a02d1c6ec0c7300c5e176df7fc7298e945c (patch)
tree4c74e0c113edb782ec841a4445a80fae48d07268 /src/mongo/db/commands
parent3638a0179809ab80edb7aaaaf189a17ffb8bd611 (diff)
downloadmongo-c7ef5a02d1c6ec0c7300c5e176df7fc7298e945c.tar.gz
SERVER-68651 Put isDowngrading to upgraded path under feature flag
Diffstat (limited to 'src/mongo/db/commands')
-rw-r--r--src/mongo/db/commands/SConscript1
-rw-r--r--src/mongo/db/commands/feature_compatibility_version.cpp37
2 files changed, 27 insertions, 11 deletions
diff --git a/src/mongo/db/commands/SConscript b/src/mongo/db/commands/SConscript
index a97e065d719..d058ade3878 100644
--- a/src/mongo/db/commands/SConscript
+++ b/src/mongo/db/commands/SConscript
@@ -249,6 +249,7 @@ env.Library(
'$BUILD_DIR/mongo/db/commands',
'$BUILD_DIR/mongo/db/dbdirectclient',
'$BUILD_DIR/mongo/db/repl/repl_coordinator_interface',
+ '$BUILD_DIR/mongo/db/repl/repl_server_parameters',
'$BUILD_DIR/mongo/db/repl/repl_settings',
'$BUILD_DIR/mongo/idl/server_parameter',
],
diff --git a/src/mongo/db/commands/feature_compatibility_version.cpp b/src/mongo/db/commands/feature_compatibility_version.cpp
index 8ad7cae43f6..3b8e8a4654d 100644
--- a/src/mongo/db/commands/feature_compatibility_version.cpp
+++ b/src/mongo/db/commands/feature_compatibility_version.cpp
@@ -43,6 +43,7 @@
#include "mongo/db/namespace_string.h"
#include "mongo/db/operation_context.h"
#include "mongo/db/repl/optime.h"
+#include "mongo/db/repl/repl_server_parameters_gen.h"
#include "mongo/db/repl/replication_coordinator.h"
#include "mongo/db/repl/replication_process.h"
#include "mongo/db/repl/storage_interface.h"
@@ -74,7 +75,8 @@ namespace {
* Utility class for recording permitted transitions between feature compatibility versions and
* their on-disk representation as FeatureCompatibilityVersionDocument objects.
*/
-const class FCVTransitions {
+// TODO SERVER-65269: Add back 'const' qualifier to FCVTransitions class declaration
+class FCVTransitions {
public:
FCVTransitions() {
auto makeFCVDoc = [](
@@ -109,10 +111,6 @@ public:
// lastLTS then the second loop iteration just overwrites the first.
_transitions[{from, to, isFromConfigServer}] = upgrading;
_transitions[{upgrading, to, isFromConfigServer}] = to;
- // allow downgrading->upgrading->latest path
- _transitions[{GenericFCV::kDowngradingFromLatestToLastLTS,
- GenericFCV::kLatest,
- isFromConfigServer}] = GenericFCV::kUpgradingFromLastLTSToLatest;
}
_fcvDocuments[upgrading] = makeFCVDoc(from /* effective */, to /* target */);
}
@@ -146,6 +144,20 @@ public:
}
/**
+ * If feature flag gDowngradingToUpgrading is enabled,
+ * we add the new downgrading->upgrading->latest path.
+ */
+ void featureFlaggedAddNewTransitionState() {
+ if (repl::feature_flags::gDowngradingToUpgrading.isEnabledAndIgnoreFCV()) {
+ for (auto isFromConfigServer : std::vector{false, true}) {
+ _transitions[{GenericFCV::kDowngradingFromLatestToLastLTS,
+ GenericFCV::kLatest,
+ isFromConfigServer}] = GenericFCV::kUpgradingFromLastLTSToLatest;
+ }
+ }
+ }
+
+ /**
* True if a server in multiversion::FeatureCompatibilityVersion "fromVersion" can
* transition to "newVersion". Different rules apply if the request is from a config server.
*/
@@ -327,14 +339,13 @@ void FeatureCompatibilityVersion::updateFeatureCompatibilityVersionDocument(
// We may have just stepped down, in which case we should not proceed.
opCtx->checkForInterrupt();
- // Only transition to fully upgraded or downgraded states when we
- // have completed all required upgrade/downgrade behavior.
- // If kDowngradingFromLatestToLastLTS->kLatest, we want to get the transitional version
- // i.e. kUpgradingFromLastLTSToLatest
+ // Only transition to fully upgraded or downgraded states when we have completed all required
+ // upgrade/downgrade behavior, unless it is the newly added downgrading to upgrading path.
auto transitioningVersion = setTargetVersion &&
serverGlobalParams.featureCompatibility.isUpgradingOrDowngrading(fromVersion) &&
- !(fromVersion == GenericFCV::kDowngradingFromLatestToLastLTS &&
- newVersion == GenericFCV::kLatest)
+ !(repl::feature_flags::gDowngradingToUpgrading.isEnabledAndIgnoreFCV() &&
+ (fromVersion == GenericFCV::kDowngradingFromLatestToLastLTS &&
+ newVersion == GenericFCV::kLatest))
? fromVersion
: fcvTransitions.getTransitionalVersion(fromVersion, newVersion, isFromConfigServer);
FeatureCompatibilityVersionDocument fcvDoc =
@@ -487,6 +498,10 @@ void FeatureCompatibilityVersion::fassertInitializedAfterStartup(OperationContex
auto fcvDocument = findFeatureCompatibilityVersionDocument(opCtx);
+ // TODO SERVER-65269: Move downgrading->upgrading transition back to FCVTransitions constructor.
+ // Adding the new fcv downgrading -> upgrading path
+ fcvTransitions.featureFlaggedAddNewTransitionState();
+
auto const storageEngine = opCtx->getServiceContext()->getStorageEngine();
auto dbNames = storageEngine->listDatabases();
bool nonLocalDatabases = std::any_of(dbNames.begin(), dbNames.end(), [](auto dbName) {