diff options
author | Louis Williams <louis.williams@mongodb.com> | 2017-09-22 13:55:59 -0400 |
---|---|---|
committer | Louis Williams <louis.williams@mongodb.com> | 2017-09-28 11:10:05 -0400 |
commit | b0b99866781302ba8b16de033ff2681f20483c14 (patch) | |
tree | e5e988301e89390aebcf5ec12055465e353dbb77 /src/mongo/db/commands/feature_compatibility_version.h | |
parent | f24fbb0011c6ded9101f08574e7cd07e63690a9b (diff) | |
download | mongo-b0b99866781302ba8b16de033ff2681f20483c14.tar.gz |
SERVER-31209 Persist targetVersion in FCV document to indicate an upgrade/downgrade in progress.
Diffstat (limited to 'src/mongo/db/commands/feature_compatibility_version.h')
-rw-r--r-- | src/mongo/db/commands/feature_compatibility_version.h | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/mongo/db/commands/feature_compatibility_version.h b/src/mongo/db/commands/feature_compatibility_version.h index d89b2e996d5..abb48b82101 100644 --- a/src/mongo/db/commands/feature_compatibility_version.h +++ b/src/mongo/db/commands/feature_compatibility_version.h @@ -41,6 +41,18 @@ class BSONObj; class OperationContext; /** + * Store state of featureCompatibilityVersion document. + **/ +struct FeatureCompatibilityVersionInfo { + ServerGlobalParams::FeatureCompatibility::Version version; + ServerGlobalParams::FeatureCompatibility::Version targetVersion; + + FeatureCompatibilityVersionInfo() + : version(ServerGlobalParams::FeatureCompatibility::Version::kUnset), + targetVersion(ServerGlobalParams::FeatureCompatibility::Version::kUnset) {} +}; + +/** * Startup parameter to ignore featureCompatibilityVersion checks. This parameter cannot be set if * the node is started with --replSet, --master, or --slave. This should never be set by end users. */ @@ -53,12 +65,13 @@ public: static constexpr StringData kDatabase = "admin"_sd; static constexpr StringData kParameterName = "featureCompatibilityVersion"_sd; static constexpr StringData kVersionField = "version"_sd; + static constexpr StringData kTargetVersionField = "targetVersion"_sd; /** * Parses the featureCompatibilityVersion document from admin.system.version, and returns the * version. */ - static StatusWith<ServerGlobalParams::FeatureCompatibility::Version> parse( + static StatusWith<FeatureCompatibilityVersionInfo> parse( const BSONObj& featureCompatibilityVersionDoc); static StringData toString(ServerGlobalParams::FeatureCompatibility::Version version) { @@ -67,6 +80,8 @@ public: return FeatureCompatibilityVersionCommandParser::kVersion36; case ServerGlobalParams::FeatureCompatibility::Version::k34: return FeatureCompatibilityVersionCommandParser::kVersion34; + case ServerGlobalParams::FeatureCompatibility::Version::kUnset: + return FeatureCompatibilityVersionCommandParser::kVersionUnset; default: MONGO_UNREACHABLE; } @@ -80,6 +95,27 @@ public: static void set(OperationContext* opCtx, StringData version); /** + * Indicate intent to perform an upgrade. Should be set before schemas are modified. + * This sets the 'targetVersion' field only. + * Use unsetTargetUpgradeOrDowngrade to indicate that the schemas have completed the upgrading. + */ + static void setTargetUpgrade(OperationContext* opCtx, StringData version); + + /** + * Indicate intent to perform a downgrade. Should be set before schemas are modified. + * This atomically updates both the 'version' and 'targetVersion' fields. + * Use unsetTargetUpgradeOrDowngrade to indicate that the schemas have completed downgrading. + */ + static void setTargetDowngrade(OperationContext* opCtx, StringData version); + + /** + * Indicate the completion of an upgrade or downgrade. Should be set only when schemas are + * done being upgraded or modified. + * Unsets the 'targetVersion' field and updates the 'version' field. + */ + static void unsetTargetUpgradeOrDowngrade(OperationContext* opCtx, StringData version); + + /** * If there are no non-local databases and we are not running with --shardsvr, set * featureCompatibilityVersion to the latest value. */ @@ -104,6 +140,28 @@ public: * Resets the server parameter to its default value on commit. */ static void onDropCollection(OperationContext* opCtx); + +private: + /** + * Validate version. Uasserts if invalid. + */ + static void _validateVersion(StringData version); + + /** + * Close incoming connections from interal clients who cannot speak our highest wire protocol + * version. + */ + static void _closeConnectionsBelowVersion(OperationContext* opCtx, + FeatureCompatibilityVersionInfo versionInfo); + + /** + * Build update command. + */ + typedef stdx::function<void(BSONObjBuilder)> UpdateBuilder; + static void _runUpdateCommand(OperationContext* opCtx, + StringData version, + UpdateBuilder callback); }; + } // namespace mongo |