diff options
Diffstat (limited to 'src/mongo/db/commands/set_feature_compatibility_version_command.cpp')
-rw-r--r-- | src/mongo/db/commands/set_feature_compatibility_version_command.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/mongo/db/commands/set_feature_compatibility_version_command.cpp b/src/mongo/db/commands/set_feature_compatibility_version_command.cpp index 50196ec7aed..0127b1f401a 100644 --- a/src/mongo/db/commands/set_feature_compatibility_version_command.cpp +++ b/src/mongo/db/commands/set_feature_compatibility_version_command.cpp @@ -48,6 +48,7 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/ops/write_ops.h" #include "mongo/db/repl/repl_client_info.h" +#include "mongo/db/repl/replication_coordinator.h" #include "mongo/db/s/config/sharding_catalog_manager.h" #include "mongo/db/server_options.h" #include "mongo/db/session_catalog_mongod.h" @@ -290,6 +291,26 @@ public: CommandHelpers::appendCommandWCStatus(result, waitForWCStatus, res); }); + const bool isReplSet = repl::ReplicationCoordinator::get(opCtx)->getReplicationMode() == + repl::ReplicationCoordinator::modeReplSet; + if (!isReplSet) { + // Only allow changing the FCV on standalone nodes when the config.transactions table + // is empty. + const auto txnTableNss = NamespaceString::kSessionTransactionsTableNamespace; + const auto statusObj = + repl::StorageInterface::get(opCtx)->findSingleton(opCtx, txnTableNss); + const auto status = statusObj.getStatus(); + const bool isStandaloneWithEmptyTransactionsTable = + (status == ErrorCodes::CollectionIsEmpty || + status == ErrorCodes::NamespaceNotFound); + + uassert(ErrorCodes::IllegalOperation, + "cannot change featureCompatibilityVersion when in standalone mode with a " + "non-empty config.transactions table. Perform the upgrade/downgrade as " + "a replica set member or empty the config.transactions table to retry.", + isStandaloneWithEmptyTransactionsTable); + } + // Only allow one instance of setFeatureCompatibilityVersion to run at a time. invariant(!opCtx->lockState()->isLocked()); Lock::ExclusiveLock lk(opCtx->lockState(), FeatureCompatibilityVersion::fcvLock); |