diff options
Diffstat (limited to 'jstests/replsets/bulk_api_wc.js')
-rw-r--r-- | jstests/replsets/bulk_api_wc.js | 281 |
1 files changed, 139 insertions, 142 deletions
diff --git a/jstests/replsets/bulk_api_wc.js b/jstests/replsets/bulk_api_wc.js index fd5413ddd29..591ad1aef58 100644 --- a/jstests/replsets/bulk_api_wc.js +++ b/jstests/replsets/bulk_api_wc.js @@ -6,146 +6,143 @@ (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"); - - 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 due to unrecognized write concern field. - coll.remove({}); - var bulk = coll.initializeOrderedBulkOp(); - bulk.insert({a: 1}); - bulk.insert({a: 2}); - var result = assert.throws(function() { - bulk.execute({x: 1}); - }); - assert.eq( - ErrorCodes.FailedToParse, result.code, 'unexpected error code: ' + tojson(result)); - assert.eq('unrecognized write concern field: x', - result.errmsg, - 'unexpected error message: ' + tojson(result)); - - // - // 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); - }; - - // 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(); - +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"); + +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 due to unrecognized write concern field. + coll.remove({}); + var bulk = coll.initializeOrderedBulkOp(); + bulk.insert({a: 1}); + bulk.insert({a: 2}); + var result = assert.throws(function() { + bulk.execute({x: 1}); + }); + assert.eq(ErrorCodes.FailedToParse, result.code, 'unexpected error code: ' + tojson(result)); + assert.eq('unrecognized write concern field: x', + result.errmsg, + 'unexpected error message: ' + tojson(result)); + + // + // 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); +}; + +// 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(); })(); |