summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandolph Tan <randolph@10gen.com>2023-07-21 14:59:45 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-07-26 14:12:11 +0000
commit15dadd75e65169698fb1751c29096cd5322dbcc8 (patch)
treed739552a9c168c46fb85af41c164f25e44893ddb
parent0370db4cce82297b0b442d370bb7c87c4c8a64ac (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.cpp16
-rw-r--r--src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp39
-rw-r--r--src/mongo/db/server_options.h7
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) {