Skip to content

Commit bedc2d2

Browse files
daprahamianmbroadst
authored andcommitted
fix(bulk): make sure that any error in bulk write is propagated
* fix(bulk): make sure that any error in bulk write is propagaged Previously, errors that were not the last returned during a bulk write would be swallowed. Now, we return them. Fixes NODE-1702 * updating test name * fixing typo
1 parent 78e4c02 commit bedc2d2

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

lib/bulk/unordered.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,18 @@ function executeBatch(bulkOperation, batch, options, callback) {
172172
*/
173173
function executeBatches(bulkOperation, options, callback) {
174174
let numberOfCommandsToExecute = bulkOperation.s.batches.length;
175+
let hasErrored = false;
175176
// Execute over all the batches
176177
for (let i = 0; i < bulkOperation.s.batches.length; i++) {
177178
executeBatch(bulkOperation, bulkOperation.s.batches[i], options, function(err) {
179+
if (hasErrored) {
180+
return;
181+
}
182+
183+
if (err) {
184+
hasErrored = true;
185+
return handleCallback(callback, err);
186+
}
178187
// Count down the number of commands left to execute
179188
numberOfCommandsToExecute = numberOfCommandsToExecute - 1;
180189

test/unit/bulk_write_tests.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
'use strict';
2+
3+
const expect = require('chai').expect;
4+
const mock = require('mongodb-mock-server');
5+
6+
describe('Bulk Writes', function() {
7+
const test = {};
8+
9+
let documents;
10+
before(() => {
11+
documents = new Array(20000).fill('').map(() => ({
12+
arr: new Array(19).fill('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
13+
}));
14+
});
15+
16+
beforeEach(() => {
17+
return mock.createServer().then(server => {
18+
test.server = server;
19+
});
20+
});
21+
afterEach(() => mock.cleanup());
22+
23+
it('should propagate errors', function(done) {
24+
const client = this.configuration.newClient(`mongodb://${test.server.uri()}/test`);
25+
26+
let close = e => {
27+
close = () => {};
28+
client.close(() => done(e));
29+
};
30+
31+
let hasErrored = false;
32+
33+
test.server.setMessageHandler(request => {
34+
const doc = request.document;
35+
if (doc.ismaster) {
36+
request.reply(Object.assign({}, mock.DEFAULT_ISMASTER));
37+
} else if (doc.endSessions) {
38+
request.reply({ ok: 1 });
39+
} else if (doc.insert) {
40+
if (hasErrored) {
41+
return request.reply({ ok: 1 });
42+
}
43+
hasErrored = true;
44+
return request.reply({ ok: 0 });
45+
} else {
46+
close(`Received unknown command ${doc}`);
47+
}
48+
});
49+
50+
client.connect(function(err) {
51+
expect(err).to.be.null;
52+
53+
const coll = client.db('foo').collection('bar');
54+
55+
coll.insert(documents, { ordered: false }, function(err) {
56+
try {
57+
expect(err).to.be.an.instanceOf(Error);
58+
done();
59+
} catch (e) {
60+
done(e);
61+
}
62+
});
63+
});
64+
});
65+
});

0 commit comments

Comments
 (0)