| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
|
Review requested:
|
Sorry, something went wrong.
There was a problem hiding this comment.
I wanted to put this in the setTimeout but for some reason, the test-runner-output.mjs test failed for the describe_it file with some missing stack trace
Sorry, something went wrong.
There was a problem hiding this comment.
Done this to match the current behavior:
Line 48 in 78f6952
but we should align it with just using an abort signal with no timeout - no error being thrown or throw an abort error
Sorry, something went wrong.
There was a problem hiding this comment.
Could/Should this be an AbortSignal.any([signal, AbortSignal.timeout(timeout)]) etc?
Sorry, something went wrong.
There was a problem hiding this comment.
I don't think it would change anything as the timer won't get cleaned...
Sorry, something went wrong.
There was a problem hiding this comment.
What do you mean about the timer not getting clean?
The AbortSignal.any uses weak refs, so once this is GCed it would clear the timeout...
I think this suggestion could potentially reduce the complexity here, and also make it easier to land on v18, which doesn't have dispose & addAbortListener at the moment
WDYT?
Sorry, something went wrong.
There was a problem hiding this comment.
thank you! this is a much cleaner solution! the only problem here is that we create 2 new AbortSignal (AbortSignal.any and AbortSignal.timeout) for every describe/test/hook run, which can be bad for performance...
Sorry, something went wrong.
There was a problem hiding this comment.
@MoLow what do you think? should we remove the addAbortListener and dispose in order to support v18 and v16?
Sorry, something went wrong.
There was a problem hiding this comment.
I don't think this actually simplifies 😬
Sorry, something went wrong.
There was a problem hiding this comment.
@rluvaton I had something like this in mind:
function stopTest(timeout, signal) {
const timeoutSignal = timeout !== kDefaultTimeout && AbortSignal.timeout(timeout);
const composedSignal = AbortSignal.any([signal, timeoutSignal].filter(Boolean));
return PromisePrototypeThen(once(composedSignal, 'abort'), (e) => {
if (e.target.reason !== timeoutSignal.reason) {
return;
}
throw new ERR_TEST_FAILURE(
`test timed out after ${timeout}ms`,
kTestTimeoutFailure,
);
})
};But current solution works for me 🙂
Sorry, something went wrong.
There was a problem hiding this comment.
If we accept the extra creation of an abort signal I highly prefer that
Sorry, something went wrong.
There was a problem hiding this comment.
I assume we would want to profile both and decide based on that?
@MoLow @benjamingr what is your opinion here?
Sorry, something went wrong.
There was a problem hiding this comment.
I've created a benchmark PR and after it is merged we can check different solutions:
Sorry, something went wrong.
There was a problem hiding this comment.
What do you mean about the timer not getting clean?
The AbortSignal.any uses weak refs, so once this is GCed it would clear the timeout...
I think this suggestion could potentially reduce the complexity here, and also make it easier to land on v18, which doesn't have dispose & addAbortListener at the moment
WDYT?
Sorry, something went wrong.
Sorry, something went wrong.
|
@MoLow updated with your changes and modified to use ObjectDefineProperty |
Sorry, something went wrong.
There was a problem hiding this comment.
I don't like the promise+disposer in one object code pattern here + I don't like the explicit promise construction here.
We're core, we can "cheat", we can add the listener with [kWeakHandler]: test and it will cleanup the listener when the test is done.
Sorry, something went wrong.
to which listener? the abort listener? because using the aborted function from internal/abort_controller and passing the test as the resource did not work to clean up the abort listener |
Sorry, something went wrong.
|
The issue is the listener won't be removed right? kWeakListener means "remove the listener when that resource is gcd" |
Sorry, something went wrong.
|
(I removed the timeout support so I try to make it work for the simple case) I understand, but when I tried changing the stopTest function to using aborted (which under the hood use the kWeakHandler): const { aborted } = require('internal/abort_controller');
function stopTest(timeout, signal) {
return aborted(signal, {});
}The test I wrote: const { beforeEach, afterEach, test} = require("node:test");
beforeEach(() => {
global.gc();
});
afterEach(() => {
global.gc();
});
for (let i = 1; i <= 11; ++i) {
test(`${i}`, () => {
global.gc();
});
}it still log that: (node:60047) MaxListenersExceededWarning: Possible EventTarget memory leak detected. 11 abort listeners added to [AbortSignal]. Use events.setMaxListeners() to increase limit
at [kNewListener] (node:internal/event_target:542:17)
at [kNewListener] (node:internal/abort_controller:239:24)
at EventTarget.addEventListener (node:internal/event_target:655:23)
at node:internal/test_runner/test:85:12
at new Promise (<anonymous>)
at stopTest (node:internal/test_runner/test:84:10)
at TestHook.run (node:internal/test_runner/test:563:21)
at TestHook.run (node:internal/test_runner/test:772:18)
at node:internal/test_runner/test:519:20
at async Test.runHook (node:internal/test_runner/test:517:7)
also when doing this it had the same effect: function stopTest(timeout, signal) {
return new Promise((resolve) => {
signal.addEventListener('abort', resolve, { [kWeakHandler]: {} });
setImmediate(() => {
global.gc()
}).unref()
});
}Maybe I'm missing something? |
Sorry, something went wrong.
@rluvaton if we want to keep using the original signal we could keep updating kMaxEventTargetListeners, and since this AFAIK this signal is created internally we can probably safely assume we know how many listeners are being added... |
Sorry, something went wrong.
|
The problem is that we are not cleaning up the abort listener (see that it still happening even when we GC manually) |
Sorry, something went wrong.
|
The reason why the warning still printed was because of #48951 |
Sorry, something went wrong.
|
Due to fact, #48877 didn't land cleanly on v20.x-staging. This PR somehow, depends on it. So we'll need a manual backport. Reference: https://github.com/nodejs/node/blob/main/doc/contributing/backporting-to-release-lines.md |
Sorry, something went wrong.
Sorry, something went wrong.
fix nodejs#48475 PR-URL: nodejs#48915 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
no longer needed after nodejs#48915 fix PR-URL: nodejs#48989 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: nodejs#48915
There is an `if` statement that likely should have been an `else` in the original PR. Refs: #48915 PR-URL: #49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: #48915 PR-URL: #49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: #48915 PR-URL: #49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: nodejs#48915 PR-URL: nodejs#49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
fix #48475 PR-URL: nodejs/node#48915 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: nodejs/node#48915 PR-URL: nodejs/node#49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
fix #48475 PR-URL: nodejs/node#48915 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
There is an `if` statement that likely should have been an `else` in the original PR. Refs: nodejs/node#48915 PR-URL: nodejs/node#49943 Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Raz Luvaton <rluvaton@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name>
| Back | FazBrowse Home | New Git URL |
fix #48475