diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2018-04-13 15:15:11 -0400 |
---|---|---|
committer | Esha Maharishi <esha.maharishi@mongodb.com> | 2018-04-13 18:27:07 -0400 |
commit | 5cd2a79f61b189db1330322e406b8c33960f2d24 (patch) | |
tree | 7fbc5f1ee1de85f1b268697efeb4c431d4e79a9d /src/mongo/db/commands/feature_compatibility_version.cpp | |
parent | 4174e073c93e6023c4ba6243d60e40f30f809d52 (diff) | |
download | mongo-5cd2a79f61b189db1330322e406b8c33960f2d24.tar.gz |
SERVER-34459 Clear in-memory database versions on setFCV downgrade on shard primaries and secondaries
Diffstat (limited to 'src/mongo/db/commands/feature_compatibility_version.cpp')
-rw-r--r-- | src/mongo/db/commands/feature_compatibility_version.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/mongo/db/commands/feature_compatibility_version.cpp b/src/mongo/db/commands/feature_compatibility_version.cpp index 2216c24dd6d..932f8d29553 100644 --- a/src/mongo/db/commands/feature_compatibility_version.cpp +++ b/src/mongo/db/commands/feature_compatibility_version.cpp @@ -33,6 +33,7 @@ #include "mongo/db/commands/feature_compatibility_version.h" #include "mongo/base/status.h" +#include "mongo/db/catalog_raii.h" #include "mongo/db/commands/feature_compatibility_version_documentation.h" #include "mongo/db/commands/feature_compatibility_version_parser.h" #include "mongo/db/dbdirectclient.h" @@ -41,6 +42,7 @@ #include "mongo/db/operation_context.h" #include "mongo/db/repl/optime.h" #include "mongo/db/repl/storage_interface.h" +#include "mongo/db/s/database_sharding_state.h" #include "mongo/db/server_parameters.h" #include "mongo/db/service_context.h" #include "mongo/db/storage/storage_engine.h" @@ -154,12 +156,30 @@ void FeatureCompatibilityVersion::onInsertOrUpdate(OperationContext* opCtx, cons << FeatureCompatibilityVersionParser::toString(newVersion); } - // On commit, update the server parameters, close any connections with a wire version that is - // below the minimum, and abort any open transactions if downgrading. opCtx->recoveryUnit()->onCommit([opCtx, newVersion]() { serverGlobalParams.featureCompatibility.setVersion(newVersion); updateMinWireVersion(); + if (newVersion == ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo36) { + // Clear the in-memory cached database versions on downgrade, so that we do not check + // databaseVersion in FCV 3.6 (it would be meaningless, since databases do not have + // versions in FCV 3.6). + // TODO: Once SERVER-34431 goes in, just clear the DatabaseShardingStateMap. + std::vector<std::string> dbNames; + getGlobalServiceContext()->getGlobalStorageEngine()->listDatabases(&dbNames); + for (const auto& dbName : dbNames) { + if (dbName == "admin") { + // The 'admin' database is already locked, since the FCV document is in + // admin.system.version. Just skip 'admin', since it is not versioned. + continue; + } + AutoGetDb autoDb(opCtx, dbName, MODE_X); + if (autoDb.getDb()) { + DatabaseShardingState::get(autoDb.getDb()).setDbVersion(opCtx, boost::none); + } + } + } + if (newVersion != ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo36) { // Close all incoming connections from internal clients with binary versions lower than // ours. |