Skip to content

Commit 12ff392

Browse files
authored
fix(bulk): handle MongoWriteConcernErrors
Fixes NODE-1521
1 parent e0be020 commit 12ff392

File tree

4 files changed

+193
-137
lines changed

4 files changed

+193
-137
lines changed

lib/bulk/common.js

+37-17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
'use strict';
22

3-
var Long = require('mongodb-core').BSON.Long,
4-
MongoError = require('mongodb-core').MongoError,
5-
util = require('util');
3+
const Long = require('mongodb-core').BSON.Long;
4+
const MongoError = require('mongodb-core').MongoError;
5+
const util = require('util');
6+
const toError = require('../utils').toError;
7+
const handleCallback = require('../utils').handleCallback;
68

79
// Error codes
810
var UNKNOWN_ERROR = 8;
@@ -402,6 +404,20 @@ var cloneOptions = function(options) {
402404
return clone;
403405
};
404406

407+
function handleMongoWriteConcernError(batch, bulkResult, ordered, err, callback) {
408+
mergeBatchResults(ordered, batch, bulkResult, null, err.result);
409+
410+
const wrappedWriteConcernError = new WriteConcernError({
411+
errmsg: err.result.writeConcernError.errmsg,
412+
code: err.result.writeConcernError.result
413+
});
414+
return handleCallback(
415+
callback,
416+
new BulkWriteError(toError(wrappedWriteConcernError), new BulkWriteResult(bulkResult)),
417+
null
418+
);
419+
}
420+
405421
/**
406422
* Creates a new BulkWriteError
407423
*
@@ -426,17 +442,21 @@ const BulkWriteError = function(error, result) {
426442
util.inherits(BulkWriteError, MongoError);
427443

428444
// Exports symbols
429-
exports.BulkWriteError = BulkWriteError;
430-
exports.BulkWriteResult = BulkWriteResult;
431-
exports.WriteError = WriteError;
432-
exports.Batch = Batch;
433-
exports.LegacyOp = LegacyOp;
434-
exports.mergeBatchResults = mergeBatchResults;
435-
exports.cloneOptions = cloneOptions;
436-
exports.INVALID_BSON_ERROR = INVALID_BSON_ERROR;
437-
exports.WRITE_CONCERN_ERROR = WRITE_CONCERN_ERROR;
438-
exports.MULTIPLE_ERROR = MULTIPLE_ERROR;
439-
exports.UNKNOWN_ERROR = UNKNOWN_ERROR;
440-
exports.INSERT = INSERT;
441-
exports.UPDATE = UPDATE;
442-
exports.REMOVE = REMOVE;
445+
module.exports = {
446+
Batch,
447+
BulkWriteError,
448+
BulkWriteResult,
449+
cloneOptions,
450+
handleMongoWriteConcernError,
451+
LegacyOp,
452+
mergeBatchResults,
453+
INVALID_BSON_ERROR: INVALID_BSON_ERROR,
454+
MULTIPLE_ERROR: MULTIPLE_ERROR,
455+
UNKNOWN_ERROR: UNKNOWN_ERROR,
456+
WRITE_CONCERN_ERROR: WRITE_CONCERN_ERROR,
457+
INSERT: INSERT,
458+
UPDATE: UPDATE,
459+
REMOVE: REMOVE,
460+
WriteError,
461+
WriteConcernError
462+
};

lib/bulk/ordered.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ const mergeBatchResults = common.mergeBatchResults;
1313
const executeOperation = utils.executeOperation;
1414
const BulkWriteError = require('./common').BulkWriteError;
1515
const applyWriteConcern = utils.applyWriteConcern;
16+
const MongoWriteConcernError = require('mongodb-core').MongoWriteConcernError;
17+
const handleMongoWriteConcernError = require('./common').handleMongoWriteConcernError;
1618

1719
var bson = new BSON([
1820
BSON.Binary,
@@ -436,15 +438,19 @@ var executeCommands = function(self, options, callback) {
436438

437439
var resultHandler = function(err, result) {
438440
// Error is a driver related error not a bulk op error, terminate
439-
if ((err && err.driver) || (err && err.message)) {
441+
if (((err && err.driver) || (err && err.message)) && !(err instanceof MongoWriteConcernError)) {
440442
return handleCallback(callback, err);
441443
}
442444

443445
// If we have and error
444446
if (err) err.ok = 0;
447+
if (err instanceof MongoWriteConcernError) {
448+
return handleMongoWriteConcernError(batch, self.s.bulkResult, true, err, callback);
449+
}
450+
445451
// Merge the results together
446-
var mergeResult = mergeBatchResults(true, batch, self.s.bulkResult, err, result);
447452
const writeResult = new BulkWriteResult(self.s.bulkResult);
453+
const mergeResult = mergeBatchResults(true, batch, self.s.bulkResult, err, result);
448454
if (mergeResult != null) {
449455
return handleCallback(callback, null, writeResult);
450456
}

lib/bulk/unordered.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ const mergeBatchResults = common.mergeBatchResults;
1313
const executeOperation = utils.executeOperation;
1414
const BulkWriteError = require('./common').BulkWriteError;
1515
const applyWriteConcern = utils.applyWriteConcern;
16+
const MongoWriteConcernError = require('mongodb-core').MongoWriteConcernError;
17+
const handleMongoWriteConcernError = require('./common').handleMongoWriteConcernError;
1618

1719
var bson = new BSON([
1820
BSON.Binary,
@@ -445,12 +447,15 @@ var executeBatch = function(self, batch, options, callback) {
445447

446448
var resultHandler = function(err, result) {
447449
// Error is a driver related error not a bulk op error, terminate
448-
if ((err && err.driver) || (err && err.message)) {
450+
if (((err && err.driver) || (err && err.message)) && !(err instanceof MongoWriteConcernError)) {
449451
return handleCallback(callback, err);
450452
}
451453

452454
// If we have and error
453455
if (err) err.ok = 0;
456+
if (err instanceof MongoWriteConcernError) {
457+
return handleMongoWriteConcernError(batch, self.s.bulkResult, false, err, callback);
458+
}
454459
handleCallback(callback, null, mergeBatchResults(false, batch, self.s.bulkResult, err, result));
455460
};
456461

0 commit comments

Comments
 (0)