summaryrefslogtreecommitdiff
path: root/jstests/core/write/delete/batch_write_command_delete.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/write/delete/batch_write_command_delete.js')
-rw-r--r--jstests/core/write/delete/batch_write_command_delete.js199
1 files changed, 199 insertions, 0 deletions
diff --git a/jstests/core/write/delete/batch_write_command_delete.js b/jstests/core/write/delete/batch_write_command_delete.js
new file mode 100644
index 00000000000..ecd3ea39f05
--- /dev/null
+++ b/jstests/core/write/delete/batch_write_command_delete.js
@@ -0,0 +1,199 @@
+// Cannot implicitly shard accessed collections because of following errmsg: A single
+// update/delete on a sharded collection must contain an exact match on _id or contain the shard
+// key.
+//
+// @tags: [
+// assumes_unsharded_collection,
+// assumes_write_concern_unchanged,
+// requires_non_retryable_writes,
+// requires_fastcount,
+// ]
+
+//
+// Ensures that mongod respects the batch write protocols for delete
+//
+
+var coll = db.getCollection("batch_write_delete");
+coll.drop();
+
+var request;
+var result;
+var batch;
+
+var maxWriteBatchSize = db.hello().maxWriteBatchSize;
+
+function resultOK(result) {
+ return result.ok && !('code' in result) && !('errmsg' in result) && !('errInfo' in result) &&
+ !('writeErrors' in result);
+}
+
+function resultNOK(result) {
+ return !result.ok && typeof (result.code) == 'number' && typeof (result.errmsg) == 'string';
+}
+
+function countEventually(collection, n) {
+ assert.soon(
+ function() {
+ return collection.count() === n;
+ },
+ function() {
+ return "unacknowledged write timed out";
+ });
+}
+
+// EACH TEST BELOW SHOULD BE SELF-CONTAINED, FOR EASIER DEBUGGING
+
+//
+// NO DOCS, illegal command
+coll.drop();
+coll.insert({a: 1});
+request = {
+ delete: coll.getName()
+};
+result = coll.runCommand(request);
+assert(resultNOK(result), tojson(result));
+assert.eq(1, coll.count());
+
+//
+// Single document remove, default write concern specified
+coll.drop();
+coll.insert({a: 1});
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {a: 1}, limit: 1}]
+};
+result = coll.runCommand(request);
+assert(resultOK(result), tojson(result));
+assert.eq(1, result.n);
+assert.eq(0, coll.count());
+
+//
+// Single document remove, w:1 write concern specified, ordered:true
+coll.drop();
+coll.insert([{a: 1}, {a: 1}]);
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {a: 1}, limit: 1}],
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert(resultOK(result), tojson(result));
+assert.eq(1, result.n);
+assert.eq(1, coll.count());
+
+//
+// Multiple document remove, w:1 write concern specified, ordered:true, default top
+coll.drop();
+coll.insert([{a: 1}, {a: 1}]);
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {a: 1}, limit: 0}],
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert(resultOK(result), tojson(result));
+assert.eq(2, result.n);
+assert.eq(0, coll.count());
+
+//
+// Multiple document remove, w:1 write concern specified, ordered:true, top:0
+coll.drop();
+coll.insert([{a: 1}, {a: 1}]);
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {a: 1}, limit: 0}],
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert(resultOK(result), tojson(result));
+assert.eq(2, result.n);
+assert.eq(0, coll.count());
+
+//
+// Large batch under the size threshold should delete successfully
+coll.drop();
+batch = [];
+var insertBatch = coll.initializeUnorderedBulkOp();
+for (var i = 0; i < maxWriteBatchSize; ++i) {
+ insertBatch.insert({_id: i});
+ batch.push({q: {_id: i}, limit: 0});
+}
+assert.commandWorked(insertBatch.execute());
+request = {
+ delete: coll.getName(),
+ deletes: batch,
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert(resultOK(result), tojson(result));
+assert.eq(batch.length, result.n);
+assert.eq(0, coll.count());
+
+//
+// Large batch above the size threshold should fail to delete
+coll.drop();
+batch = [];
+var insertBatch = coll.initializeUnorderedBulkOp();
+for (var i = 0; i < maxWriteBatchSize + 1; ++i) {
+ insertBatch.insert({_id: i});
+ batch.push({q: {_id: i}, limit: 0});
+}
+assert.commandWorked(insertBatch.execute());
+request = {
+ delete: coll.getName(),
+ deletes: batch,
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert(resultNOK(result), tojson(result));
+assert.eq(batch.length, coll.count());
+
+//
+// Cause remove error using ordered:true
+coll.drop();
+coll.insert({a: 1});
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {a: 1}, limit: 0}, {q: {$set: {a: 1}}, limit: 0}, {q: {$set: {a: 1}}, limit: 0}],
+ writeConcern: {w: 1},
+ ordered: true
+};
+result = coll.runCommand(request);
+assert.commandWorkedIgnoringWriteErrors(result);
+assert.eq(1, result.n);
+assert(result.writeErrors != null);
+assert.eq(1, result.writeErrors.length);
+
+assert.eq(1, result.writeErrors[0].index);
+assert.eq('number', typeof result.writeErrors[0].code);
+assert.eq('string', typeof result.writeErrors[0].errmsg);
+assert.eq(0, coll.count());
+
+//
+// Cause remove error using ordered:false
+coll.drop();
+coll.insert({a: 1});
+request = {
+ delete: coll.getName(),
+ deletes: [{q: {$set: {a: 1}}, limit: 0}, {q: {$set: {a: 1}}, limit: 0}, {q: {a: 1}, limit: 0}],
+ writeConcern: {w: 1},
+ ordered: false
+};
+result = coll.runCommand(request);
+assert.commandWorkedIgnoringWriteErrors(result);
+assert.eq(1, result.n);
+assert.eq(2, result.writeErrors.length);
+
+assert.eq(0, result.writeErrors[0].index);
+assert.eq('number', typeof result.writeErrors[0].code);
+assert.eq('string', typeof result.writeErrors[0].errmsg);
+
+assert.eq(1, result.writeErrors[1].index);
+assert.eq('number', typeof result.writeErrors[1].code);
+assert.eq('string', typeof result.writeErrors[1].errmsg);
+assert.eq(0, coll.count());