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
|
/**
* Tests that tenant migration donor can peacefully shut down when there are reads being blocked due
* to an in-progress migration.
*
* @tags: [
* incompatible_with_eft,
* incompatible_with_macos,
* incompatible_with_windows_tls,
* requires_majority_read_concern,
* requires_persistence,
* ]
*/
(function() {
"use strict";
load("jstests/libs/parallelTester.js");
load("jstests/libs/fail_point_util.js");
load("jstests/libs/uuid_util.js");
load("jstests/replsets/libs/tenant_migration_test.js");
load("jstests/replsets/libs/tenant_migration_util.js");
const tenantMigrationTest = new TenantMigrationTest({name: jsTestName()});
const kTenantId = "testTenantId";
const kDbName = kTenantId + "_testDb";
const kCollName = "testColl";
const donorRst = tenantMigrationTest.getDonorRst();
const donorPrimary = tenantMigrationTest.getDonorPrimary();
const testDb = donorPrimary.getDB(kDbName);
assert.commandWorked(testDb.runCommand({insert: kCollName, documents: [{_id: 0}]}));
const migrationId = UUID();
const migrationOpts = {
migrationIdString: extractUUIDFromObject(migrationId),
tenantId: kTenantId,
};
let fp = configureFailPoint(donorPrimary, "pauseTenantMigrationBeforeLeavingBlockingState");
assert.commandWorked(
tenantMigrationTest.startMigration(migrationOpts, false /* retryOnRetryableErrors */));
fp.wait();
const donorDoc =
donorPrimary.getCollection(TenantMigrationTest.kConfigDonorsNS).findOne({tenantId: kTenantId});
assert.neq(null, donorDoc);
let readThread = new Thread((host, dbName, collName, afterClusterTime) => {
const node = new Mongo(host);
const db = node.getDB(dbName);
const res = db.runCommand({
find: collName,
readConcern: {afterClusterTime: Timestamp(afterClusterTime.t, afterClusterTime.i)}
});
assert.commandFailedWithCode(res, ErrorCodes.InterruptedAtShutdown);
}, donorPrimary.host, kDbName, kCollName, donorDoc.blockTimestamp);
readThread.start();
// Shut down the donor after the read starts blocking.
assert.soon(() => TenantMigrationUtil.getNumBlockedReads(donorPrimary, kTenantId) == 1);
donorRst.stop(donorPrimary);
readThread.join();
donorRst.stopSet();
tenantMigrationTest.stop();
})();
|