diff options
| author | Randolph Tan <randolph@10gen.com> | 2023-07-21 14:59:45 +0000 |
|---|---|---|
| committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-07-26 14:12:11 +0000 |
| commit | 15dadd75e65169698fb1751c29096cd5322dbcc8 (patch) | |
| tree | d739552a9c168c46fb85af41c164f25e44893ddb | |
| parent | 0370db4cce82297b0b442d370bb7c87c4c8a64ac (diff) | |
SERVER-79183 Change invariant on FCV not being initialized to assertion errorr7.0.0-rc9
| -rw-r--r-- | src/mongo/db/s/shard_server_catalog_cache_loader.cpp | 16 | ||||
| -rw-r--r-- | src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp | 39 | ||||
| -rw-r--r-- | src/mongo/db/server_options.h | 7 |
3 files changed, 59 insertions, 3 deletions
diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp index 28492ece9cc..875fbc30b1a 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp @@ -354,9 +354,19 @@ void forcePrimaryDatabaseRefreshAndWaitForReplication(OperationContext* opCtx, S // TODO: SERVER-74105 remove bool shouldSkipStoringLocally() { - // Note: cannot use isExclusivelyConfigSvrRole as it ignores fcv. - return serverGlobalParams.clusterRole.has(ClusterRole::ConfigServer) && - !gFeatureFlagCatalogShard.isEnabled(serverGlobalParams.featureCompatibility); + // Note: cannot use isExclusivelyConfigSvrRole as it ignores the feature flag. + if (!serverGlobalParams.clusterRole.has(ClusterRole::ConfigServer)) { + return false; + } + + const auto fcv = serverGlobalParams.featureCompatibility.getVersionMustVerifyInitialized(); + + // Note: it is possible for fcv to become uninitialized temporarily during initial sync. + uassert(7918300, + "feature compatibility version is not initialized", + fcv != multiversion::FeatureCompatibilityVersion::kUnsetDefaultLastLTSBehavior); + + return !gFeatureFlagCatalogShard.isEnabledOnVersion(fcv); } } // namespace diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp b/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp index a4cc4fce1b8..dfa3ff36015 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp @@ -645,5 +645,44 @@ TEST_F(ShardServerCatalogCacheLoaderTest, setFCVForGetDatabase) { ASSERT_FALSE(cachedDoc.isEmpty()); } +TEST_F(ShardServerCatalogCacheLoaderTest, getChunksWithUninitializedFCV) { + const auto kOriginalRole = serverGlobalParams.clusterRole; + const auto kOriginalFCV = serverGlobalParams.featureCompatibility.getVersion(); + + ON_BLOCK_EXIT([&] { + serverGlobalParams.clusterRole = kOriginalRole; + serverGlobalParams.mutableFeatureCompatibility.setVersion(kOriginalFCV); + }); + + serverGlobalParams.clusterRole = ClusterRole::ConfigServer; + serverGlobalParams.mutableFeatureCompatibility.reset(); + + const ChunkVersion collectionPlacementVersion({OID::gen(), Timestamp(1, 1)}, {1, 2}); + const auto collectionType = makeCollectionType(collectionPlacementVersion); + + auto future = _shardLoader->getChunksSince(kNss, ChunkVersion::UNSHARDED()); + ASSERT_THROWS_CODE(future.get(), DBException, 7918300); +} + +TEST_F(ShardServerCatalogCacheLoaderTest, getChunksWithUninitializedFCVWhileSecondary) { + const auto kOriginalRole = serverGlobalParams.clusterRole; + const auto kOriginalFCV = serverGlobalParams.featureCompatibility.getVersion(); + + ON_BLOCK_EXIT([&] { + serverGlobalParams.clusterRole = kOriginalRole; + serverGlobalParams.mutableFeatureCompatibility.setVersion(kOriginalFCV); + }); + + serverGlobalParams.clusterRole = ClusterRole::ConfigServer; + serverGlobalParams.mutableFeatureCompatibility.reset(); + + const ChunkVersion collectionPlacementVersion({OID::gen(), Timestamp(1, 1)}, {1, 2}); + const auto collectionType = makeCollectionType(collectionPlacementVersion); + + _shardLoader->onStepDown(); + auto future = _shardLoader->getChunksSince(kNss, ChunkVersion::UNSHARDED()); + ASSERT_THROWS_CODE(future.get(), DBException, 7918300); +} + } // namespace } // namespace mongo diff --git a/src/mongo/db/server_options.h b/src/mongo/db/server_options.h index 36ce77d82e7..ac3f0dd385e 100644 --- a/src/mongo/db/server_options.h +++ b/src/mongo/db/server_options.h @@ -148,6 +148,13 @@ struct ServerGlobalParams { return _version.load(); } + /** + * Returns the current version but caller is responsible for verifying if it's initialized. + */ + FCV getVersionMustVerifyInitialized() const { + return _version.load(); + } + bool isLessThanOrEqualTo(FCV version, FCV* versionReturn = nullptr) const { auto currentVersion = getVersion(); if (versionReturn != nullptr) { |
