Skip to content

Commit 04e6ef6

Browse files
committed
fix(utils): fixes executeOperation to clean up sessions
Makes sure that, if an error is thrown before the async part of executeOperation, the implicit session is cleaned up Fixes NODE-1335
1 parent ac0dec7 commit 04e6ef6

1 file changed

Lines changed: 32 additions & 25 deletions

File tree

lib/utils.js

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -390,23 +390,37 @@ const executeOperation = (topology, operation, args, options) => {
390390
}
391391
}
392392

393-
// Execute using callback
394-
if (typeof callback === 'function') {
395-
callback = args.pop();
396-
args.push((err, result) => {
393+
const makeExecuteCallback = (resolve, reject) =>
394+
function executeCallback(err, result) {
397395
if (session && !options.returnsCursor) {
398396
session.endSession(() => {
399397
delete opOptions.session;
400-
if (err) return callback(err, null);
401-
return resultMutator ? callback(null, resultMutator(result)) : callback(null, result);
398+
if (err) return reject(err);
399+
if (resultMutator) return resolve(resultMutator(result));
400+
resolve(result);
402401
});
403402
} else {
404-
if (err) return callback(err, null);
405-
return resultMutator ? callback(null, resultMutator(result)) : callback(null, result);
403+
if (err) return reject(err);
404+
if (resultMutator) return resolve(resultMutator(result));
405+
resolve(result);
406406
}
407-
});
407+
};
408408

409-
return operation.apply(null, args);
409+
// Execute using callback
410+
if (typeof callback === 'function') {
411+
callback = args.pop();
412+
const handler = makeExecuteCallback(
413+
result => callback(null, result),
414+
err => callback(err, null)
415+
);
416+
args.push(handler);
417+
418+
try {
419+
return operation.apply(null, args);
420+
} catch (e) {
421+
handler(e);
422+
throw e;
423+
}
410424
}
411425

412426
// Return a Promise
@@ -415,22 +429,15 @@ const executeOperation = (topology, operation, args, options) => {
415429
}
416430

417431
return new Promise(function(resolve, reject) {
418-
args[args.length - 1] = (err, r) => {
419-
if (session && !options.returnsCursor) {
420-
session.endSession(() => {
421-
delete opOptions.session;
422-
if (err) return reject(err);
423-
if (resultMutator) return resolve(resultMutator(r));
424-
resolve(r);
425-
});
426-
} else {
427-
if (err) return reject(err);
428-
if (resultMutator) return resolve(resultMutator(r));
429-
resolve(r);
430-
}
431-
};
432+
const handler = makeExecuteCallback(resolve, reject);
433+
args[args.length - 1] = handler;
432434

433-
operation.apply(null, args);
435+
try {
436+
return operation.apply(null, args);
437+
} catch (e) {
438+
handler(e);
439+
throw e;
440+
}
434441
});
435442
};
436443

0 commit comments

Comments
 (0)