1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/**
* Tests dropping the donor state doc collections after the shard split has aborted.
*
* @tags: [
* incompatible_with_eft,
* incompatible_with_macos,
* incompatible_with_windows_tls,
* requires_majority_read_concern,
* requires_persistence,
* serverless,
* requires_fcv_52,
* featureFlagShardSplit
* ]
*/
(function() {
"use strict";
load("jstests/libs/fail_point_util.js");
load("jstests/libs/uuid_util.js");
load("jstests/serverless/libs/basic_serverless_test.js");
const recipientTagName = "recipientNode";
const recipientSetName = "recipient";
TestData.skipCheckDBHashes = true;
function testDroppingStateDocCollections(
test,
fpName,
{dropDonorsCollection = false, retryWithDifferentMigrationId = false, expectedAbortReason}) {
jsTest.log(`Testing with failpoint: ${fpName} dropDonorsCollection: ${
dropDonorsCollection}, retryWithDifferentMigrationId: ${retryWithDifferentMigrationId}`);
test.addRecipientNodes();
let donorPrimary = test.donor.getPrimary();
const tenantIds = ["tenant1", "tenant2"];
const operation = test.createSplitOperation(tenantIds);
let migrationId = operation.migrationId;
let fp = configureFailPoint(donorPrimary.getDB("admin"), fpName);
let commitShardSplitThread = operation.commitAsync();
fp.wait();
if (dropDonorsCollection) {
assert(donorPrimary.getCollection(BasicServerlessTest.kConfigSplitDonorsNS).drop());
let donorDoc = findSplitOperation(donorPrimary, migrationId);
assert.eq(donorDoc, null);
const currOpDonor = assert.commandWorked(
donorPrimary.adminCommand({currentOp: true, desc: "shard split operation"}));
assert.eq(currOpDonor.inprog.length, 0);
// Trigger stepup to allow the donor service to rebuild.
assert.commandWorked(donorPrimary.adminCommand({replSetStepDown: 30, force: true}));
}
fp.off();
commitShardSplitThread.join();
if (expectedAbortReason) {
const data = commitShardSplitThread.returnData();
assert.commandFailedWithCode(data, expectedAbortReason);
assert.eq(data.code, expectedAbortReason);
}
test.removeRecipientNodesFromDonor();
if (!dropDonorsCollection) {
operation.forget();
test.waitForGarbageCollection(migrationId, tenantIds);
}
test.removeAndStopRecipientNodes();
test.reconfigDonorSetAfterSplit();
test.addRecipientNodes();
const operation2 =
retryWithDifferentMigrationId ? test.createSplitOperation(tenantIds) : operation;
migrationId = operation2.migrationId;
const runMigrationRes = operation2.commit();
assert.commandWorked(runMigrationRes);
assert.eq(runMigrationRes.state, "committed");
operation2.forget();
test.cleanupSuccesfulCommitted(migrationId, tenantIds);
}
jsTest.log("Test dropping donor and recipient state doc collections during a shard split.");
const test = new BasicServerlessTest({
recipientTagName,
recipientSetName,
quickGarbageCollection: true,
initiateWithShortElectionTimeout: true
});
const fpName = "abortShardSplitBeforeLeavingBlockingState";
testDroppingStateDocCollections(test, fpName, {dropDonorsCollection: true});
testDroppingStateDocCollections(
test, fpName, {dropDonorsCollection: true, retryWithDifferentMigrationId: true});
testDroppingStateDocCollections(test, fpName, {dropDonorsCollection: false});
testDroppingStateDocCollections(test, fpName, {
dropDonorsCollection: false,
expectedAbortReason: (fpName == "abortShardSplitBeforeLeavingBlockingState")
? ErrorCodes.TenantMigrationAborted
: null
});
test.stop();
})();
|