fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fs: fix close listener leak in FileHandle streams - #64227

Merged
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak
Aug 17, 2026
Merged

fs: fix close listener leak in FileHandle streams#64227
nodejs-github-bot merged 2 commits into
nodejs:mainfrom
Y1D7NG:fix-stream-leak

Conversation

@Y1D7NG

@Y1D7NGY1D7NG commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

fix: #64214

When autoClose is false, FileHandle.createReadStream registers a close listener on the handle. That listener is not removed after the stream finishes normally, so creating streams repeatedly on the same handle accumulates listeners.

In importFd, when autoClose is false, remove that listener and perform the corresponding unref cleanup when the stream ends (on end for read streams, on finish for write streams) or on error.

@nodejs-github-botnodejs-github-bot added fs Issues and PRs related to file-system APIs and the fs module. needs-ci PRs that need a full CI run. labels Jul 1, 2026
@Y1D7NG
Y1D7NGforce-pushed the fix-stream-leak branch 5 times, most recently from b433fb3 to c4a165aCompareJuly 1, 2026 11:11
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
Comment threadtest/parallel/test-fs-promises-file-handle-stream.js Outdated
Fixes: nodejs#64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
@Y1D7NG
Y1D7NG requested a review from davidje13July 1, 2026 16:33
@MikeMcC399MikeMcC399 added the review wanted PRs that need review. label Jul 29, 2026
@MikeMcC399MikeMcC399 added the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
Comment threadlib/internal/fs/streams.js
Comment on lines +159 to +165
function cleanup() {
options.fd.removeListener('close', onclose);
options.fd[kUnref]();
}
stream.once('end', cleanup);
stream.once('finish', cleanup);
stream.once('error', cleanup);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Y1D7NG should we removeListener for all 3 in cleanup, so we don't leave these hanging as well?

Suggested change
functioncleanup(){
options.fd.removeListener('close',onclose);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);
functioncleanup(){
options.fd.removeListener('close',onclose);
stream.removeListener('end',cleanup);
stream.removeListener('finish',cleanup);
stream.removeListener('error',cleanup);
options.fd[kUnref]();
}
stream.once('end',cleanup);
stream.once('finish',cleanup);
stream.once('error',cleanup);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I'm aware of for similar functions, it's common practice to (intentionally) leave these listeners dangling on the stream and rely on normal garbage collection to tidy it all up in the end.

There was some discussion on this stuff in #35452. In this case, the duplex stuff doesn't apply so I'd personally say it doesn't need the special handling that was eventually added there.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for bringing that, that's interesting. Unsure how to proceed then. @nodejs/streams is the current behavior as expected?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to be clear: in my comment I'm only talking about the events on the stream (end/finish/error) - removing the close listener from the file descriptor (i.e. the purpose of this PR) is definitely necessary.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are 2 approvals and a green CI.

Could this PR be landed, or does it need clarification of the above comments first?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My comments are non-blocking, although I don't see it hurting waiting extra time to get insights from the right team tho.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the listeners can be left to normal garbage collection

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After waiting 7 days there haven't been any further comments, or any blocking objections, so adding to commit queue.

@github-actionsgithub-actionsBot removed the request-ci Add this label to start a Jenkins CI on a PR. label Aug 9, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

This comment was marked as outdated.

@MikeMcC399MikeMcC399 removed the review wanted PRs that need review. label Aug 10, 2026
@nodejs-github-bot

This comment was marked as outdated.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@MikeMcC399MikeMcC399 added author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Aug 14, 2026
@MikeMcC399

This comment was marked as resolved.

@MikeMcC399MikeMcC399 added the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@nodejs-github-bot
nodejs-github-bot merged commit 8488e13 into nodejs:mainAug 17, 2026
86 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 8488e13

@nodejs-github-botnodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Aug 17, 2026
@ronag

Copy link
Copy Markdown
Member

This is broken and should be reverted. Will unref the handle multiple times.

@MikeMcC399

Copy link
Copy Markdown
Contributor

@ronag

This is broken and should be reverted. Will unref the handle multiple times.

That is very unfortunate 🙁 !

Would you want to initiate the revert? I'm not sure how best to handle this.

@MikeMcC399

Copy link
Copy Markdown
Contributor

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

@ovflowd

Copy link
Copy Markdown
Member
  • we can also add unit tests for this specific case.

@MikeMcC399

Copy link
Copy Markdown
Contributor

But for future reference, that's why we should wait for the subject matter experts to also approve

My mistake for not waiting long enough. Very sorry!

@atlowChemi

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

@MikeMcC399

MikeMcC399 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Revert PR is #65387, landed in 882a781

nodejs-github-bot pushed a commit that referenced this pull request Aug 19, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@ovflowd

Copy link
Copy Markdown
Member

I'll submit a revert PR, if the original approvers and @ronag would be so kind as to approve the revert as well.

I can approve. But for future reference, that's why we should wait for the subject matter experts to also approve. Even if that means the PR taking its due time to be merged.

In all fairness, it waited 7 days as required 🙂

Yeah, not assigning blame. After all I also approved the PR. But I feel that for such reasons waiting for more time till we get full confirmation could be helpful.

aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 25, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
Fixes: #64214
Signed-off-by: y1d7ng <y1d7ng@yeah.net>
PR-URL: #64227
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
aduh95 pushed a commit that referenced this pull request Aug 27, 2026
This reverts commit 8488e13.
It was advised that the fix in question is broken since
it will unref the handle multiple times.
Signed-off-by: Mike McCready <66998419+MikeMcC399@users.noreply.github.com>
PR-URL: #65387
Refs: #64227
Refs: #64214
Reviewed-By: Claudio Wunder <cwunder@gnome.org>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author readyPRs with CI started, the required approvals, and no outstanding review comments.commit-queue-squashPRs the Commit Queue should land as one squashed commit.fsIssues and PRs related to file-system APIs and the fs module.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close listener leak in fs/promises createReadStream

7 participants

@Y1D7NG@nodejs-github-bot@MikeMcC399@ronag@ovflowd@atlowChemi@davidje13