mongo/jstests/replsets/bulk_api_wc.js

121 lines
3.5 KiB
JavaScript

// Tests write-concern-related bulk api functionality
(function() {
jsTest.log("Starting bulk api write concern tests...");
// Skip this test if running with the "wiredTiger" storage engine, since it requires
// using 'nojournal' in a replica set, which is not supported when using WT.
if (!jsTest.options().storageEngine || jsTest.options().storageEngine === "wiredTiger") {
// WT is currently the default engine so it is used when 'storageEngine' is not set.
jsTest.log("Skipping test because it is not applicable for the wiredTiger storage engine");
return;
}
// Start a 2-node replica set with no journal.
// Allows testing immediate write concern failures and wc application failures
var rst = new ReplSetTest({nodes: 2});
rst.startSet({nojournal: ""});
rst.initiate();
var mongod = rst.getPrimary();
var coll = mongod.getCollection("test.bulk_api_wc");
// Create a unique index, legacy writes validate too early to use invalid documents for write error
// testing
coll.createIndex({a: 1}, {unique: true});
//
// Ordered
//
//
// Fail due to nojournal
coll.remove({});
var bulk = coll.initializeOrderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
assert.throws(function() {
bulk.execute({j: true});
});
//
// Fail due to unrecognized write concern field.
coll.remove({});
var bulk = coll.initializeOrderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
assert.throws(function() {
bulk.execute({x: 1});
});
//
// Fail with write error, no write concern error even though it would fail on apply for ordered
coll.remove({});
var bulk = coll.initializeOrderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
bulk.insert({a: 2});
result = assert.throws(function() {
bulk.execute({w: 'invalid'});
});
assert.eq(result.nInserted, 2);
assert.eq(result.getWriteErrors()[0].index, 2);
assert(!result.getWriteConcernError());
assert.eq(coll.find().itcount(), 2);
//
// Unordered
//
//
// Fail with write error, write concern error reported when unordered
coll.remove({});
var bulk = coll.initializeUnorderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
bulk.insert({a: 2});
var result = assert.throws(function() {
bulk.execute({w: 'invalid'});
});
assert.eq(result.nInserted, 2);
assert.eq(result.getWriteErrors()[0].index, 2);
assert(result.getWriteConcernError());
assert.eq(coll.find().itcount(), 2);
//
// Fail with write error, write concern timeout reported when unordered Note that wtimeout:true can
// only be reported when the batch is all the same, so there's not multiple wc errors
coll.remove({});
var bulk = coll.initializeUnorderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
bulk.insert({a: 2});
var result = assert.throws(function() {
bulk.execute({w: 3, wtimeout: 1});
});
assert.eq(result.nInserted, 2);
assert.eq(result.getWriteErrors()[0].index, 2);
assert.eq(100, result.getWriteConcernError().code);
assert.eq(coll.find().itcount(), 2);
//
// Fail with write error and upserted, write concern error reported when unordered
coll.remove({});
var bulk = coll.initializeUnorderedBulkOp();
bulk.insert({a: 1});
bulk.insert({a: 2});
bulk.find({a: 3}).upsert().updateOne({a: 3});
bulk.insert({a: 3});
var result = assert.throws(function() {
bulk.execute({w: 'invalid'});
});
assert.eq(result.nInserted, 2);
assert.eq(result.nUpserted, 1);
assert.eq(result.getUpsertedIds()[0].index, 2);
assert.eq(result.getWriteErrors()[0].index, 3);
assert(result.getWriteConcernError());
assert.eq(coll.find().itcount(), 3);
jsTest.log("DONE bulk api wc tests");
rst.stopSet();
})();