summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRishab Joshi <rishab.joshi@mongodb.com>2022-09-26 11:22:02 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-26 11:53:31 +0000
commitce002ed993b51bdcd1b02fdae0d2ae9c71a932de (patch)
tree7775fce611cb74437e3b0bedf6f462e5ba3c2765
parent5267456fa02be5a86f509bac0efea6696b7e5010 (diff)
downloadmongo-ce002ed993b51bdcd1b02fdae0d2ae9c71a932de.tar.gz
SERVER-66717 Guard change collection code with the serverless flag.
-rw-r--r--buildscripts/resmokeconfig/fully_disabled_feature_flags.yml4
-rw-r--r--buildscripts/resmokeconfig/suites/change_streams_multitenant_passthrough.yml2
-rw-r--r--jstests/auth/change_stream_change_collection_role_auth.js10
-rw-r--r--jstests/libs/override_methods/override_fixtures_changestream_multitenancy.js10
-rw-r--r--jstests/serverless/change_stream_state_commands.js6
-rw-r--r--jstests/serverless/initial_sync_change_collection.js5
-rw-r--r--jstests/serverless/libs/change_collection_util.js7
-rw-r--r--jstests/serverless/write_to_change_collection_in_startup_recovery.js5
-rw-r--r--src/mongo/db/SConscript1
-rw-r--r--src/mongo/db/change_collection_expired_documents_remover.cpp19
-rw-r--r--src/mongo/db/change_stream_serverless_helpers.cpp27
-rw-r--r--src/mongo/db/change_stream_serverless_helpers.h6
-rw-r--r--src/mongo/db/mongod_main.cpp14
13 files changed, 71 insertions, 45 deletions
diff --git a/buildscripts/resmokeconfig/fully_disabled_feature_flags.yml b/buildscripts/resmokeconfig/fully_disabled_feature_flags.yml
index 3c43a042097..678b3c522c3 100644
--- a/buildscripts/resmokeconfig/fully_disabled_feature_flags.yml
+++ b/buildscripts/resmokeconfig/fully_disabled_feature_flags.yml
@@ -12,9 +12,5 @@
# released create the transactions collection index and is only meant to be enabled adhoc, so only
# its targeted tests should enable it.
- featureFlagAlwaysCreateConfigTransactionsPartialIndexOnStepUp
-# Disable 'featureFlagServerlessChangeStreams' until the change collection becomes stable.
-# TODO SERVER-67267 remove the flag.
-- featureFlagServerlessChangeStreams
-
# Disable 'featureFlagRangeDeleterService' as long as the service is not performing actual range deletions
- featureFlagRangeDeleterService
diff --git a/buildscripts/resmokeconfig/suites/change_streams_multitenant_passthrough.yml b/buildscripts/resmokeconfig/suites/change_streams_multitenant_passthrough.yml
index 16a0397b526..47e9179a50b 100644
--- a/buildscripts/resmokeconfig/suites/change_streams_multitenant_passthrough.yml
+++ b/buildscripts/resmokeconfig/suites/change_streams_multitenant_passthrough.yml
@@ -50,8 +50,10 @@ executor:
- class: EnableChangeStream
fixture:
class: ReplicaSetFixture
+ replset_name: "ChangeStreamMultitenantReplSet"
mongod_options:
bind_ip_all: ''
+ serverless: true
set_parameters:
enableTestCommands: 1
featureFlagServerlessChangeStreams: true
diff --git a/jstests/auth/change_stream_change_collection_role_auth.js b/jstests/auth/change_stream_change_collection_role_auth.js
index 60b86a8d823..384bdbb5b66 100644
--- a/jstests/auth/change_stream_change_collection_role_auth.js
+++ b/jstests/auth/change_stream_change_collection_role_auth.js
@@ -157,10 +157,14 @@ function removeChangeCollectionDoc(authDb) {
// Start a replica-set test with one-node and authentication enabled. Connect to the primary node
// and create users.
-const replSetTest =
- new ReplSetTest({name: "shard", nodes: 1, useHostName: true, waitForKeys: false});
+const replSetTest = new ReplSetTest({
+ name: "shard",
+ nodes: 1,
+ useHostName: true,
+ waitForKeys: false,
+ serverless: true,
+});
-// TODO SERVER-67267: Add 'serverless' flags.
replSetTest.startSet({
keyFile: keyFile,
setParameter: {
diff --git a/jstests/libs/override_methods/override_fixtures_changestream_multitenancy.js b/jstests/libs/override_methods/override_fixtures_changestream_multitenancy.js
index c9b713bda0c..0ad1b36fc67 100644
--- a/jstests/libs/override_methods/override_fixtures_changestream_multitenancy.js
+++ b/jstests/libs/override_methods/override_fixtures_changestream_multitenancy.js
@@ -7,9 +7,15 @@
const originalReplSet = ReplSetTest;
ReplSetTest = function(opts) {
+ // Setup the 'serverless' environment if the 'opts' is not a connection string, ie. the
+ // replica-set does not already exist and the replica-set is not part of the sharded cluster,
+ // ie. 'setParametersMongos' property does not exist.
+ const newOpts = typeof opts !== "string" && !TestData.hasOwnProperty("setParametersMongos")
+ ? Object.assign({name: "OverridenServerlessChangeStreamReplSet", serverless: true}, opts)
+ : opts;
+
// Call the constructor with the original 'ReplSetTest' to populate 'this' with required fields.
- // TODO SERVER-67267 add {serverless:true} to the 'opts'.
- originalReplSet.apply(this, [opts]);
+ originalReplSet.apply(this, [newOpts]);
// Make a copy of the original 'startSetAsync' function and then override it to include the
// required parameters.
diff --git a/jstests/serverless/change_stream_state_commands.js b/jstests/serverless/change_stream_state_commands.js
index 373bad342b5..f596953a39c 100644
--- a/jstests/serverless/change_stream_state_commands.js
+++ b/jstests/serverless/change_stream_state_commands.js
@@ -12,10 +12,10 @@ load('jstests/libs/parallel_shell_helpers.js'); // For funWithArgs.
const replSetTest = new ReplSetTest({nodes: 2});
-// TODO SERVER-67267 Add 'serverless' flag.
-// TODO SERVER-68947 Add 'featureFlagRequireTenantID' flag.
-// TODO SERVER-69115 Remove '__TEMPORARILY_DISABLED__'
+// TODO SERVER-69115 Remove '__TEMPORARILY_DISABLED__ and use
+// 'ChangeStreamMultitenantReplicaSetTest'.
replSetTest.startSet({
+ serverless: true,
setParameter: {
featureFlagServerlessChangeStreams: true,
multitenancySupport: true,
diff --git a/jstests/serverless/initial_sync_change_collection.js b/jstests/serverless/initial_sync_change_collection.js
index 3d111307dd9..0fc4cba31d8 100644
--- a/jstests/serverless/initial_sync_change_collection.js
+++ b/jstests/serverless/initial_sync_change_collection.js
@@ -14,9 +14,8 @@ load("jstests/serverless/libs/change_collection_util.js"); // For verifyChangeC
const replSetTest = new ReplSetTest({nodes: 1});
-// TODO SERVER-67267 Add 'serverless' flag.
-// TODO SERVER-69115 Add 'featureFlagRequireTenantID' flag and remove '__TEMPORARILY_DISABLED__'
-// tag and replace 'ReplSetTest' with 'ChangeStreamMultitenantReplicaSetTest'.
+// TODO SERVER-69115 Remove '__TEMPORARILY_DISABLED__ tag and replace 'ReplSetTest' with
+// 'ChangeStreamMultitenantReplicaSetTest'.
replSetTest.startSet({
setParameter: {
featureFlagServerlessChangeStreams: true,
diff --git a/jstests/serverless/libs/change_collection_util.js b/jstests/serverless/libs/change_collection_util.js
index f9b8a9c6846..ae3370efb2a 100644
--- a/jstests/serverless/libs/change_collection_util.js
+++ b/jstests/serverless/libs/change_collection_util.js
@@ -66,11 +66,12 @@ function verifyChangeCollectionEntries(
// This class also provides helpers that are commonly used when working with change collections.
class ChangeStreamMultitenantReplicaSetTest extends ReplSetTest {
constructor(config) {
- // Instantiate the 'ReplSetTest'.
- super(config);
+ // Instantiate the 'ReplSetTest' with 'serverless' as an option.
+ const newConfig = Object.assign(
+ {name: "ChangeStreamMultitenantReplicaSetTest", serverless: true}, config);
+ super(newConfig);
// Start and initialize the replica set.
- // TODO SERVER-67267 Add 'serverless' flag.
const setParameter = Object.assign({}, config.setParameter || {}, {
featureFlagServerlessChangeStreams: true,
multitenancySupport: true,
diff --git a/jstests/serverless/write_to_change_collection_in_startup_recovery.js b/jstests/serverless/write_to_change_collection_in_startup_recovery.js
index bbf7cd0a259..147de958225 100644
--- a/jstests/serverless/write_to_change_collection_in_startup_recovery.js
+++ b/jstests/serverless/write_to_change_collection_in_startup_recovery.js
@@ -13,9 +13,8 @@ load("jstests/serverless/libs/change_collection_util.js"); // For verifyChangeC
const replSetTest = new ReplSetTest({nodes: 1});
-// TODO SERVER-67267 Add 'serverless' flag.
-// TODO SERVER-69115 Add 'featureFlagRequireTenantID' flag and remove '__TEMPORARILY_DISABLED__'
-// tag and replace 'ReplSetTest' with 'ChangeStreamMultitenantReplicaSetTest'.
+// TODO SERVER-69115 Remove '__TEMPORARILY_DISABLED__ tag and replace 'ReplSetTest' with
+// 'ChangeStreamMultitenantReplicaSetTest'.
replSetTest.startSet({
setParameter: {
featureFlagServerlessChangeStreams: true,
diff --git a/src/mongo/db/SConscript b/src/mongo/db/SConscript
index be4f755fac0..f5ee9f3988f 100644
--- a/src/mongo/db/SConscript
+++ b/src/mongo/db/SConscript
@@ -555,6 +555,7 @@ env.Library(
LIBDEPS_PRIVATE=[
'$BUILD_DIR/mongo/db/catalog/collection',
'$BUILD_DIR/mongo/db/catalog/collection_catalog',
+ '$BUILD_DIR/mongo/db/global_settings',
'$BUILD_DIR/mongo/db/query/query_knobs',
'$BUILD_DIR/mongo/db/server_base',
'$BUILD_DIR/mongo/db/server_options',
diff --git a/src/mongo/db/change_collection_expired_documents_remover.cpp b/src/mongo/db/change_collection_expired_documents_remover.cpp
index d84fb21b672..ce77d924b99 100644
--- a/src/mongo/db/change_collection_expired_documents_remover.cpp
+++ b/src/mongo/db/change_collection_expired_documents_remover.cpp
@@ -78,13 +78,6 @@ boost::optional<int64_t> getExpireAfterSeconds(const TenantId& tenantId) {
}
void removeExpiredDocuments(Client* client) {
- // TODO SERVER-66717 Remove this logic from this method. Due to the delay in the feature flag
- // activation it was placed here. The remover job should ultimately be initialized at the mongod
- // startup when launched in serverless mode.
- if (!change_stream_serverless_helpers::isChangeCollectionsModeActive()) {
- return;
- }
-
hangBeforeRemovingExpiredChanges.pauseWhileSet();
try {
@@ -211,12 +204,16 @@ private:
} // namespace
void startChangeCollectionExpiredDocumentsRemover(ServiceContext* serviceContext) {
- LOGV2(6663507, "Starting the ChangeCollectionExpiredChangeRemover");
- ChangeCollectionExpiredDocumentsRemover::start(serviceContext);
+ if (change_stream_serverless_helpers::canInitializeServices()) {
+ LOGV2(6663507, "Starting the ChangeCollectionExpiredChangeRemover");
+ ChangeCollectionExpiredDocumentsRemover::start(serviceContext);
+ }
}
void shutdownChangeCollectionExpiredDocumentsRemover(ServiceContext* serviceContext) {
- LOGV2(6663508, "Shutting down the ChangeCollectionExpiredChangeRemover");
- ChangeCollectionExpiredDocumentsRemover::shutdown(serviceContext);
+ if (change_stream_serverless_helpers::canInitializeServices()) {
+ LOGV2(6663508, "Shutting down the ChangeCollectionExpiredChangeRemover");
+ ChangeCollectionExpiredDocumentsRemover::shutdown(serviceContext);
+ }
}
} // namespace mongo
diff --git a/src/mongo/db/change_stream_serverless_helpers.cpp b/src/mongo/db/change_stream_serverless_helpers.cpp
index 0577894e397..b5578f35246 100644
--- a/src/mongo/db/change_stream_serverless_helpers.cpp
+++ b/src/mongo/db/change_stream_serverless_helpers.cpp
@@ -33,6 +33,8 @@
#include "mongo/db/catalog_raii.h"
#include "mongo/db/dbdirectclient.h"
+#include "mongo/db/global_settings.h"
+#include "mongo/db/multitenancy_gen.h"
#include "mongo/db/namespace_string.h"
#include "mongo/db/server_feature_flags_gen.h"
#include "mongo/db/server_options.h"
@@ -41,13 +43,10 @@ namespace mongo {
namespace change_stream_serverless_helpers {
bool isChangeCollectionsModeActive() {
- // A change collection must not be enabled on the config server.
- if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) {
- return false;
- }
-
- // TODO SERVER-67267 guard with 'multitenancySupport' and 'isServerless' flag.
- return serverGlobalParams.featureCompatibility.isVersionInitialized() &&
+ // A change collection mode is declared as active if the required services can be initialized,
+ // the feature flag is enabled and the FCV version is already initialized.
+ return canInitializeServices() &&
+ serverGlobalParams.featureCompatibility.isVersionInitialized() &&
feature_flags::gFeatureFlagServerlessChangeStreams.isEnabled(
serverGlobalParams.featureCompatibility);
}
@@ -65,6 +64,20 @@ bool isChangeStreamEnabled(OperationContext* opCtx, const TenantId& tenantId) {
opCtx, NamespaceString::makePreImageCollectionNSS(boost::none)));
}
+bool canInitializeServices() {
+ // A change collection must not be enabled on the config server.
+ if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) {
+ return false;
+ }
+
+ // A change stream services are enabled only in the multitenant serverless settings. For the
+ // sharded cluster, 'internalChangeStreamUseTenantIdForTesting' maybe provided for the testing
+ // purposes until the support is available.
+ const auto isMultiTenantServerless =
+ getGlobalReplSettings().isServerless() && gMultitenancySupport;
+ return isMultiTenantServerless || internalChangeStreamUseTenantIdForTesting.load();
+}
+
const TenantId& getTenantIdForTesting() {
static const TenantId kTestTenantId(
OID("00000000" /* timestamp */
diff --git a/src/mongo/db/change_stream_serverless_helpers.h b/src/mongo/db/change_stream_serverless_helpers.h
index bdeb04f3ff7..f3f63cc97f8 100644
--- a/src/mongo/db/change_stream_serverless_helpers.h
+++ b/src/mongo/db/change_stream_serverless_helpers.h
@@ -51,6 +51,12 @@ bool isChangeCollectionsModeActive();
bool isChangeStreamEnabled(OperationContext* opCtx, const TenantId& tenantId);
/**
+ * Returns true if services related to the serverless change stream can be initialized.
+ * TODO SERVER-69960 Remove this function and use 'isChangeCollectionsModeActive' instead.
+ */
+bool canInitializeServices();
+
+/**
* Returns an internal tenant id that will be used for testing purposes. This tenant id will not
* conflict with any other tenant id.
*/
diff --git a/src/mongo/db/mongod_main.cpp b/src/mongo/db/mongod_main.cpp
index b344f20daf4..c8048e567f2 100644
--- a/src/mongo/db/mongod_main.cpp
+++ b/src/mongo/db/mongod_main.cpp
@@ -59,6 +59,7 @@
#include "mongo/db/change_collection_expired_documents_remover.h"
#include "mongo/db/change_stream_change_collection_manager.h"
#include "mongo/db/change_stream_options_manager.h"
+#include "mongo/db/change_stream_serverless_helpers.h"
#include "mongo/db/client.h"
#include "mongo/db/client_metadata_propagation_egress_hook.h"
#include "mongo/db/clientcursor.h"
@@ -349,8 +350,10 @@ void registerPrimaryOnlyServices(ServiceContext* serviceContext) {
}
}
- // TODO SERVER-66717 create 'SetChangeStreamStateCoordinatorService' only in the serverless.
- services.push_back(std::make_unique<SetChangeStreamStateCoordinatorService>(serviceContext));
+ if (change_stream_serverless_helpers::canInitializeServices()) {
+ services.push_back(
+ std::make_unique<SetChangeStreamStateCoordinatorService>(serviceContext));
+ }
for (auto& service : services) {
registry->registerService(std::move(service));
@@ -790,8 +793,6 @@ ExitCode _initAndListen(ServiceContext* serviceContext, int listenPort) {
repl::ReplicationCoordinator::modeNone;
if (!isStandalone) {
startChangeStreamExpiredPreImagesRemover(serviceContext);
- // TODO SERVER-66717 Start 'startChangeCollectionExpiredDocumentsRemover' only in the
- // serverless.
startChangeCollectionExpiredDocumentsRemover(serviceContext);
}
@@ -1576,8 +1577,9 @@ int mongod_main(int argc, char* argv[]) {
ReadWriteConcernDefaults::create(service, readWriteConcernDefaultsCacheLookupMongoD);
ChangeStreamOptionsManager::create(service);
- // TODO SERVER-66717 Create 'ChangeStreamChangeCollectionManager' only in the serverless.
- ChangeStreamChangeCollectionManager::create(service);
+ if (change_stream_serverless_helpers::canInitializeServices()) {
+ ChangeStreamChangeCollectionManager::create(service);
+ }
#if defined(_WIN32)
if (ntservice::shouldStartService()) {