summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/feature_compatibility_version.h
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2017-09-22 13:55:59 -0400
committerLouis Williams <louis.williams@mongodb.com>2017-09-28 11:10:05 -0400
commitb0b99866781302ba8b16de033ff2681f20483c14 (patch)
treee5e988301e89390aebcf5ec12055465e353dbb77 /src/mongo/db/commands/feature_compatibility_version.h
parentf24fbb0011c6ded9101f08574e7cd07e63690a9b (diff)
downloadmongo-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.h60
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