Skip to content

Commit

Permalink
timers: call destroy on interval error
Browse files Browse the repository at this point in the history
When an interval callback throws an error, the destroy
hook is never called due to a faulty if condition.

PR-URL: #20001
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
  • Loading branch information
apapirovski committed Apr 17, 2018
1 parent 734eb17 commit 4f2000f
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ function tryOnTimeout(timer, start) {
if (timerAsyncId !== null) {
if (!threw)
emitAfter(timerAsyncId);
if (!timer._repeat && destroyHooksExist() &&
if ((threw || !timer._repeat) && destroyHooksExist() &&
!timer._destroyed) {
emitDestroy(timerAsyncId);
timer._destroyed = true;
Expand Down
37 changes: 37 additions & 0 deletions test/async-hooks/test-timers.setInterval.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'use strict';

const common = require('../common');
const assert = require('assert');
const initHooks = require('./init-hooks');
const { checkInvocations } = require('./hook-checks');
const TIMEOUT = common.platformTimeout(100);

const hooks = initHooks();
hooks.enable();

setInterval(common.mustCall(ontimeout), TIMEOUT);
const as = hooks.activitiesOfTypes('Timeout');
assert.strictEqual(as.length, 1);
const t1 = as[0];
assert.strictEqual(t1.type, 'Timeout');
assert.strictEqual(typeof t1.uid, 'number');
assert.strictEqual(typeof t1.triggerAsyncId, 'number');
checkInvocations(t1, { init: 1 }, 't1: when timer installed');

function ontimeout() {
checkInvocations(t1, { init: 1, before: 1 }, 't1: when first timer fired');

throw new Error('setInterval Error');
}

process.once('uncaughtException', common.mustCall((err) => {
assert.strictEqual(err.message, 'setInterval Error');
}));

process.on('exit', () => {
hooks.disable();
hooks.sanityCheck('Timeout');

checkInvocations(t1, { init: 1, before: 1, after: 1, destroy: 1 },
't1: when process exits');
});

0 comments on commit 4f2000f

Please sign in to comment.