75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
/*
|
|
* Test that a split config is removed after a decision is reached.
|
|
*
|
|
* @tags: [requires_fcv_62, serverless]
|
|
*/
|
|
|
|
import {assertMigrationState, ShardSplitTest} from "jstests/serverless/libs/shard_split_test.js";
|
|
|
|
load("jstests/libs/fail_point_util.js");
|
|
|
|
function assertSplitConfigExists(donorPrimary, recipientSetName) {
|
|
jsTestLog("Asserting a split config has been applied");
|
|
const config = assert.commandWorked(donorPrimary.adminCommand({replSetGetConfig: 1})).config;
|
|
assert(config, "There must be a config document");
|
|
assert.eq(config["members"].length, 3);
|
|
assert(config["recipientConfig"]);
|
|
assert.eq(config["recipientConfig"]["_id"], recipientSetName);
|
|
assert.eq(config["recipientConfig"]["members"].length, 3);
|
|
}
|
|
|
|
function assertSplitConfigDoesNotExist(donorPrimary) {
|
|
jsTestLog("Asserting a split config does not exist");
|
|
const config = assert.commandWorked(donorPrimary.adminCommand({replSetGetConfig: 1})).config;
|
|
assert(config, "There must be a config document");
|
|
assert.eq(null, config["recipientConfig"]);
|
|
}
|
|
|
|
function splitConfigRemovedAfterDecision(simulateErrorToAbortOperation) {
|
|
"use strict";
|
|
|
|
simulateErrorToAbortOperation = simulateErrorToAbortOperation || false;
|
|
|
|
// Skip db hash check because secondary is left with a different config.
|
|
TestData.skipCheckDBHashes = true;
|
|
const tenantIds = [ObjectId(), ObjectId()];
|
|
const test = new ShardSplitTest({quickGarbageCollection: true});
|
|
test.addRecipientNodes();
|
|
|
|
const donorPrimary = test.donor.getPrimary();
|
|
const beforeConfigRemovalFp =
|
|
configureFailPoint(donorPrimary, "pauseShardSplitBeforeSplitConfigRemoval");
|
|
const afterDecisionFp = configureFailPoint(donorPrimary, "pauseShardSplitAfterDecision");
|
|
if (simulateErrorToAbortOperation) {
|
|
configureFailPoint(donorPrimary, "abortShardSplitBeforeLeavingBlockingState");
|
|
}
|
|
|
|
const operation = test.createSplitOperation(tenantIds);
|
|
if (simulateErrorToAbortOperation) {
|
|
assert.commandFailed(operation.commit());
|
|
} else {
|
|
assert.commandWorked(operation.commit());
|
|
}
|
|
|
|
beforeConfigRemovalFp.wait();
|
|
if (simulateErrorToAbortOperation) {
|
|
assertMigrationState(donorPrimary, operation.migrationId, "aborted");
|
|
} else {
|
|
assertMigrationState(donorPrimary, operation.migrationId, "committed");
|
|
}
|
|
|
|
assertSplitConfigExists(donorPrimary, test.recipientSetName);
|
|
beforeConfigRemovalFp.off();
|
|
|
|
afterDecisionFp.wait();
|
|
assertSplitConfigDoesNotExist(donorPrimary);
|
|
afterDecisionFp.off();
|
|
|
|
operation.forget();
|
|
test.waitForGarbageCollection(operation.migrationId, tenantIds);
|
|
test.stop();
|
|
}
|
|
|
|
splitConfigRemovedAfterDecision(false);
|
|
splitConfigRemovedAfterDecision(true);
|