108 lines
3.6 KiB
JavaScript
108 lines
3.6 KiB
JavaScript
// Tests write-concern-related bulk api functionality
|
|
//
|
|
// This test asserts that a journaled write to a mongod running with --nojournal should be rejected,
|
|
// so cannot be run on the ephemeralForTest storage engine, as it accepts all journaled writes.
|
|
// @tags: [SERVER-21420]
|
|
|
|
jsTest.log("Starting bulk api write concern tests...");
|
|
|
|
// 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");
|
|
|
|
var executeTests = function() {
|
|
|
|
// Create a unique index, legacy writes validate too early to use invalid documents for write
|
|
// error testing
|
|
coll.ensureIndex({ 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 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});
|
|
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.count(), 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.count(), 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.count(), 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.count(), 3);
|
|
};
|
|
|
|
// Use write commands
|
|
coll.getMongo().useWriteCommands = function() { return true; };
|
|
executeTests();
|
|
|
|
// FAILING currently due to incorrect batch api reading of GLE
|
|
// Use legacy opcodes
|
|
coll.getMongo().useWriteCommands = function() { return false; };
|
|
executeTests();
|
|
|
|
jsTest.log("DONE bulk api wc tests");
|
|
rst.stopSet();
|