diff options
author | Luxi Liu <71409449+lliu17@users.noreply.github.com> | 2022-08-19 16:06:38 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-08-19 17:36:41 +0000 |
commit | c7ef5a02d1c6ec0c7300c5e176df7fc7298e945c (patch) | |
tree | 4c74e0c113edb782ec841a4445a80fae48d07268 /src/mongo/db/commands | |
parent | 3638a0179809ab80edb7aaaaf189a17ffb8bd611 (diff) | |
download | mongo-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/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/commands/feature_compatibility_version.cpp | 37 |
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) { |