diff options
Diffstat (limited to 'jstests/serverless/serverless_reject_multiple_ops_migration_donor_retry.js')
-rw-r--r-- | jstests/serverless/serverless_reject_multiple_ops_migration_donor_retry.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/jstests/serverless/serverless_reject_multiple_ops_migration_donor_retry.js b/jstests/serverless/serverless_reject_multiple_ops_migration_donor_retry.js new file mode 100644 index 00000000000..1ea49a99f06 --- /dev/null +++ b/jstests/serverless/serverless_reject_multiple_ops_migration_donor_retry.js @@ -0,0 +1,86 @@ +/** + * @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 retryMigrationAfterSplitCompletes(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 firstTenantMigrationId = UUID(); + const secondTenantMigrationId = UUID(); + + sharedOptions = {}; + sharedOptions["setParameter"] = {shardSplitGarbageCollectionDelayMS: 0, ttlMonitorSleepSecs: 1}; + + const test = new TenantMigrationTest({quickGarbageCollection: true, sharedOptions}); + + const splitRst = test.getDonorRst(); + + let splitRecipientNodes = addRecipientNodes(splitRst, recipientTagName); + + let fp = configureFailPoint(splitRst.getPrimary(), "pauseShardSplitBeforeBlockingState"); + + const commitThread = + commitSplitAsync(splitRst, tenantIds, recipientTagName, recipientSetName, splitMigrationId); + fp.wait(); + + const firstMigrationOpts = { + migrationIdString: extractUUIDFromObject(firstTenantMigrationId), + protocol, + }; + if (protocol != "shard merge") { + firstMigrationOpts["tenantId"] = tenantIds[0]; + } + jsTestLog("Starting tenant migration"); + assert.commandFailedWithCode(test.startMigration(firstMigrationOpts), + ErrorCodes.ConflictingServerlessOperation); + + 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("cannotStartMigrationWhileShardSplitIsInProgress test completed"); +} + +retryMigrationAfterSplitCompletes("multitenant migrations"); +retryMigrationAfterSplitCompletes("shard merge"); |