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 a resumable index build large enough to spill to disk during the collection scan
* phase completes properly after being interrupted for rollback during the collection scan phase.
*
* @tags: [
* requires_majority_read_concern,
* requires_persistence,
* ]
*/
(function() {
"use strict";
load('jstests/replsets/libs/rollback_resumable_index_build.js');
const dbName = "test";
const numDocuments = 200;
const maxIndexBuildMemoryUsageMB = 50;
const rollbackTest = new RollbackTest(jsTestName());
// Insert enough data so that the collection scan spills to disk. Keep the size of each document
// small enough to report for validation, in case there are index inconsistencies.
const docs = [];
for (let i = 0; i < numDocuments; i++) {
// Since most integers will take two or three bytes, almost all documents are at least 0.5 MB.
docs.push({a: i.toString().repeat(1024 * 256)});
}
const runRollbackTo = function(rollbackEndFailPointName, rollbackEndFailPointLogIdWithBuildUUID) {
assert.commandWorked(rollbackTest.getPrimary().adminCommand(
{setParameter: 1, maxIndexBuildMemoryUsageMegabytes: maxIndexBuildMemoryUsageMB}));
RollbackResumableIndexBuildTest.run(
rollbackTest,
dbName,
"_large",
docs,
[[{a: 1}]],
[{
name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion",
logIdWithBuildUUID: 20386
}],
// Most documents are at least 0.5 MB, so the index build must have spilled to disk by this
// point.
maxIndexBuildMemoryUsageMB, // rollbackStartFailPointsIteration
[{
name: rollbackEndFailPointName,
logIdWithBuildUUID: rollbackEndFailPointLogIdWithBuildUUID
}],
1, // rollbackEndFailPointsIteration
["setYieldAllLocksHang"],
["collection scan"],
// The collection scan will scan one additional document past the point specified above due
// to locks needing to be yielded before the rollback can occur. Thus, we subtract 1 from
// the difference.
[{numScannedAfterResume: numDocuments - maxIndexBuildMemoryUsageMB - 1}],
[{a: 1}, {a: 2}]);
};
// Rollback to before the index begins to be built.
runRollbackTo("hangAfterSettingUpIndexBuild", 20387);
// Rollback to earlier in the collection scan phase.
runRollbackTo("hangIndexBuildDuringCollectionScanPhaseAfterInsertion", 20386);
rollbackTest.stop();
})();
|