summaryrefslogtreecommitdiff
path: root/jstests/core/profile_write_conflict.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/profile_write_conflict.js')
-rw-r--r--jstests/core/profile_write_conflict.js232
1 files changed, 232 insertions, 0 deletions
diff --git a/jstests/core/profile_write_conflict.js b/jstests/core/profile_write_conflict.js
new file mode 100644
index 00000000000..15201e22392
--- /dev/null
+++ b/jstests/core/profile_write_conflict.js
@@ -0,0 +1,232 @@
+// Test profiling of insert, update, delete with write conflicts (SERVER-51456).
+//
+// @tags: [
+// assumes_write_concern_unchanged,
+// does_not_support_stepdowns,
+// requires_profiling,
+// ]
+
+(function() {
+"use strict";
+
+load("jstests/libs/fail_point_util.js"); // for 'configureFailPoint()'
+load("jstests/libs/profiler.js"); // for 'getLatestProfilerEntry()'
+
+if (jsTestOptions().storageEngine !== "ephemeralForTest") {
+ jsTestLog("This test requires ephemeralForTest - exiting");
+ return 0;
+}
+
+const testDB = db.getSiblingDB(jsTestName());
+assert.commandWorked(testDB.dropDatabase());
+const coll = testDB.getCollection("test");
+const doc = {
+ a: 1,
+ b: 1
+};
+const writeConflicts = 100;
+
+assert.commandWorked(testDB.setProfilingLevel(2));
+
+{
+ // Test insert.
+ assert.commandWorked(testDB.createCollection(coll.getName()));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand(
+ {insert: coll.getName(), documents: [doc], comment: jsTestName() + "-insert"}));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-insert"});
+
+ assert.eq(profileObj.ninserted, 1, profileObj);
+ assert.eq(profileObj.keysInserted, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test delete.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ delete: coll.getName(),
+ deletes: [{q: doc, limit: 0}],
+ comment: jsTestName() + "-delete"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-delete"});
+
+ assert.eq(profileObj.ndeleted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test update.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ update: coll.getName(),
+ updates: [{q: {a: 1}, u: {$set: {c: 1}, $inc: {a: -10}}}],
+ comment: jsTestName() + "-update"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-update"});
+
+ assert.eq(profileObj.keysInserted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.eq(profileObj.nMatched, 1, profileObj);
+ assert.eq(profileObj.nModified, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test upsert - update.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ update: coll.getName(),
+ updates: [{q: {a: 1}, u: {$set: {c: 1}, $inc: {a: -10}}, upsert: true}],
+ comment: jsTestName() + "-upsertu"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-upsertu"});
+
+ assert.eq(profileObj.keysInserted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.eq(profileObj.nMatched, 1, profileObj);
+ assert.eq(profileObj.nModified, 1, profileObj);
+ assert.eq(profileObj.nUpserted, 0, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test upsert - insert.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ update: coll.getName(),
+ updates: [{q: {a: 2}, u: {$set: {c: 1}, $inc: {a: -10}}, upsert: true}],
+ comment: jsTestName() + "-upserti"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-upserti"});
+
+ assert.eq(profileObj.keysInserted, 2, profileObj);
+ assert.eq(profileObj.nMatched, 0, profileObj);
+ assert.eq(profileObj.nModified, 0, profileObj);
+ assert.eq(profileObj.nUpserted, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test findAndModify - delete.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ findAndModify: coll.getName(),
+ query: doc,
+ remove: true,
+ comment: jsTestName() + "-fnmdel"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-fnmdel"});
+
+ assert.eq(profileObj.ndeleted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test findAndModify - update.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ findAndModify: coll.getName(),
+ query: doc,
+ update: {$set: {c: 1}, $inc: {a: -10}},
+ comment: jsTestName() + "-fnmupd"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-fnmupd"});
+
+ assert.eq(profileObj.keysInserted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.eq(profileObj.nMatched, 1, profileObj);
+ assert.eq(profileObj.nModified, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test findAndModify - upsert - update.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ findAndModify: coll.getName(),
+ query: doc,
+ update: {$set: {c: 1}, $inc: {a: -10}},
+ upsert: true,
+ comment: jsTestName() + "-fnmupsu"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-fnmupsu"});
+
+ assert.eq(profileObj.keysInserted, 1, profileObj);
+ assert.eq(profileObj.keysDeleted, 1, profileObj);
+ assert.eq(profileObj.nMatched, 1, profileObj);
+ assert.eq(profileObj.nModified, 1, profileObj);
+ assert.eq(profileObj.nUpserted, 0, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+
+{
+ // Test findAndModify - upsert - insert.
+ coll.drop();
+ assert.commandWorked(coll.insert(doc));
+ assert.commandWorked(coll.createIndex({a: 1}));
+ const fp = configureFailPoint(db, "EFTThrowWCEOnMerge", {}, {times: writeConflicts});
+ assert.commandWorked(testDB.runCommand({
+ findAndModify: coll.getName(),
+ query: {a: 2},
+ update: {$set: {c: 1}, $inc: {a: -10}},
+ upsert: true,
+ comment: jsTestName() + "-fnmupsi"
+ }));
+ fp.off();
+
+ const profileObj =
+ getLatestProfilerEntry(testDB, {"command.comment": jsTestName() + "-fnmupsi"});
+
+ assert.eq(profileObj.keysInserted, 2, profileObj);
+ assert.eq(profileObj.nMatched, 0, profileObj);
+ assert.eq(profileObj.nModified, 0, profileObj);
+ assert.eq(profileObj.nUpserted, 1, profileObj);
+ assert.gt(profileObj.writeConflicts, 0, profileObj);
+}
+})();