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
|
/**
* Tests that --repair on WiredTiger correctly and gracefully handles inconsistent indexes.
*
* @tags: [requires_wiredtiger]
*/
(function() {
load('jstests/disk/libs/wt_file_helper.js');
const baseName = "wt_repair_inconsistent_index";
const collName = "test";
const dbpath = MongoRunner.dataPath + baseName + "/";
const forceCheckpoint = () => {
assert.commandWorked(db.fsyncLock());
assert.commandWorked(db.fsyncUnlock());
};
/**
* Run the test by supplying additional paramters to MongoRunner.runMongod with 'mongodOptions'.
*/
let runTest = function(mongodOptions) {
resetDbpath(dbpath);
jsTestLog("Running test with args: " + tojson(mongodOptions));
/**
* Test 1. Configure the skipIndexNewRecords failpoint, then insert documents into
* testColl, which will result in an index inconsistency. Run repair and verify
* that the index is rebuilt.
*/
let mongod = startMongodOnExistingPath(dbpath, mongodOptions);
let testColl = mongod.getDB(baseName)[collName];
const doc = {a: 1};
assert.commandWorked(testColl.insert(doc));
const indexName = "a_1";
assert.commandWorked(testColl.createIndex({a: 1}, {name: indexName}));
assertQueryUsesIndex(testColl, doc, indexName);
let testCollUri = getUriForColl(testColl);
let indexUri = getUriForIndex(testColl, indexName);
let db = mongod.getDB(baseName);
assert.commandWorked(
db.adminCommand({configureFailPoint: 'skipIndexNewRecords', mode: 'alwaysOn'}));
assert.commandWorked(testColl.insert({a: 2}));
// Disable validation because it is expected to not pass due to index inconsistencies.
MongoRunner.stopMongod(mongod, null, {skipValidation: true});
assertRepairSucceeds(dbpath, mongod.port, mongodOptions);
mongod = startMongodOnExistingPath(dbpath, mongodOptions);
testColl = mongod.getDB(baseName)[collName];
// Repair creates new idents.
assert.neq(indexUri, getUriForIndex(testColl, indexName));
assertQueryUsesIndex(testColl, doc, indexName);
assert.eq(testCollUri, getUriForColl(testColl));
assert.eq(testColl.count(), 2);
MongoRunner.stopMongod(mongod);
};
runTest({});
runTest({directoryperdb: ""});
runTest({wiredTigerDirectoryForIndexes: ""});
})();
|