summaryrefslogtreecommitdiff
path: root/jstests/disk
diff options
context:
space:
mode:
authorShin Yee Tan <shinyee.tan@mongodb.com>2020-08-07 07:13:03 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-07 22:58:30 +0000
commitca1d644a6f31477b247fa79b6345528aba165281 (patch)
treec664ed1b71b050320c2b76f3aef72434d5f696dd /jstests/disk
parent426ed301b2e61107e82822764a855feb27168742 (diff)
downloadmongo-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.js87
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