summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2017-10-04 16:52:54 -0400
committerLouis Williams <louis.williams@mongodb.com>2017-10-06 17:46:07 -0400
commit3d42a318626e059b2669356bb5d39056b8fa1b76 (patch)
tree72765174ead0fc800bfc678b7a7ce9152ba586c0 /src/mongo/db
parentbb71f4a4bea6c030675477d0dce18f77d0ee4b4b (diff)
downloadmongo-3d42a318626e059b2669356bb5d39056b8fa1b76.tar.gz
SERVER-30745 Prohibit unsafe comparisons against featureCompatibilityVersion
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/auth/authorization_session_test.cpp2
-rw-r--r--src/mongo/db/auth/role_graph_test.cpp2
-rw-r--r--src/mongo/db/auth/user_document_parser_test.cpp4
-rw-r--r--src/mongo/db/auth/user_management_commands_parser.cpp6
-rw-r--r--src/mongo/db/catalog/coll_mod.cpp8
-rw-r--r--src/mongo/db/catalog/database_impl.cpp13
-rw-r--r--src/mongo/db/catalog/index_key_validate.cpp2
-rw-r--r--src/mongo/db/catalog/index_spec_validate_test.cpp48
-rw-r--r--src/mongo/db/commands/dbcheck.cpp3
-rw-r--r--src/mongo/db/commands/drop_indexes.cpp2
-rw-r--r--src/mongo/db/commands/end_sessions_command.cpp6
-rw-r--r--src/mongo/db/commands/feature_compatibility_version.cpp18
-rw-r--r--src/mongo/db/commands/kill_all_sessions_by_pattern_command.cpp6
-rw-r--r--src/mongo/db/commands/kill_all_sessions_command.cpp6
-rw-r--r--src/mongo/db/commands/kill_sessions_command.cpp6
-rw-r--r--src/mongo/db/commands/mr.cpp3
-rw-r--r--src/mongo/db/commands/refresh_logical_session_cache_now.cpp6
-rw-r--r--src/mongo/db/commands/refresh_sessions_command.cpp6
-rw-r--r--src/mongo/db/commands/set_feature_compatibility_version_command.cpp6
-rw-r--r--src/mongo/db/commands/start_session_command.cpp6
-rw-r--r--src/mongo/db/db.cpp7
-rw-r--r--src/mongo/db/initialize_operation_session_info.cpp3
-rw-r--r--src/mongo/db/keys_collection_cache_reader_and_updater.cpp3
-rw-r--r--src/mongo/db/keys_collection_cache_reader_and_updater_test.cpp6
-rw-r--r--src/mongo/db/keys_collection_manager_sharding.cpp3
-rw-r--r--src/mongo/db/keys_collection_manager_sharding_test.cpp4
-rw-r--r--src/mongo/db/logical_session_id_test.cpp2
-rw-r--r--src/mongo/db/logical_time_metadata_hook.cpp3
-rw-r--r--src/mongo/db/logical_time_validator_test.cpp2
-rw-r--r--src/mongo/db/ops/parsed_update.cpp3
-rw-r--r--src/mongo/db/pipeline/document_source_change_stream.cpp3
-rw-r--r--src/mongo/db/pipeline/document_source_change_stream_test.cpp6
-rw-r--r--src/mongo/db/pipeline/pipeline_test.cpp6
-rw-r--r--src/mongo/db/read_concern.cpp3
-rw-r--r--src/mongo/db/repl/bgsync.cpp9
-rw-r--r--src/mongo/db/repl/idempotency_test.cpp4
-rw-r--r--src/mongo/db/repl/oplog.cpp4
-rw-r--r--src/mongo/db/repl/oplog_fetcher.cpp3
-rw-r--r--src/mongo/db/repl/oplog_fetcher_test.cpp12
-rw-r--r--src/mongo/db/repl/replication_consistency_markers_impl.cpp3
-rw-r--r--src/mongo/db/repl/replication_consistency_markers_impl_test.cpp6
-rw-r--r--src/mongo/db/repl/replication_info.cpp2
-rw-r--r--src/mongo/db/s/config/configsvr_shard_collection_command.cpp3
-rw-r--r--src/mongo/db/s/migration_destination_manager.cpp5
-rw-r--r--src/mongo/db/s/migration_source_manager.cpp3
-rw-r--r--src/mongo/db/s/session_catalog_migration_destination_test.cpp2
-rw-r--r--src/mongo/db/server_options.h32
-rw-r--r--src/mongo/db/service_entry_point_mongod.cpp12
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp5
-rw-r--r--src/mongo/db/update/update_driver.cpp3
50 files changed, 143 insertions, 178 deletions
diff --git a/src/mongo/db/auth/authorization_session_test.cpp b/src/mongo/db/auth/authorization_session_test.cpp
index 0ec66e94598..9fb7effb64c 100644
--- a/src/mongo/db/auth/authorization_session_test.cpp
+++ b/src/mongo/db/auth/authorization_session_test.cpp
@@ -93,7 +93,7 @@ public:
std::unique_ptr<AuthorizationSessionForTest> authzSession;
void setUp() {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
session = transportLayer.createSession();
client = serviceContext.makeClient("testClient", session);
diff --git a/src/mongo/db/auth/role_graph_test.cpp b/src/mongo/db/auth/role_graph_test.cpp
index 5301ab6f6aa..dcbe03002ca 100644
--- a/src/mongo/db/auth/role_graph_test.cpp
+++ b/src/mongo/db/auth/role_graph_test.cpp
@@ -774,7 +774,7 @@ TEST(RoleGraphTest, AddRoleFromDocument) {
return builder.obj();
};
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
RoleGraph graph;
diff --git a/src/mongo/db/auth/user_document_parser_test.cpp b/src/mongo/db/auth/user_document_parser_test.cpp
index 0ce0d378ea9..2eed6173e0a 100644
--- a/src/mongo/db/auth/user_document_parser_test.cpp
+++ b/src/mongo/db/auth/user_document_parser_test.cpp
@@ -231,7 +231,7 @@ public:
V2UserDocumentParser v2parser;
void setUp() {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
user.reset(new User(UserName("spencer", "test")));
adminUser.reset(new User(UserName("admin", "admin")));
@@ -645,7 +645,7 @@ TEST_F(V2UserDocumentParsing, V2AuthenticationRestrictionsExtraction) {
}
TEST_F(V2UserDocumentParsing, V2AuthenticationRestrictionsExtractionAndRetreival) {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
enableIPv6(true);
ASSERT_OK(v2parser.initializeAuthenticationRestrictionsFromUserDocument(
diff --git a/src/mongo/db/auth/user_management_commands_parser.cpp b/src/mongo/db/auth/user_management_commands_parser.cpp
index ec10ce928f7..f206ab72b34 100644
--- a/src/mongo/db/auth/user_management_commands_parser.cpp
+++ b/src/mongo/db/auth/user_management_commands_parser.cpp
@@ -192,8 +192,7 @@ Status parseCreateOrUpdateUserCommands(const BSONObj& cmdObj,
validFieldNames.insert("digestPassword");
validFieldNames.insert("pwd");
validFieldNames.insert("roles");
- if (serverGlobalParams.featureCompatibility.version.load() >=
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ if (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
validFieldNames.insert("authenticationRestrictions");
}
@@ -508,8 +507,7 @@ Status parseCreateOrUpdateRoleCommands(const BSONObj& cmdObj,
validFieldNames.insert(cmdName.toString());
validFieldNames.insert("privileges");
validFieldNames.insert("roles");
- if (serverGlobalParams.featureCompatibility.version.load() >=
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ if (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
validFieldNames.insert("authenticationRestrictions");
}
diff --git a/src/mongo/db/catalog/coll_mod.cpp b/src/mongo/db/catalog/coll_mod.cpp
index 2d7e6e60538..9badcf39050 100644
--- a/src/mongo/db/catalog/coll_mod.cpp
+++ b/src/mongo/db/catalog/coll_mod.cpp
@@ -173,11 +173,9 @@ StatusWith<CollModRequest> parseCollModRequest(OperationContext* opCtx,
MatchExpressionParser::AllowedFeatureSet allowedFeatures =
MatchExpressionParser::kBanAllSpecialFeatures;
if (!serverGlobalParams.featureCompatibility.validateFeaturesAsMaster.load() ||
- serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
- // Allow $jsonSchema and $expr only if the feature compatibility version is newer
- // than 3.4. Note that we don't enforce this restriction on secondary instances, as
- // indicated by !validateFeaturesAsMaster.
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
+ // Note that we don't enforce this restriction on the secondary or on backup
+ // instances, as indicated by !validateFeaturesAsMaster.
allowedFeatures |= MatchExpressionParser::kJSONSchema;
allowedFeatures |= MatchExpressionParser::kExpr;
}
diff --git a/src/mongo/db/catalog/database_impl.cpp b/src/mongo/db/catalog/database_impl.cpp
index 096b7287e2d..161119ef16c 100644
--- a/src/mongo/db/catalog/database_impl.cpp
+++ b/src/mongo/db/catalog/database_impl.cpp
@@ -767,8 +767,7 @@ Collection* DatabaseImpl::createCollection(OperationContext* opCtx,
auto coordinator = repl::ReplicationCoordinator::get(opCtx);
bool okayCreation =
(coordinator->getReplicationMode() != repl::ReplicationCoordinator::modeReplSet ||
- serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k36 ||
+ !serverGlobalParams.featureCompatibility.isFullyUpgradedTo36() ||
coordinator->canAcceptWritesForDatabase(opCtx, nss.db()) ||
nss.isSystemDotProfile()); // system.profile is special as it's not replicated
if (!okayCreation) {
@@ -799,7 +798,7 @@ Collection* DatabaseImpl::createCollection(OperationContext* opCtx,
if (optionsWithUUID.autoIndexId == CollectionOptions::YES ||
optionsWithUUID.autoIndexId == CollectionOptions::DEFAULT) {
const auto featureCompatibilityVersion =
- serverGlobalParams.featureCompatibility.version.load();
+ serverGlobalParams.featureCompatibility.getVersion();
IndexCatalog* ic = collection->getIndexCatalog();
fullIdIndexSpec = uassertStatusOK(ic->createIndexOnEmptyCollection(
opCtx,
@@ -1019,11 +1018,9 @@ auto mongo::userCreateNSImpl(OperationContext* opCtx,
MatchExpressionParser::AllowedFeatureSet allowedFeatures =
MatchExpressionParser::kBanAllSpecialFeatures;
if (!serverGlobalParams.featureCompatibility.validateFeaturesAsMaster.load() ||
- serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
- // $jsonSchema and $expr are only permitted when the feature compatibility version is
- // newer than 3.4. Note that we don't enforce this feature compatibility check when we
- // are on the secondary, as indicated by !validateFeaturesAsMaster.
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
+ // Note that we don't enforce this feature compatibility check when we are on
+ // the secondary or on a backup instance, as indicated by !validateFeaturesAsMaster.
allowedFeatures |= MatchExpressionParser::kJSONSchema;
allowedFeatures |= MatchExpressionParser::kExpr;
}
diff --git a/src/mongo/db/catalog/index_key_validate.cpp b/src/mongo/db/catalog/index_key_validate.cpp
index 0d48247f68d..0a8c30263b5 100644
--- a/src/mongo/db/catalog/index_key_validate.cpp
+++ b/src/mongo/db/catalog/index_key_validate.cpp
@@ -342,7 +342,7 @@ StatusWith<BSONObj> validateIndexSpec(
if (!resolvedIndexVersion) {
resolvedIndexVersion =
- IndexDescriptor::getDefaultIndexVersion(featureCompatibility.version.load());
+ IndexDescriptor::getDefaultIndexVersion(featureCompatibility.getVersion());
}
if (!hasKeyPatternField) {
diff --git a/src/mongo/db/catalog/index_spec_validate_test.cpp b/src/mongo/db/catalog/index_spec_validate_test.cpp
index bb4cc4c1c1f..ca9179df5c4 100644
--- a/src/mongo/db/catalog/index_spec_validate_test.cpp
+++ b/src/mongo/db/catalog/index_spec_validate_test.cpp
@@ -65,7 +65,7 @@ BSONObj sorted(const BSONObj& obj) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfKeyPatternIsNotAnObject) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::TypeMismatch,
@@ -89,7 +89,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfKeyPatternIsNotAnObject) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfFieldRepeatedInKeyPattern) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::BadValue,
@@ -108,7 +108,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfFieldRepeatedInKeyPattern) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfKeyPatternIsNotPresent) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::FailedToParse,
@@ -120,7 +120,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfKeyPatternIsNotPresent) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfNameIsNotAString) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::TypeMismatch,
@@ -131,7 +131,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfNameIsNotAString) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfNameIsNotPresent) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(
@@ -141,7 +141,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfNameIsNotPresent) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceIsNotAString) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::TypeMismatch,
@@ -162,7 +162,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceIsNotAString) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceIsEmptyString) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::BadValue,
@@ -176,7 +176,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceIsEmptyString) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceDoesNotMatch) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::BadValue,
@@ -200,7 +200,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfNamespaceDoesNotMatch) {
TEST(IndexSpecValidateTest, ReturnsIndexSpecWithNamespaceFilledInIfItIsNotPresent) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -226,7 +226,7 @@ TEST(IndexSpecValidateTest, ReturnsIndexSpecWithNamespaceFilledInIfItIsNotPresen
TEST(IndexSpecValidateTest, ReturnsIndexSpecUnchangedIfNamespaceAndVersionArePresent) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -251,7 +251,7 @@ TEST(IndexSpecValidateTest, ReturnsIndexSpecUnchangedIfNamespaceAndVersionArePre
TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsNotANumber) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::TypeMismatch,
@@ -272,7 +272,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsNotANumber) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsNotRepresentableAsInt) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::BadValue,
@@ -307,7 +307,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsNotRepresentableAsInt) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsV0) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::CannotCreateIndex,
@@ -321,7 +321,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsV0) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsUnsupported) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::CannotCreateIndex,
@@ -346,7 +346,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfVersionIsUnsupported) {
TEST(IndexSpecValidateTest, AcceptsIndexVersionsThatAreAllowedForCreation) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -386,7 +386,7 @@ TEST(IndexSpecValidateTest, AcceptsIndexVersionsThatAreAllowedForCreation) {
TEST(IndexSpecValidateTest, DefaultIndexVersionIsV2) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -412,7 +412,7 @@ TEST(IndexSpecValidateTest, DefaultIndexVersionIsV2) {
TEST(IndexSpecValidateTest, AcceptsIndexVersionV1) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -435,7 +435,7 @@ TEST(IndexSpecValidateTest, AcceptsIndexVersionV1) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsNotAnObject) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::TypeMismatch,
@@ -463,7 +463,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsNotAnObject) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsEmpty) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::BadValue,
@@ -477,7 +477,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsEmpty) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsPresentAndVersionIsLessThanV2) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
ASSERT_EQ(ErrorCodes::CannotCreateIndex,
@@ -494,7 +494,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfCollationIsPresentAndVersionIsLessTh
TEST(IndexSpecValidateTest, AcceptsAnyNonEmptyObjectValueForCollation) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -544,7 +544,7 @@ TEST(IndexSpecValidateTest, AcceptsAnyNonEmptyObjectValueForCollation) {
TEST(IndexSpecValidateTest, AcceptsIndexSpecIfCollationIsPresentAndVersionIsEqualToV2) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -573,7 +573,7 @@ TEST(IndexSpecValidateTest, AcceptsIndexSpecIfCollationIsPresentAndVersionIsEqua
TEST(IndexSpecValidateTest, ReturnsAnErrorIfUnknownFieldIsPresentInSpecV2) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
@@ -589,7 +589,7 @@ TEST(IndexSpecValidateTest, ReturnsAnErrorIfUnknownFieldIsPresentInSpecV2) {
TEST(IndexSpecValidateTest, ReturnsAnErrorIfUnknownFieldIsPresentInSpecV1) {
ServerGlobalParams::FeatureCompatibility featureCompatibility;
- featureCompatibility.version.store(ServerGlobalParams::FeatureCompatibility::Version::k36);
+ featureCompatibility.setVersion(ServerGlobalParams::FeatureCompatibility::Version::k36);
featureCompatibility.validateFeaturesAsMaster.store(true);
auto result = validateIndexSpec(BSON("key" << BSON("field" << 1) << "name"
diff --git a/src/mongo/db/commands/dbcheck.cpp b/src/mongo/db/commands/dbcheck.cpp
index cf086a597ee..3650b93af48 100644
--- a/src/mongo/db/commands/dbcheck.cpp
+++ b/src/mongo/db/commands/dbcheck.cpp
@@ -538,8 +538,7 @@ public:
private:
bool _hasCorrectFCV(void) {
- const auto fcv = serverGlobalParams.featureCompatibility.version.load();
- return fcv >= ServerGlobalParams::FeatureCompatibility::Version::k36;
+ return serverGlobalParams.featureCompatibility.isFullyUpgradedTo36();
}
};
diff --git a/src/mongo/db/commands/drop_indexes.cpp b/src/mongo/db/commands/drop_indexes.cpp
index cc234d24d80..7f73d58557a 100644
--- a/src/mongo/db/commands/drop_indexes.cpp
+++ b/src/mongo/db/commands/drop_indexes.cpp
@@ -141,7 +141,7 @@ public:
BackgroundOperation::assertNoBgOpInProgForNs(toReIndexNs.ns());
const auto featureCompatibilityVersion =
- serverGlobalParams.featureCompatibility.version.load();
+ serverGlobalParams.featureCompatibility.getVersion();
const auto defaultIndexVersion =
IndexDescriptor::getDefaultIndexVersion(featureCompatibilityVersion);
diff --git a/src/mongo/db/commands/end_sessions_command.cpp b/src/mongo/db/commands/end_sessions_command.cpp
index 895663a538c..3693c1971fd 100644
--- a/src/mongo/db/commands/end_sessions_command.cpp
+++ b/src/mongo/db/commands/end_sessions_command.cpp
@@ -60,8 +60,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -82,8 +81,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/commands/feature_compatibility_version.cpp b/src/mongo/db/commands/feature_compatibility_version.cpp
index 3301bbe96a4..fa4f5346c48 100644
--- a/src/mongo/db/commands/feature_compatibility_version.cpp
+++ b/src/mongo/db/commands/feature_compatibility_version.cpp
@@ -202,7 +202,7 @@ void FeatureCompatibilityVersion::setIfCleanStartup(OperationContext* opCtx,
// We update the value of the version server parameter so that the admin.system.version
// collection gets a UUID.
- serverGlobalParams.featureCompatibility.targetVersion.store(
+ serverGlobalParams.featureCompatibility.setTargetVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
uassertStatusOK(storageInterface->createCollection(opCtx, nss, {}));
@@ -238,7 +238,7 @@ void FeatureCompatibilityVersion::onInsertOrUpdate(OperationContext* opCtx, cons
// To avoid extra log messages when the targetVersion is set/unset, only log when the version
// changes.
- auto oldVersion = serverGlobalParams.featureCompatibility.version.load();
+ auto oldVersion = serverGlobalParams.featureCompatibility.getVersion();
auto newVersion = versionInfo.version;
if (oldVersion != newVersion) {
log() << "setting featureCompatibilityVersion to " << toString(newVersion);
@@ -247,8 +247,8 @@ void FeatureCompatibilityVersion::onInsertOrUpdate(OperationContext* opCtx, cons
// On commit, update the server parameters, and close any incoming connections with a wire
// version that is below the minimum.
opCtx->recoveryUnit()->onCommit([opCtx, versionInfo]() {
- serverGlobalParams.featureCompatibility.version.store(versionInfo.version);
- serverGlobalParams.featureCompatibility.targetVersion.store(versionInfo.targetVersion);
+ serverGlobalParams.featureCompatibility.setVersion(versionInfo.version);
+ serverGlobalParams.featureCompatibility.setTargetVersion(versionInfo.targetVersion);
// Close all connections from internal clients with binary versions lower than 3.6.
if (versionInfo.version == ServerGlobalParams::FeatureCompatibility::Version::k36 ||
@@ -269,9 +269,9 @@ void FeatureCompatibilityVersion::onDelete(OperationContext* opCtx, const BSONOb
log() << "setting featureCompatibilityVersion to "
<< FeatureCompatibilityVersionCommandParser::kVersion34;
opCtx->recoveryUnit()->onCommit([]() {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
- serverGlobalParams.featureCompatibility.targetVersion.store(
+ serverGlobalParams.featureCompatibility.setTargetVersion(
ServerGlobalParams::FeatureCompatibility::Version::kUnset);
});
}
@@ -280,9 +280,9 @@ void FeatureCompatibilityVersion::onDropCollection(OperationContext* opCtx) {
log() << "setting featureCompatibilityVersion to "
<< FeatureCompatibilityVersionCommandParser::kVersion34;
opCtx->recoveryUnit()->onCommit([]() {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
- serverGlobalParams.featureCompatibility.targetVersion.store(
+ serverGlobalParams.featureCompatibility.setTargetVersion(
ServerGlobalParams::FeatureCompatibility::Version::kUnset);
});
}
@@ -349,7 +349,7 @@ public:
virtual void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) {
b.append(name,
FeatureCompatibilityVersion::toString(
- serverGlobalParams.featureCompatibility.version.load()));
+ serverGlobalParams.featureCompatibility.getVersion()));
}
virtual Status set(const BSONElement& newValueElement) {
diff --git a/src/mongo/db/commands/kill_all_sessions_by_pattern_command.cpp b/src/mongo/db/commands/kill_all_sessions_by_pattern_command.cpp
index c4147529484..30590d93739 100644
--- a/src/mongo/db/commands/kill_all_sessions_by_pattern_command.cpp
+++ b/src/mongo/db/commands/kill_all_sessions_by_pattern_command.cpp
@@ -73,8 +73,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -92,8 +91,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/commands/kill_all_sessions_command.cpp b/src/mongo/db/commands/kill_all_sessions_command.cpp
index aeeffacc732..452a25cc6b5 100644
--- a/src/mongo/db/commands/kill_all_sessions_command.cpp
+++ b/src/mongo/db/commands/kill_all_sessions_command.cpp
@@ -73,8 +73,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -92,8 +91,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/commands/kill_sessions_command.cpp b/src/mongo/db/commands/kill_sessions_command.cpp
index c8b67f8f695..9e6c9e05dc1 100644
--- a/src/mongo/db/commands/kill_sessions_command.cpp
+++ b/src/mongo/db/commands/kill_sessions_command.cpp
@@ -102,8 +102,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -115,8 +114,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/commands/mr.cpp b/src/mongo/db/commands/mr.cpp
index 27f907f4ab8..f8882ec158f 100644
--- a/src/mongo/db/commands/mr.cpp
+++ b/src/mongo/db/commands/mr.cpp
@@ -1738,8 +1738,7 @@ public:
Config config(dbname, cmdObj.firstElement().embeddedObjectUserCheck());
if (cmdObj["finalOutputCollIsSharded"].trueValue() &&
- serverGlobalParams.featureCompatibility.version.load() >=
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ serverGlobalParams.featureCompatibility.isSchemaVersion36()) {
uassert(ErrorCodes::InvalidOptions,
"This shard has feature compatibility version 3.6, so it expects mongos to "
"send the UUID to use for the sharded output collection. Was the mapReduce "
diff --git a/src/mongo/db/commands/refresh_logical_session_cache_now.cpp b/src/mongo/db/commands/refresh_logical_session_cache_now.cpp
index cb607f13b82..cf4d6a713c4 100644
--- a/src/mongo/db/commands/refresh_logical_session_cache_now.cpp
+++ b/src/mongo/db/commands/refresh_logical_session_cache_now.cpp
@@ -66,8 +66,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -79,8 +78,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/commands/refresh_sessions_command.cpp b/src/mongo/db/commands/refresh_sessions_command.cpp
index 452894bd24f..c8dc0b31914 100644
--- a/src/mongo/db/commands/refresh_sessions_command.cpp
+++ b/src/mongo/db/commands/refresh_sessions_command.cpp
@@ -62,8 +62,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -84,8 +83,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
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 92d8ce3e0e3..da5b4876311 100644
--- a/src/mongo/db/commands/set_feature_compatibility_version_command.cpp
+++ b/src/mongo/db/commands/set_feature_compatibility_version_command.cpp
@@ -102,10 +102,8 @@ public:
}
bool isFCVUpgrade(StringData version) {
- const auto existingVersion = FeatureCompatibilityVersion::toString(
- serverGlobalParams.featureCompatibility.version.load());
return version == FeatureCompatibilityVersionCommandParser::kVersion36 &&
- existingVersion == FeatureCompatibilityVersionCommandParser::kVersion34;
+ !serverGlobalParams.featureCompatibility.isFullyUpgradedTo36();
}
@@ -116,7 +114,7 @@ public:
const auto version = uassertStatusOK(
FeatureCompatibilityVersionCommandParser::extractVersionFromCommand(getName(), cmdObj));
auto existingVersion = FeatureCompatibilityVersion::toString(
- serverGlobalParams.featureCompatibility.version.load())
+ serverGlobalParams.featureCompatibility.getVersion())
.toString();
// Wait for majority commit in case we're upgrading simultaneously with another session.
diff --git a/src/mongo/db/commands/start_session_command.cpp b/src/mongo/db/commands/start_session_command.cpp
index 05341a93c2f..6454bc2dc50 100644
--- a/src/mongo/db/commands/start_session_command.cpp
+++ b/src/mongo/db/commands/start_session_command.cpp
@@ -67,8 +67,7 @@ public:
const std::string& dbname,
const BSONObj& cmdObj) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return SessionsCommandFCV34Status(getName());
}
@@ -80,8 +79,7 @@ public:
const BSONObj& cmdObj,
BSONObjBuilder& result) override {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return appendCommandStatus(result, SessionsCommandFCV34Status(getName()));
}
diff --git a/src/mongo/db/db.cpp b/src/mongo/db/db.cpp
index 33616432f3b..d3bc602d95e 100644
--- a/src/mongo/db/db.cpp
+++ b/src/mongo/db/db.cpp
@@ -411,8 +411,8 @@ void repairDatabasesAndCheckVersion(OperationContext* opCtx) {
fassertFailedNoTrace(40283);
}
auto versionInfo = swVersionInfo.getValue();
- serverGlobalParams.featureCompatibility.version.store(versionInfo.version);
- serverGlobalParams.featureCompatibility.targetVersion.store(
+ serverGlobalParams.featureCompatibility.setVersion(versionInfo.version);
+ serverGlobalParams.featureCompatibility.setTargetVersion(
versionInfo.targetVersion);
// On startup, if the targetVersion field exists, then an upgrade/downgrade
@@ -1050,8 +1050,7 @@ void shutdownTask() {
opCtx = uniqueOpCtx.get();
}
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
log(LogComponent::kReplication) << "shutdown: removing all drop-pending collections...";
repl::DropPendingCollectionReaper::get(serviceContext)
->dropCollectionsOlderThan(opCtx, repl::OpTime::max());
diff --git a/src/mongo/db/initialize_operation_session_info.cpp b/src/mongo/db/initialize_operation_session_info.cpp
index eeaa6aca278..a3ca5b66eb1 100644
--- a/src/mongo/db/initialize_operation_session_info.cpp
+++ b/src/mongo/db/initialize_operation_session_info.cpp
@@ -46,8 +46,7 @@ void initializeOperationSessionInfo(OperationContext* opCtx,
return;
}
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return;
}
diff --git a/src/mongo/db/keys_collection_cache_reader_and_updater.cpp b/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
index ce20c5d5993..65efb639e6b 100644
--- a/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
+++ b/src/mongo/db/keys_collection_cache_reader_and_updater.cpp
@@ -83,8 +83,7 @@ StatusWith<KeysCollectionDocument> KeysCollectionCacheReaderAndUpdater::refresh(
return {ErrorCodes::FailPointEnabled, "key generation disabled"};
}
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return KeysCollectionCacheReader::refresh(opCtx);
}
diff --git a/src/mongo/db/keys_collection_cache_reader_and_updater_test.cpp b/src/mongo/db/keys_collection_cache_reader_and_updater_test.cpp
index 75cf3d993e2..0010f262705 100644
--- a/src/mongo/db/keys_collection_cache_reader_and_updater_test.cpp
+++ b/src/mongo/db/keys_collection_cache_reader_and_updater_test.cpp
@@ -54,7 +54,7 @@ protected:
void setUp() override {
ConfigServerTestFixture::setUp();
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
serverGlobalParams.featureCompatibility.validateFeaturesAsMaster.store(true);
@@ -457,7 +457,7 @@ TEST_F(CacheUpdaterTest, ShouldNotCreateKeysWithDisableKeyGenerationFailPoint) {
}
TEST_F(CacheUpdaterTest, ShouldNotCreateNewKeysInFeatureCompatiblityVersion34) {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
KeysCollectionCacheReaderAndUpdater updater("dummy", catalogClient(), Seconds(5));
@@ -474,7 +474,7 @@ TEST_F(CacheUpdaterTest, ShouldNotCreateNewKeysInFeatureCompatiblityVersion34) {
}
// Increase the feature compatibility version and verify keys are found after refresh.
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
{
diff --git a/src/mongo/db/keys_collection_manager_sharding.cpp b/src/mongo/db/keys_collection_manager_sharding.cpp
index c63aa33e1eb..265dbf9e51f 100644
--- a/src/mongo/db/keys_collection_manager_sharding.cpp
+++ b/src/mongo/db/keys_collection_manager_sharding.cpp
@@ -236,8 +236,7 @@ void KeysCollectionManagerSharding::PeriodicRunner::_doPeriodicRefresh(
Milliseconds nextWakeup = kRefreshIntervalIfErrored;
// No need to refresh keys in FCV 3.4, since key generation will be disabled.
- if (serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
auto latestKeyStatusWith = (*doRefresh)(opCtx.get());
if (latestKeyStatusWith.getStatus().isOK()) {
errorCount = 0;
diff --git a/src/mongo/db/keys_collection_manager_sharding_test.cpp b/src/mongo/db/keys_collection_manager_sharding_test.cpp
index 4c209a87e62..27e659c38a4 100644
--- a/src/mongo/db/keys_collection_manager_sharding_test.cpp
+++ b/src/mongo/db/keys_collection_manager_sharding_test.cpp
@@ -59,7 +59,7 @@ protected:
void setUp() override {
ConfigServerTestFixture::setUp();
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
serverGlobalParams.featureCompatibility.validateFeaturesAsMaster.store(true);
@@ -375,7 +375,7 @@ TEST_F(KeysManagerShardedTest, HasSeenKeysIsFalseUntilKeysAreFound) {
}
TEST_F(KeysManagerShardedTest, ShouldNotReturnKeysInFeatureCompatibilityVersion34) {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
keyManager()->startMonitoring(getServiceContext());
diff --git a/src/mongo/db/logical_session_id_test.cpp b/src/mongo/db/logical_session_id_test.cpp
index 6d796fb7710..9e9e828372b 100644
--- a/src/mongo/db/logical_session_id_test.cpp
+++ b/src/mongo/db/logical_session_id_test.cpp
@@ -70,7 +70,7 @@ public:
AuthorizationSessionForTest* authzSession;
void setUp() {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
session = transportLayer.createSession();
client = serviceContext.makeClient("testClient", session);
diff --git a/src/mongo/db/logical_time_metadata_hook.cpp b/src/mongo/db/logical_time_metadata_hook.cpp
index 4a8d94241d6..12745e8d793 100644
--- a/src/mongo/db/logical_time_metadata_hook.cpp
+++ b/src/mongo/db/logical_time_metadata_hook.cpp
@@ -75,8 +75,7 @@ Status LogicalTimeMetadataHook::readReplyMetadata(OperationContext* opCtx,
return Status::OK();
}
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return Status::OK();
}
diff --git a/src/mongo/db/logical_time_validator_test.cpp b/src/mongo/db/logical_time_validator_test.cpp
index 2f029d272c9..3f1a9c0bc18 100644
--- a/src/mongo/db/logical_time_validator_test.cpp
+++ b/src/mongo/db/logical_time_validator_test.cpp
@@ -61,7 +61,7 @@ protected:
void setUp() override {
ConfigServerTestFixture::setUp();
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
serverGlobalParams.featureCompatibility.validateFeaturesAsMaster.store(true);
diff --git a/src/mongo/db/ops/parsed_update.cpp b/src/mongo/db/ops/parsed_update.cpp
index 108475f84be..7944a16a545 100644
--- a/src/mongo/db/ops/parsed_update.cpp
+++ b/src/mongo/db/ops/parsed_update.cpp
@@ -160,8 +160,7 @@ Status ParsedUpdate::parseUpdate() {
Status ParsedUpdate::parseArrayFilters() {
if (!_request->getArrayFilters().empty() &&
- serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ !serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
return Status(ErrorCodes::InvalidOptions,
str::stream()
<< "The featureCompatibilityVersion must be 3.6 to use arrayFilters. See "
diff --git a/src/mongo/db/pipeline/document_source_change_stream.cpp b/src/mongo/db/pipeline/document_source_change_stream.cpp
index e9b49de2c47..33f04885148 100644
--- a/src/mongo/db/pipeline/document_source_change_stream.cpp
+++ b/src/mongo/db/pipeline/document_source_change_stream.cpp
@@ -251,8 +251,7 @@ list<intrusive_ptr<DocumentSource>> DocumentSourceChangeStream::createFromBson(
<< "The featureCompatibilityVersion must be 3.6 to use the $changeStream stage. See "
<< feature_compatibility_version::kDochubLink
<< ".",
- serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34);
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36());
// TODO: Add sharding support here (SERVER-29141).
uassert(
40470, "The $changeStream stage is not supported on sharded systems.", !expCtx->inMongos);
diff --git a/src/mongo/db/pipeline/document_source_change_stream_test.cpp b/src/mongo/db/pipeline/document_source_change_stream_test.cpp
index 989a331a1a4..9f5b1f5844e 100644
--- a/src/mongo/db/pipeline/document_source_change_stream_test.cpp
+++ b/src/mongo/db/pipeline/document_source_change_stream_test.cpp
@@ -72,11 +72,11 @@ class EnsureFCV {
public:
using Version = ServerGlobalParams::FeatureCompatibility::Version;
EnsureFCV(Version version)
- : _origVersion(serverGlobalParams.featureCompatibility.version.load()) {
- serverGlobalParams.featureCompatibility.version.store(version);
+ : _origVersion(serverGlobalParams.featureCompatibility.getVersion()) {
+ serverGlobalParams.featureCompatibility.setVersion(version);
}
~EnsureFCV() {
- serverGlobalParams.featureCompatibility.version.store(_origVersion);
+ serverGlobalParams.featureCompatibility.setVersion(_origVersion);
}
private:
diff --git a/src/mongo/db/pipeline/pipeline_test.cpp b/src/mongo/db/pipeline/pipeline_test.cpp
index 8a29dd8b9e4..aa58c26bdfa 100644
--- a/src/mongo/db/pipeline/pipeline_test.cpp
+++ b/src/mongo/db/pipeline/pipeline_test.cpp
@@ -74,11 +74,11 @@ class EnsureFCV {
public:
using Version = ServerGlobalParams::FeatureCompatibility::Version;
EnsureFCV(Version version)
- : _origVersion(serverGlobalParams.featureCompatibility.version.load()) {
- serverGlobalParams.featureCompatibility.version.store(version);
+ : _origVersion(serverGlobalParams.featureCompatibility.getVersion()) {
+ serverGlobalParams.featureCompatibility.setVersion(version);
}
~EnsureFCV() {
- serverGlobalParams.featureCompatibility.version.store(_origVersion);
+ serverGlobalParams.featureCompatibility.setVersion(_origVersion);
}
private:
diff --git a/src/mongo/db/read_concern.cpp b/src/mongo/db/read_concern.cpp
index 4b055c6f646..35d625ccf84 100644
--- a/src/mongo/db/read_concern.cpp
+++ b/src/mongo/db/read_concern.cpp
@@ -158,8 +158,7 @@ Status waitForReadConcern(OperationContext* opCtx, const repl::ReadConcernArgs&
auto afterClusterTime = readConcernArgs.getArgsClusterTime();
if (afterClusterTime) {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34 &&
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36() &&
ShardingState::get(opCtx)->enabled()) {
return {ErrorCodes::InvalidOptions,
"readConcern afterClusterTime is not available in featureCompatibilityVersion "
diff --git a/src/mongo/db/repl/bgsync.cpp b/src/mongo/db/repl/bgsync.cpp
index 21c88b4f6d3..447d0949d7a 100644
--- a/src/mongo/db/repl/bgsync.cpp
+++ b/src/mongo/db/repl/bgsync.cpp
@@ -679,8 +679,7 @@ void BackgroundSync::_runRollback(OperationContext* opCtx,
opCtx, source, &localOplog, storageInterface, getConnection);
} else if (rollbackMethod != kRollbackViaRefetchNoUUID &&
- (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k36)) {
+ (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36())) {
// If the user is in FCV 3.6 and the user did not specify to fall back on "roll back via
// refetch" without UUID support, then we use "roll back via refetch" with UUIDs.
@@ -698,14 +697,12 @@ void BackgroundSync::_runRollback(OperationContext* opCtx,
} else {
if (rollbackMethod == kRollbackToCheckpoint) {
invariant(!supportsCheckpointRollback);
- invariant(serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34);
+ invariant(!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36());
log() << "Rollback using the 'rollbackViaRefetchNoUUID' method because this storage "
"engine does not support 'roll back to a checkpoint' and we are "
"in featureCompatibilityVersion 3.4.";
} else if (rollbackMethod == kRollbackViaRefetch) {
- invariant(serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34);
+ invariant(!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36());
log() << "Rollback using the 'rollbackViaRefetchNoUUID' method. 'rollbackViaRefetch' "
"with UUID support is not feature compatible with featureCompatabilityVersion "
"3.4.";
diff --git a/src/mongo/db/repl/idempotency_test.cpp b/src/mongo/db/repl/idempotency_test.cpp
index 84a03172947..b6d44eff367 100644
--- a/src/mongo/db/repl/idempotency_test.cpp
+++ b/src/mongo/db/repl/idempotency_test.cpp
@@ -193,13 +193,13 @@ void RandomizedIdempotencyTest::runIdempotencyTestCase() {
}
TEST_F(RandomizedIdempotencyTest, CheckUpdateSequencesAreIdempotentWhenFCV34) {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
runIdempotencyTestCase();
}
TEST_F(RandomizedIdempotencyTest, CheckUpdateSequencesAreIdempotentWhenFCV36) {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
runIdempotencyTestCase();
}
diff --git a/src/mongo/db/repl/oplog.cpp b/src/mongo/db/repl/oplog.cpp
index 99d2e0c3929..110909ffd6c 100644
--- a/src/mongo/db/repl/oplog.cpp
+++ b/src/mongo/db/repl/oplog.cpp
@@ -344,9 +344,7 @@ OplogDocWriter _logOpWriter(OperationContext* opCtx,
if (o2)
b.append("o2", *o2);
- if (wallTime != Date_t{} &&
- serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (wallTime != Date_t{} && serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
b.appendDate("wall", wallTime);
}
diff --git a/src/mongo/db/repl/oplog_fetcher.cpp b/src/mongo/db/repl/oplog_fetcher.cpp
index b4b0b024e4f..12cc813de49 100644
--- a/src/mongo/db/repl/oplog_fetcher.cpp
+++ b/src/mongo/db/repl/oplog_fetcher.cpp
@@ -367,8 +367,7 @@ BSONObj OplogFetcher::_makeFindCommandObject(const NamespaceString& nss,
// TODO(SERVER-30977): Remove the term comparison when this ticket is fixed.
if (term == lastOpTimeFetched.getTerm()) {
cmdBob.append("readConcern",
- serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34
+ !serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()
? BSON("afterOpTime" << lastOpTimeFetched)
: BSON("afterClusterTime" << lastOpTimeFetched.getTimestamp()));
}
diff --git a/src/mongo/db/repl/oplog_fetcher_test.cpp b/src/mongo/db/repl/oplog_fetcher_test.cpp
index c87542c9e12..b2195e50710 100644
--- a/src/mongo/db/repl/oplog_fetcher_test.cpp
+++ b/src/mongo/db/repl/oplog_fetcher_test.cpp
@@ -269,11 +269,11 @@ class EnsureFCV {
public:
using Version = ServerGlobalParams::FeatureCompatibility::Version;
EnsureFCV(Version version)
- : _version(version), _origVersion(serverGlobalParams.featureCompatibility.version.load()) {
- serverGlobalParams.featureCompatibility.version.store(_version);
+ : _version(version), _origVersion(serverGlobalParams.featureCompatibility.getVersion()) {
+ serverGlobalParams.featureCompatibility.setVersion(_version);
}
~EnsureFCV() {
- serverGlobalParams.featureCompatibility.version.store(_origVersion);
+ serverGlobalParams.featureCompatibility.setVersion(_origVersion);
}
private:
@@ -297,8 +297,7 @@ TEST_F(OplogFetcherTest, FindQueryHasNoReadconcernIfTermUninitialized) {
TEST_F(OplogFetcherTest, FindQueryHasAfterOpTimeWithFeatureCompatibilityVersion34) {
EnsureFCV ensureFCV(EnsureFCV::Version::k34);
- ASSERT(serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34);
+ ASSERT(!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36());
auto cmdObj = makeOplogFetcher(_createConfig(true))->getFindQuery_forTest();
auto readConcernElem = cmdObj["readConcern"];
ASSERT_EQUALS(mongo::BSONType::Object, readConcernElem.type());
@@ -310,8 +309,7 @@ TEST_F(OplogFetcherTest, FindQueryHasAfterOpTimeWithFeatureCompatibilityVersion3
TEST_F(OplogFetcherTest, FindQueryHasAfterOpTimeWithFeatureCompatibilityVersion36) {
EnsureFCV ensureFCV(EnsureFCV::Version::k36);
- ASSERT(serverGlobalParams.featureCompatibility.version.load() !=
- ServerGlobalParams::FeatureCompatibility::Version::k34);
+ ASSERT(serverGlobalParams.featureCompatibility.isFullyUpgradedTo36());
auto cmdObj = makeOplogFetcher(_createConfig(true))->getFindQuery_forTest();
auto readConcernElem = cmdObj["readConcern"];
ASSERT_EQUALS(mongo::BSONType::Object, readConcernElem.type());
diff --git a/src/mongo/db/repl/replication_consistency_markers_impl.cpp b/src/mongo/db/repl/replication_consistency_markers_impl.cpp
index c4be7496074..39fc82c321b 100644
--- a/src/mongo/db/repl/replication_consistency_markers_impl.cpp
+++ b/src/mongo/db/repl/replication_consistency_markers_impl.cpp
@@ -277,8 +277,7 @@ Timestamp ReplicationConsistencyMarkersImpl::getOplogTruncateAfterPoint(
OperationContext* opCtx) const {
auto doc = _getOplogTruncateAfterPointDocument(opCtx);
if (!doc) {
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34) {
+ if (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
LOG(3) << "Falling back on old oplog delete from point because there is no oplog "
"truncate after point and we are in FCV 3.4.";
return _getOldOplogDeleteFromPoint(opCtx);
diff --git a/src/mongo/db/repl/replication_consistency_markers_impl_test.cpp b/src/mongo/db/repl/replication_consistency_markers_impl_test.cpp
index bb3199e2a62..105613c516f 100644
--- a/src/mongo/db/repl/replication_consistency_markers_impl_test.cpp
+++ b/src/mongo/db/repl/replication_consistency_markers_impl_test.cpp
@@ -316,7 +316,7 @@ TEST_F(ReplicationConsistencyMarkersTest, OplogTruncateAfterPointUpgrade) {
consistencyMarkers.initializeMinValidDocument(opCtx);
// Set the feature compatibility version to 3.6.
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
// Check that we see no oplog truncate after point in FCV 3.6.
@@ -324,7 +324,7 @@ TEST_F(ReplicationConsistencyMarkersTest, OplogTruncateAfterPointUpgrade) {
ASSERT_EQ(consistencyMarkers.getMinValid(opCtx), minValidTime);
// Set the feature compatibility version to 3.4.
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k34);
// Check that we see the old oplog delete from point in FCV 3.4.
@@ -347,7 +347,7 @@ TEST_F(ReplicationConsistencyMarkersTest, OplogTruncateAfterPointUpgrade) {
ASSERT_EQ(consistencyMarkers.getMinValid(opCtx), minValidTime);
// Set the feature compatibility version to 3.6.
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
// Check that after removing the old oplog delete from point, that we do not see the oplog
diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp
index e29d748aa37..f27e1608e73 100644
--- a/src/mongo/db/repl/replication_info.cpp
+++ b/src/mongo/db/repl/replication_info.cpp
@@ -363,7 +363,7 @@ public:
// Then if the connection is from a mongod/mongos of an earlier version, it will fail to
// connect.
if (internalClientElement &&
- serverGlobalParams.featureCompatibility.version.load() ==
+ serverGlobalParams.featureCompatibility.getVersion() ==
ServerGlobalParams::FeatureCompatibility::Version::k36) {
result.append("minWireVersion", WireSpec::instance().incoming.maxWireVersion);
} else {
diff --git a/src/mongo/db/s/config/configsvr_shard_collection_command.cpp b/src/mongo/db/s/config/configsvr_shard_collection_command.cpp
index 3f95d89b31e..dbe4c7c2a36 100644
--- a/src/mongo/db/s/config/configsvr_shard_collection_command.cpp
+++ b/src/mongo/db/s/config/configsvr_shard_collection_command.cpp
@@ -640,8 +640,7 @@ void migrateAndFurtherSplitInitialChunks(OperationContext* opCtx,
boost::optional<UUID> getUUIDFromPrimaryShard(const NamespaceString& nss,
ScopedDbConnection& conn) {
// UUIDs were introduced in featureCompatibilityVersion 3.6.
- if (serverGlobalParams.featureCompatibility.version.load() <
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ if (!serverGlobalParams.featureCompatibility.isSchemaVersion36()) {
return boost::none;
}
diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp
index 86688ba08ca..0dd4967c9f5 100644
--- a/src/mongo/db/s/migration_destination_manager.cpp
+++ b/src/mongo/db/s/migration_destination_manager.cpp
@@ -550,10 +550,7 @@ void MigrationDestinationManager::_migrateDriver(OperationContext* opCtx,
info = entry["info"].Obj();
}
- // If in featureCompatibilityVersion >= 3.6, require the donor to return the
- // collection's UUID.
- if (serverGlobalParams.featureCompatibility.version.load() >=
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ if (serverGlobalParams.featureCompatibility.isSchemaVersion36()) {
if (info["uuid"].eoo()) {
setStateFailWarn(str::stream()
<< "The donor shard did not return a UUID for collection "
diff --git a/src/mongo/db/s/migration_source_manager.cpp b/src/mongo/db/s/migration_source_manager.cpp
index e16addcd83e..d1ed1b7be88 100644
--- a/src/mongo/db/s/migration_source_manager.cpp
+++ b/src/mongo/db/s/migration_source_manager.cpp
@@ -230,8 +230,7 @@ Status MigrationSourceManager::enterCriticalSection(OperationContext* opCtx) {
const ShardId& recipientId = _args.getToShardId();
if (!_collectionMetadata->getChunkManager()->getVersion(recipientId).isSet() &&
- serverGlobalParams.featureCompatibility.version.load() >=
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
// The recipient didn't have any chunks of this collection. Write the no-op message so that
// change stream will notice that and close cursor to notify mongos to target to the new
// shard.
diff --git a/src/mongo/db/s/session_catalog_migration_destination_test.cpp b/src/mongo/db/s/session_catalog_migration_destination_test.cpp
index 3dc34514061..56a63df7afb 100644
--- a/src/mongo/db/s/session_catalog_migration_destination_test.cpp
+++ b/src/mongo/db/s/session_catalog_migration_destination_test.cpp
@@ -83,7 +83,7 @@ repl::OplogEntry extractInnerOplog(const repl::OplogEntry& oplog) {
class SessionCatalogMigrationDestinationTest : public ShardingMongodTestFixture {
public:
void setUp() override {
- serverGlobalParams.featureCompatibility.version.store(
+ serverGlobalParams.featureCompatibility.setVersion(
ServerGlobalParams::FeatureCompatibility::Version::k36);
serverGlobalParams.clusterRole = ClusterRole::ShardServer;
ShardingMongodTestFixture::setUp();
diff --git a/src/mongo/db/server_options.h b/src/mongo/db/server_options.h
index 76b2df4aa6c..c3cd1b89b8d 100644
--- a/src/mongo/db/server_options.h
+++ b/src/mongo/db/server_options.h
@@ -167,25 +167,36 @@ struct ServerGlobalParams {
*/
enum class Version { k34, k36, kUnset };
- AtomicWord<Version> version{Version::k34};
+ const Version getVersion() const {
+ return _version.load();
+ }
- // If set, an upgrade or downgrade is in progress to the set version.
- AtomicWord<Version> targetVersion{Version::kUnset};
+ void setVersion(Version version) {
+ return _version.store(version);
+ }
+
+ const Version getTargetVersion() const {
+ return _targetVersion.load();
+ }
+
+ void setTargetVersion(Version version) {
+ return _targetVersion.store(version);
+ }
const bool isFullyUpgradedTo36() {
- return (version.load() == Version::k36 && targetVersion.load() == Version::kUnset);
+ return (_version.load() == Version::k36 && _targetVersion.load() == Version::kUnset);
}
const bool isUpgradingTo36() {
- return (version.load() == Version::k34 && targetVersion.load() == Version::k36);
+ return (_version.load() == Version::k34 && _targetVersion.load() == Version::k36);
}
const bool isFullyDowngradedTo34() {
- return (version.load() == Version::k34 && targetVersion.load() == Version::kUnset);
+ return (_version.load() == Version::k34 && _targetVersion.load() == Version::kUnset);
}
const bool isDowngradingTo34() {
- return (version.load() == Version::k34 && targetVersion.load() == Version::k34);
+ return (_version.load() == Version::k34 && _targetVersion.load() == Version::k34);
}
// This determines whether to give Collections UUIDs upon creation.
@@ -199,6 +210,13 @@ struct ServerGlobalParams {
// a master) always validates in "3.4" mode so that it can sync 3.4 features, even when in
// "3.2" feature compatibility mode.
AtomicWord<bool> validateFeaturesAsMaster{true};
+
+ private:
+ AtomicWord<Version> _version{Version::k34};
+
+ // If set, an upgrade or downgrade is in progress to the set version.
+ AtomicWord<Version> _targetVersion{Version::kUnset};
+
} featureCompatibility;
std::vector<std::string> disabledSecureAllocatorDomains;
diff --git a/src/mongo/db/service_entry_point_mongod.cpp b/src/mongo/db/service_entry_point_mongod.cpp
index d4a45dd7a80..d0c2e449646 100644
--- a/src/mongo/db/service_entry_point_mongod.cpp
+++ b/src/mongo/db/service_entry_point_mongod.cpp
@@ -272,8 +272,7 @@ void appendReplyMetadata(OperationContext* opCtx,
.writeToMetadata(metadataBob)
.transitional_ignore();
}
- if (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ if (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
if (LogicalTimeValidator::isAuthorizedToAdvanceClock(opCtx)) {
// No need to sign cluster times for internal clients.
SignedLogicalTime currentTime(
@@ -500,8 +499,7 @@ bool runCommandImpl(OperationContext* opCtx,
// An uninitialized operation time means the cluster time is not propagated, so the operation
// time should not be attached to the response.
if (operationTime != LogicalTime::kUninitialized &&
- serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
operationTime.appendAsOperationTime(&inPlaceReplyBob);
}
@@ -679,8 +677,7 @@ void execCommandDatabase(OperationContext* opCtx,
if (!opCtx->getClient()->isInDirectClient() &&
readConcernArgs.getLevel() != repl::ReadConcernLevel::kAvailableReadConcern &&
(iAmPrimary ||
- (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k36 &&
+ (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36() &&
(readConcernArgs.hasLevel() || readConcernArgs.getArgsClusterTime())))) {
oss.initializeShardVersion(NamespaceString(command->parseNs(dbname, request.body)),
shardVersionFieldIdx);
@@ -748,8 +745,7 @@ void execCommandDatabase(OperationContext* opCtx,
// An uninitialized operation time means the cluster time is not propagated, so the
// operation time should not be attached to the error response.
if (operationTime != LogicalTime::kUninitialized &&
- serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k36) {
+ serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) {
LOG(1) << "assertion while executing command '" << request.getCommandName() << "' "
<< "on database '" << request.getDatabase() << "' "
<< "with arguments '" << command->getRedactedCopyForLogging(request.body)
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
index 334ba3852bc..a43c9cb9f49 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
@@ -495,9 +495,8 @@ void WiredTigerKVEngine::cleanShutdown() {
closeConfig = "leak_memory=true";
}
- const bool needsDowngrade = !_readOnly &&
- serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34;
+ const bool needsDowngrade =
+ !_readOnly && !serverGlobalParams.featureCompatibility.isFullyUpgradedTo36();
invariantWTOK(_conn->close(_conn, closeConfig));
_conn = nullptr;
diff --git a/src/mongo/db/update/update_driver.cpp b/src/mongo/db/update/update_driver.cpp
index 5380de021ae..fb076acf98d 100644
--- a/src/mongo/db/update/update_driver.cpp
+++ b/src/mongo/db/update/update_driver.cpp
@@ -198,8 +198,7 @@ Status UpdateDriver::parse(
} else if (_modOptions.fromOplogApplication) {
updateSemantics = UpdateSemantics::kModifierInterface;
} else {
- updateSemantics = (serverGlobalParams.featureCompatibility.version.load() ==
- ServerGlobalParams::FeatureCompatibility::Version::k34)
+ updateSemantics = (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36())
? UpdateSemantics::kModifierInterface
: UpdateSemantics::kUpdateNode;
}