diff options
Diffstat (limited to 'jstests/serverless/serverless_reject_multiple_ops_migration_recipient_retry.js')
-rw-r--r-- | jstests/serverless/serverless_reject_multiple_ops_migration_recipient_retry.js | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/jstests/serverless/serverless_reject_multiple_ops_migration_recipient_retry.js b/jstests/serverless/serverless_reject_multiple_ops_migration_recipient_retry.js new file mode 100644 index 00000000000..f3bd83a5243 --- /dev/null +++ b/jstests/serverless/serverless_reject_multiple_ops_migration_recipient_retry.js @@ -0,0 +1,90 @@ +/** + * @tags: [ + * serverless, + * requires_fcv_52, + * featureFlagShardSplit, + * featureFlagShardMerge + * ] + */ + +load("jstests/replsets/libs/tenant_migration_test.js"); +load("jstests/replsets/libs/tenant_migration_util.js"); +load("jstests/serverless/libs/basic_serverless_test.js"); +load("jstests/serverless/libs/serverless_reject_multiple_ops_utils.js"); +load("jstests/libs/uuid_util.js"); + +function cannotStartMigrationWhileShardSplitIsInProgressOnRecipient(protocol) { + // Test that we cannot start a migration while a shard split is in progress. + const recipientTagName = "recipientTag"; + const recipientSetName = "recipient"; + const tenantIds = ["tenant1", "tenant2"]; + const splitMigrationId = UUID(); + const tenantMigrationId = UUID(); + const secondTenantMigrationId = UUID(); + + sharedOptions = {}; + sharedOptions["setParameter"] = {shardSplitGarbageCollectionDelayMS: 0, ttlMonitorSleepSecs: 1}; + + const test = new TenantMigrationTest({quickGarbageCollection: true, sharedOptions}); + + const splitRst = test.getRecipientRst(); + + let splitRecipientNodes = addRecipientNodes(splitRst, recipientTagName); + + let fp = configureFailPoint(splitRst.getPrimary(), "pauseShardSplitBeforeBlockingState"); + + const commitThread = + commitSplitAsync(splitRst, tenantIds, recipientTagName, recipientSetName, splitMigrationId); + fp.wait(); + + const migrationOpts = { + migrationIdString: extractUUIDFromObject(tenantMigrationId), + protocol, + }; + if (protocol != "shard merge") { + migrationOpts["tenantId"] = tenantIds[0]; + } + jsTestLog("Starting tenant migration"); + assert.commandWorked(test.startMigration(migrationOpts)); + + const result = assert.commandWorked(test.waitForMigrationToComplete(migrationOpts)); + assert.eq(result.state, "aborted"); + assert.eq(result.abortReason.code, ErrorCodes.ConflictingServerlessOperation); + assert.commandWorked(test.forgetMigration(migrationOpts.migrationIdString)); + + fp.off(); + + assert.commandWorked(commitThread.returnData()); + + splitRst.nodes = splitRst.nodes.filter(node => !splitRecipientNodes.includes(node)); + splitRst.ports = + splitRst.ports.filter(port => !splitRecipientNodes.some(node => node.port === port)); + + assert.commandWorked( + splitRst.getPrimary().adminCommand({forgetShardSplit: 1, migrationId: splitMigrationId})); + + splitRecipientNodes.forEach(node => { + MongoRunner.stopMongod(node); + }); + + const secondMigrationOpts = { + migrationIdString: extractUUIDFromObject(secondTenantMigrationId), + protocol, + }; + if (protocol != "shard merge") { + secondMigrationOpts["tenantId"] = tenantIds[0]; + } + jsTestLog("Starting tenant migration"); + assert.commandWorked(test.startMigration(secondMigrationOpts)); + TenantMigrationTest.assertCommitted( + waitForMergeToComplete(secondMigrationOpts, secondTenantMigrationId, test)); + assert.commandWorked(test.forgetMigration(secondMigrationOpts.migrationIdString)); + + waitForGarbageCollectionForSplit(splitRst.nodes, splitMigrationId, tenantIds); + + test.stop(); + jsTestLog("cannotStartMigrationWhileShardSplitIsInProgressOnRecipient test completed"); +} + +cannotStartMigrationWhileShardSplitIsInProgressOnRecipient("multitenant migrations"); +cannotStartMigrationWhileShardSplitIsInProgressOnRecipient("shard merge"); |