SERVER-116273 corruptDocumentOnInsert failpoint should only target specified namespace (#46047)

GitOrigin-RevId: b2c174037204c151593bd4f3418207e3d2df4901
This commit is contained in:
Benjamin Pearce
2026-01-09 13:05:05 -05:00
committed by MongoDB Bot
parent 4566471356
commit 67d243121c
5 changed files with 35 additions and 9 deletions

View File

@@ -40,7 +40,13 @@ let createCollWithDoc = function (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(
db.adminCommand({
configureFailPoint: "corruptDocumentOnInsert",
data: {"ns": coll.getFullName()},
mode: "alwaysOn",
}),
);
assert.commandWorked(coll.insert(doc2));
assert.commandWorked(db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "off"}));
};

View File

@@ -7,7 +7,13 @@ const coll = db.getCollection(jsTestName());
coll.drop();
// Corrupt document during insert for testing via failpoint.
assert.commandWorked(db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "alwaysOn"}));
assert.commandWorked(
db.adminCommand({
configureFailPoint: "corruptDocumentOnInsert",
data: {"ns": coll.getFullName()},
mode: "alwaysOn",
}),
);
assert.commandWorked(coll.insert({a: 1}));
assert.commandWorked(db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "off"}));

View File

@@ -88,7 +88,13 @@ assert.commandWorked(
// Insert corrupt document for testing via failpoint.
const insertCorruptDocument = function (db, collName) {
assert.commandWorked(db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "alwaysOn"}));
assert.commandWorked(
db.adminCommand({
configureFailPoint: "corruptDocumentOnInsert",
data: {"ns": `${db.getCollection(collName).getFullName()}`},
mode: "alwaysOn",
}),
);
// Use godinsert to insert into the node directly.
assert.commandWorked(db.runCommand({godinsert: collName, obj: doc1}));
assert.commandWorked(db.adminCommand({configureFailPoint: "corruptDocumentOnInsert", mode: "off"}));

View File

@@ -30,7 +30,7 @@ assert.commandWorked(s0Coll.insert({_id: 2}));
assert.commandWorked(s1.adminCommand({moveChunk: kNsColl, find: {_id: 2}, to: st.shard1.shardName}));
// Insert corrupted document
configureFailPoint(st.shard1, "corruptDocumentOnInsert", {}, "alwaysOn");
configureFailPoint(st.shard1, "corruptDocumentOnInsert", {ns: kNsColl}, "alwaysOn");
assert.commandWorked(s1Coll.insert({_id: 1}));
configureFailPoint(st.shard1, "corruptDocumentOnInsert", {}, "off");

View File

@@ -287,11 +287,19 @@ Status insertDocumentsImpl(OperationContext* opCtx,
}
if (MONGO_unlikely(corruptDocumentOnInsert.shouldFail())) {
// Insert a truncated record that is half the expected size of the source document.
records.emplace_back(
Record{std::move(recordId), RecordData(doc.objdata(), doc.objsize() / 2)});
timestamps.emplace_back(it->oplogSlot.getTimestamp());
continue;
auto scoped = corruptDocumentOnInsert.scoped();
const auto fpNss = NamespaceStringUtil::parseFailPointData(scoped.getData(), "ns"_sd);
if (collection->ns() == fpNss) {
// Insert a truncated record that is half the expected size of the source document.
records.emplace_back(
Record{std::move(recordId), RecordData(doc.objdata(), doc.objsize() / 2)});
timestamps.emplace_back(it->oplogSlot.getTimestamp());
LOGV2_WARNING(11627300,
"Corrupted document intentionally inserted due to failpoint",
"failpoint"_attr = corruptDocumentOnInsert.getName(),
"namespace"_attr = collection->ns());
continue;
}
}
explicitlySetRecordIdOnInsert.execute([&](const BSONObj& data) {