diff options
author | Louis Williams <louis.williams@mongodb.com> | 2017-10-04 16:52:54 -0400 |
---|---|---|
committer | Louis Williams <louis.williams@mongodb.com> | 2017-10-06 17:46:07 -0400 |
commit | 3d42a318626e059b2669356bb5d39056b8fa1b76 (patch) | |
tree | 72765174ead0fc800bfc678b7a7ce9152ba586c0 /src | |
parent | bb71f4a4bea6c030675477d0dce18f77d0ee4b4b (diff) | |
download | mongo-3d42a318626e059b2669356bb5d39056b8fa1b76.tar.gz |
SERVER-30745 Prohibit unsafe comparisons against featureCompatibilityVersion
Diffstat (limited to 'src')
55 files changed, 150 insertions, 188 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; } diff --git a/src/mongo/dbtests/dbtests.cpp b/src/mongo/dbtests/dbtests.cpp index 8721fc4dd48..01076391f9f 100644 --- a/src/mongo/dbtests/dbtests.cpp +++ b/src/mongo/dbtests/dbtests.cpp @@ -121,7 +121,7 @@ int dbtestsMain(int argc, char** argv, char** envp) { ::mongo::setupSynchronousSignalHandlers(); mongo::dbtests::initWireSpec(); mongo::runGlobalInitializersOrDie(argc, argv, envp); - serverGlobalParams.featureCompatibility.version.store( + serverGlobalParams.featureCompatibility.setVersion( ServerGlobalParams::FeatureCompatibility::Version::k36); repl::ReplSettings replSettings; replSettings.setOplogSizeBytes(10 * 1024 * 1024); diff --git a/src/mongo/rpc/metadata.cpp b/src/mongo/rpc/metadata.cpp index 2d569de56bd..c4488220493 100644 --- a/src/mongo/rpc/metadata.cpp +++ b/src/mongo/rpc/metadata.cpp @@ -101,8 +101,7 @@ void readRequestMetadata(OperationContext* opCtx, const BSONObj& metadataObj) { if (signedTime.getTime() != LogicalTime::kUninitialized) { // Cluster times are only sent by sharding aware mongod servers, so this point is only // reached in sharded clusters. - if (serverGlobalParams.featureCompatibility.version.load() != - ServerGlobalParams::FeatureCompatibility::Version::k34) { + if (serverGlobalParams.featureCompatibility.isFullyUpgradedTo36()) { auto logicalTimeValidator = LogicalTimeValidator::get(opCtx); if (!LogicalTimeValidator::isAuthorizedToAdvanceClock(opCtx)) { if (!logicalTimeValidator) { diff --git a/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp b/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp index 22f9df340c9..e1ebbee383a 100644 --- a/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp +++ b/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp @@ -339,11 +339,9 @@ StatusWith<ShardType> ShardingCatalogManager::_validateHostAsShard( << " as a shard: " << status.reason()); } - if ((serverGlobalParams.featureCompatibility.version.load() == - ServerGlobalParams::FeatureCompatibility::Version::k36 && + if ((serverGlobalParams.featureCompatibility.isFullyUpgradedTo36() && maxWireVersion < WireVersion::LATEST_WIRE_VERSION) || - (serverGlobalParams.featureCompatibility.version.load() == - ServerGlobalParams::FeatureCompatibility::Version::k34 && + (!serverGlobalParams.featureCompatibility.isFullyUpgradedTo36() && maxWireVersion < WireVersion::LATEST_WIRE_VERSION - 1)) { return {ErrorCodes::IncompatibleServerVersion, str::stream() << "Cannot add " << connectionString.toString() @@ -629,7 +627,7 @@ StatusWith<std::string> ShardingCatalogManager::addShard( targeter.get(), "admin", BSON(FeatureCompatibilityVersion::kCommandName << FeatureCompatibilityVersion::toString( - serverGlobalParams.featureCompatibility.version.load()))); + serverGlobalParams.featureCompatibility.getVersion()))); if (!versionResponse.isOK()) { return versionResponse.getStatus(); } diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp index 54e537e2e83..0af7f2a2288 100644 --- a/src/mongo/s/server.cpp +++ b/src/mongo/s/server.cpp @@ -485,7 +485,7 @@ MONGO_INITIALIZER_GENERAL(ForkServer, ("EndStartupOptionHandling"), ("default")) // usages of new features if their featureCompatibilityVersion is lower. MONGO_INITIALIZER_WITH_PREREQUISITES(SetFeatureCompatibilityVersion36, ("EndStartupOptionStorage")) (InitializerContext* context) { - mongo::serverGlobalParams.featureCompatibility.version.store( + mongo::serverGlobalParams.featureCompatibility.setVersion( ServerGlobalParams::FeatureCompatibility::Version::k36); return Status::OK(); } diff --git a/src/mongo/shell/dbshell.cpp b/src/mongo/shell/dbshell.cpp index 34cdbed3d9e..851f30a479e 100644 --- a/src/mongo/shell/dbshell.cpp +++ b/src/mongo/shell/dbshell.cpp @@ -95,7 +95,7 @@ const auto kDefaultMongoURL = "mongodb://127.0.0.1:27017"_sd; // usages of new features if its featureCompatibilityVersion is lower. MONGO_INITIALIZER_WITH_PREREQUISITES(SetFeatureCompatibilityVersion36, ("EndStartupOptionSetup")) (InitializerContext* context) { - mongo::serverGlobalParams.featureCompatibility.version.store( + mongo::serverGlobalParams.featureCompatibility.setVersion( ServerGlobalParams::FeatureCompatibility::Version::k36); return Status::OK(); } |