diff options
author | Shin Yee Tan <shinyee.tan@mongodb.com> | 2020-08-07 07:13:03 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-07 22:58:30 +0000 |
commit | ca1d644a6f31477b247fa79b6345528aba165281 (patch) | |
tree | c664ed1b71b050320c2b76f3aef72434d5f696dd /jstests/disk | |
parent | 426ed301b2e61107e82822764a855feb27168742 (diff) | |
download | mongo-ca1d644a6f31477b247fa79b6345528aba165281.tar.gz |
SERVER-49687 Add flag for validate to repair data in standalone mode
Diffstat (limited to 'jstests/disk')
-rw-r--r-- | jstests/disk/repair_corrupt_document.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/jstests/disk/repair_corrupt_document.js b/jstests/disk/repair_corrupt_document.js new file mode 100644 index 00000000000..079f2e34f06 --- /dev/null +++ b/jstests/disk/repair_corrupt_document.js @@ -0,0 +1,87 @@ +/** + * Tests that --repair deletes corrupt BSON documents. + */ + +(function() { + +load('jstests/disk/libs/wt_file_helper.js'); + +const baseName = "repair_corrupt_document"; +const collName = "test"; +const dbpath = MongoRunner.dataPath + baseName + "/"; +const doc1 = { + a: 1 +}; +const doc2 = { + a: 2 +}; +const indexName = "a_1"; + +let indexUri; +let validDoc; + +resetDbpath(dbpath); +let port; + +// Initialize test collection. +let createCollWithDoc = function(coll) { + assert.commandWorked(coll.insert(doc1)); + validDoc = coll.findOne(doc1); + + assert.commandWorked(coll.createIndex({a: 1}, {name: indexName})); + assertQueryUsesIndex(coll, doc1, indexName); + indexUri = getUriForIndex(coll, indexName); + return coll; +}; + +// Insert corrupt document for testing via failpoint. +let corruptDocumentOnInsert = function(db, coll) { + jsTestLog("Corrupt document BSON on insert."); + assert.commandWorked( + db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "alwaysOn"})); + assert.commandWorked(coll.insert(doc2)); + assert.commandWorked( + db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "off"})); +}; + +/** + * Test 1: Insert corrupt document and verify results are valid without rebuilding indexes after + * running repair. + */ +(function startStandaloneWithCorruptDoc() { + jsTestLog("Entering startStandaloneWithCorruptDoc..."); + + let mongod = startMongodOnExistingPath(dbpath); + port = mongod.port; + let db = mongod.getDB(baseName); + let testColl = db[collName]; + + testColl = createCollWithDoc(testColl); + corruptDocumentOnInsert(db, testColl); + + assert.eq(testColl.count(), 2); + + MongoRunner.stopMongod(mongod, null, {skipValidation: true}); + jsTestLog("Exiting startStandaloneWithCorruptDoc."); +})(); + +// Run validate with repair mode and verify corrupt document is removed from collection. +(function runRepairAndVerifyCollectionDocs() { + jsTestLog("Entering runRepairAndVerifyCollectionDocs..."); + + assertRepairSucceeds(dbpath, port, {}); + + let mongod = startMongodOnExistingPath(dbpath); + let testColl = mongod.getDB(baseName)[collName]; + + // Repair removed the corrupt document. + assert.eq(testColl.count(), 1); + assert.eq(testColl.findOne(doc1), validDoc); + + // Repair did not need to rebuild indexes. + assert.eq(indexUri, getUriForIndex(testColl, indexName)); + + MongoRunner.stopMongod(mongod); + jsTestLog("Exiting runValidateWithRepairMode."); +})(); +})();
\ No newline at end of file |