-
Notifications
You must be signed in to change notification settings - Fork 29.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Request signal isn't aborted after garbage collection #55428
Comments
Therefore undici seems to be working properly? Since the parent AbortSignal is aborted, the dependent signal (ie. the one created for every instance of Request) can be garbage collected. |
@KhafraDev - I would expect the dependent signal to also be aborted after the parent signal is aborted & before it is garbage collected. Currently, the dependent signal seems to stop working when the request itself is garbage collected, not when its parent signal is garbage collected. Perhaps I'm missing something? |
Currently when a Request is collected, the signal is removed (see nodejs/undici#1113)
There is a bug here - we shouldn't be removing the signal if there are registered 'abort' event listeners. I will have a PR in a few hours unless the approach I'm thinking of doesn't work. |
I believe this is a bug in node - const ac = new AbortController();
ac.signal.addEventListener("abort", () => {
console.log("ac signal aborted");
});
const request = {
signal: (() => {
const ourAc = new AbortController()
ourAc.signal.addEventListener('abort', () => console.log('called'), { once: true })
return ourAc.signal
})()
}
request.signal.addEventListener("abort", () => {
console.log("request signal aborted");
});
setTimeout(() => {
global.gc();
ac.abort();
}, 0); Only |
cc @nodejs/web-standards |
transferred to node |
Bug Description
Passing a signal to Request() and aborting it does not cause the underlying request signal to be aborted after it's been garbage collected. This leads to issues where you want to listen on the request signal even after the request itself falls out of scope - e.g., the request is instantiated with an abort controller signal and downstream code is waiting for that signal to be aborted via
request.signal
.Reproducible By
Run the following using
node --expose-gc main.js
:Expected Behavior
ac signal aborted
andrequest signal aborted
should be logged to the console.Instead, only
ac signal aborted
is logged.Environment
Latest node and undici. Tried it in some older versions as well.
Additional context
A few folks are running into this while trying to close event stream requests in the remix web framework. The underlying requests are never closed because the signal doesn't get aborted.
The text was updated successfully, but these errors were encountered: