// // Tests writeConcerns with findAndModify command // // Skip this test when running with storage engines other than inMemory, as the test relies on // journaling not being active. import {ReplSetTest} from "jstests/libs/replsettest.js"; if (jsTest.options().storageEngine !== "inMemory") { jsTest.log("Skipping test because it is only applicable for the inMemory storage engine"); quit(); } let nodeCount = 3; let rst = new ReplSetTest({nodes: nodeCount}); rst.startSet(); rst.initiate(); let primary = rst.getPrimary(); let coll = primary.getCollection("test.find_and_modify_wc"); coll.remove({}); // insert some documents let docs = []; for (let i = 1; i <= 5; ++i) { docs.push({i: i, j: 2 * i}); } var res = coll.runCommand({insert: coll.getName(), documents: docs, writeConcern: {w: nodeCount}}); assert(res.ok); assert.eq(5, coll.find().itcount()); // use for updates in subsequent runCommand calls let reqUpdate = { findAndModify: coll.getName(), query: {i: 3}, update: {$inc: {j: 1}}, writeConcern: {w: "majority"}, }; // Verify findAndModify returns old document new: false var res = coll.runCommand(reqUpdate); assert(res.ok); assert(res.value); // (2 * res.value.i) == 6 == res.value.j (old document) assert.eq(2 * res.value.i, res.value.j); assert(!res.writeConcernError); // Verify findAndModify returns new document with new: true reqUpdate.new = true; res = coll.runCommand(reqUpdate); assert(res.ok); assert(res.value); // (2 * res.value.i + 2) == 8 == res.value.j (new document after two updates) assert.eq(2 * res.value.i + 2, res.value.j); assert(!res.writeConcernError); // Verify findAndModify remove works res = coll.runCommand({findAndModify: coll.getName(), sort: {i: 1}, remove: true, writeConcern: {w: nodeCount}}); assert.eq(res.value.i, 1); assert.eq(coll.find().itcount(), 4); assert(!res.writeConcernError); // Verify findAndModify returns writeConcernError // when given invalid writeConcerns [{w: "invalid"}, {w: nodeCount + 1}].forEach(function (wc) { reqUpdate.writeConcern = wc; res = coll.runCommand(reqUpdate); assert(res.writeConcernError); assert(res.writeConcernError.code); assert(res.writeConcernError.errmsg); }); rst.stopSet();