mirror of https://github.com/mongodb/mongo
197 lines
6.2 KiB
JavaScript
197 lines
6.2 KiB
JavaScript
/**
|
|
* Tests that resumable index builds complete properly after being interrupted for rollback in
|
|
* different phases.
|
|
*
|
|
* @tags: [
|
|
* # Primary-driven index builds aren't resumable.
|
|
* primary_driven_index_builds_incompatible,
|
|
* requires_majority_read_concern,
|
|
* requires_persistence,
|
|
* # The rollback can be slow on certain build variants (such as macOS and code coverage), which
|
|
* # can cause the targeted log messages to fall off the log buffer before we search for them.
|
|
* incompatible_with_gcov,
|
|
* ]
|
|
*/
|
|
import {RollbackResumableIndexBuildTest} from "jstests/replsets/libs/rollback_resumable_index_build.js";
|
|
import {RollbackTest} from "jstests/replsets/libs/rollback_test.js";
|
|
|
|
const dbName = "test";
|
|
const rollbackTest = new RollbackTest(jsTestName());
|
|
|
|
const runRollbackTo = function (
|
|
rollbackStartFailPoints,
|
|
rollbackEndFailPoints,
|
|
locksYieldedFailPoints,
|
|
resumePhases,
|
|
resumeChecks,
|
|
) {
|
|
const runTest = function (docs, sideWrites, indexSpecsFlat, collNameSuffix) {
|
|
RollbackResumableIndexBuildTest.run(
|
|
rollbackTest,
|
|
dbName,
|
|
collNameSuffix,
|
|
docs,
|
|
[[indexSpecsFlat[0]], [indexSpecsFlat[1]]],
|
|
rollbackStartFailPoints,
|
|
3, // rollbackStartFailPointsIteration
|
|
rollbackEndFailPoints,
|
|
1, // rollbackEndFailPointsIteration
|
|
locksYieldedFailPoints,
|
|
resumePhases,
|
|
resumeChecks,
|
|
[
|
|
{a: 11, b: 11},
|
|
{a: 12, b: 12},
|
|
],
|
|
sideWrites,
|
|
);
|
|
};
|
|
|
|
runTest(
|
|
[
|
|
{a: 1, b: 1},
|
|
{a: 2, b: 2},
|
|
{a: 3, b: 3},
|
|
{a: 4, b: 4},
|
|
{a: 5, b: 5},
|
|
],
|
|
[
|
|
{a: 6, b: 6},
|
|
{a: 7, b: 7},
|
|
{a: 8, b: 8},
|
|
{a: 9, b: 9},
|
|
{a: 10, b: 10},
|
|
],
|
|
[{a: 1}, {b: 1}],
|
|
"",
|
|
);
|
|
runTest(
|
|
[
|
|
{a: [1, 2], b: 1},
|
|
{a: 2, b: 2},
|
|
{a: 3, b: 3},
|
|
{a: 4, b: 4},
|
|
{a: 5, b: 5},
|
|
],
|
|
[
|
|
{a: 6, b: 6},
|
|
{a: 7, b: 7},
|
|
{a: 8, b: 8},
|
|
{a: 9, b: 9},
|
|
{a: 10, b: [10, 11]},
|
|
],
|
|
[{a: 1}, {b: 1}],
|
|
"_multikey_1",
|
|
);
|
|
runTest(
|
|
[
|
|
{a: 1, b: 1},
|
|
{a: 2, b: 2},
|
|
{a: 3, b: 3},
|
|
{a: 4, b: 4},
|
|
{a: [5, 6], b: 5},
|
|
],
|
|
[
|
|
{a: 6, b: [6, 7]},
|
|
{a: 7, b: 7},
|
|
{a: 8, b: 8},
|
|
{a: 9, b: 9},
|
|
{a: 10, b: 10},
|
|
],
|
|
[{a: 1}, {b: 1}],
|
|
"_multikey_2",
|
|
);
|
|
runTest(
|
|
[{a: [1, 2]}, {b: {c: [3, 4]}}, {d: ""}, {e: ""}, {f: [[]]}],
|
|
[{g: null}, {h: 8}, {i: 9}, {j: [{}]}, {k: {}}],
|
|
[{"$**": 1}, {h: 1}],
|
|
"_wildcard",
|
|
);
|
|
};
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringBulkLoadPhase", logIdWithIndexName: 4924400},
|
|
],
|
|
[
|
|
{name: "hangAfterSettingUpIndexBuild", logIdWithBuildUUID: 20387},
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseAfterInsertion", logIdWithBuildUUID: 20386},
|
|
],
|
|
["setYieldAllLocksHang", "hangDuringIndexBuildBulkLoadYield"],
|
|
["collection scan", "bulk load"],
|
|
[{numScannedAfterResume: 6}, {skippedPhaseLogID: 20391}],
|
|
);
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringBulkLoadPhase", logIdWithIndexName: 4924400},
|
|
],
|
|
[
|
|
{name: "hangAfterSettingUpIndexBuild", logIdWithBuildUUID: 20387},
|
|
{name: "hangIndexBuildDuringBulkLoadPhaseSecond", logIdWithIndexName: 4924400},
|
|
],
|
|
["setYieldAllLocksHang", "hangDuringIndexBuildBulkLoadYield"],
|
|
["collection scan", "bulk load"],
|
|
[{numScannedAfterResume: 6}, {skippedPhaseLogID: 20391}],
|
|
);
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringDrainWritesPhase", logIdWithIndexName: 4841800},
|
|
],
|
|
[
|
|
{name: "hangAfterSettingUpIndexBuild", logIdWithBuildUUID: 20387},
|
|
{name: "hangIndexBuildDuringDrainWritesPhaseSecond", logIdWithIndexName: 4841800},
|
|
],
|
|
["setYieldAllLocksHang", "hangDuringIndexBuildDrainYield"],
|
|
["collection scan", "drain writes"],
|
|
[{numScannedAfterResume: 6}, {skippedPhaseLogID: 20392}],
|
|
);
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringBulkLoadPhase", logIdWithIndexName: 4924400},
|
|
],
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseAfterInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringBulkLoadPhaseSecond", logIdWithIndexName: 4924400},
|
|
],
|
|
["setYieldAllLocksHang", "hangDuringIndexBuildBulkLoadYield"],
|
|
["collection scan", "bulk load"],
|
|
[{numScannedAfterResume: 6}, {skippedPhaseLogID: 20391}],
|
|
);
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseBeforeInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringDrainWritesPhase", logIdWithIndexName: 4841800},
|
|
],
|
|
[
|
|
{name: "hangIndexBuildDuringCollectionScanPhaseAfterInsertion", logIdWithBuildUUID: 20386},
|
|
{name: "hangIndexBuildDuringDrainWritesPhaseSecond", logIdWithIndexName: 4841800},
|
|
],
|
|
["setYieldAllLocksHang", "hangDuringIndexBuildDrainYield"],
|
|
["collection scan", "drain writes"],
|
|
[{numScannedAfterResume: 6}, {skippedPhaseLogID: 20392}],
|
|
);
|
|
|
|
runRollbackTo(
|
|
[
|
|
{name: "hangIndexBuildDuringBulkLoadPhase", logIdWithIndexName: 4924400},
|
|
{name: "hangIndexBuildDuringDrainWritesPhase", logIdWithIndexName: 4841800},
|
|
],
|
|
[
|
|
{name: "hangIndexBuildDuringBulkLoadPhaseSecond", logIdWithIndexName: 4924400},
|
|
{name: "hangIndexBuildDuringDrainWritesPhaseSecond", logIdWithIndexName: 4841800},
|
|
],
|
|
["hangDuringIndexBuildBulkLoadYield", "hangDuringIndexBuildDrainYield"],
|
|
["bulk load", "drain writes"],
|
|
[{skippedPhaseLogID: 20391}, {skippedPhaseLogID: 20392}],
|
|
);
|
|
|
|
rollbackTest.stop();
|