Files
mongo/jstests/core/batch_write_command_w0.js
2019-01-15 18:06:46 -05:00

150 lines
3.6 KiB
JavaScript

/**
* Test unacknowledged write commands.
*
* 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,
* ]
*/
function countEventually(collection, n) {
assert.soon(
function() {
return collection.count() === n;
},
function() {
return "unacknowledged write timed out";
});
}
var coll = db.getCollection("batch_write_w0");
coll.drop();
//
// Ensures that mongod respects the batch write protocols for delete
//
assert(coll.getDB().getMongo().useWriteCommands(), "test is not running with write commands");
// EACH TEST BELOW SHOULD BE SELF-CONTAINED, FOR EASIER DEBUGGING
//
// Single document insert, w:0 write concern specified, missing ordered
coll.remove({});
request = {
insert: coll.getName(),
documents: [{a: 1}],
writeConcern: {w: 0}
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 1);
//
// Single document upsert, write concern 0 specified, ordered = true
coll.remove({});
request = {
update: coll.getName(),
updates: [{q: {a: 1}, u: {$set: {a: 1}}, upsert: true}],
writeConcern: {w: 0},
ordered: true
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 1);
//
// Two document upsert, write concern 0 specified, ordered = true
coll.remove({});
request = {
update: coll.getName(),
updates: [
{q: {a: 2}, u: {$set: {a: 1}}, upsert: true},
{q: {a: 2}, u: {$set: {a: 2}}, upsert: true}
],
writeConcern: {w: 0},
ordered: true
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 2);
//
// Upsert fail due to duplicate key index, w:0, ordered:true
coll.remove({});
coll.ensureIndex({a: 1}, {unique: true});
request = {
update: coll.getName(),
updates: [
{q: {b: 1}, u: {$set: {b: 1, a: 1}}, upsert: true},
{q: {b: 2}, u: {$set: {b: 2, a: 1}}, upsert: true}
],
writeConcern: {w: 0},
ordered: true
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 1);
// Remove unique index
coll.drop();
//
// Single document delete, w:0 write concern specified
coll.remove({});
coll.insert({a: 1});
request = {
delete: coll.getName(),
deletes: [{q: {a: 1}, limit: 1}],
writeConcern: {w: 0}
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 0);
//
// Cause remove error using ordered:false and w:0
coll.remove({});
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: 0},
ordered: false
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
countEventually(coll, 0);
//
// Cause remove error using ordered:true and w:0 - $set isn't a valid delete filter
coll.remove({});
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: 1}],
writeConcern: {w: 0},
ordered: true
};
result = coll.runCommand(request);
assert.eq({ok: 1}, result);
assert.eq(coll.count(), 1);
//
// When limit is not 0 and 1
coll.remove({});
coll.insert({a: 1});
request = {
delete: coll.getName(),
deletes: [{q: {a: 1}, limit: 2}],
writeConcern: {w: 0},
ordered: false
};
result = coll.runCommand(request);
// Unacknowledged writes are always OK
assert.eq({ok: 1}, result);