Partially consuming fs.ReadStream closes file handle despite `autoClose: false`
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 122k
- 派生
- 37.3k
- 平均合并
- 4 天 2 小时
- 30 天内合并 PR
- 283
描述
Version
v19.2.0, v14.21.1
Platform
Linux wolf-x1c6 5.15.0-53-generic #59-Ubuntu SMP Mon Oct 17 18:53:30 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
No response
What steps will reproduce the bug?
import fsPromises from 'node:fs/promises'
const fh = await fsPromises.open('example.txt')
fh.on('close', () => {throw new Error('handle closed!')})
const stream = fh.createReadStream({
autoClose: false,
})
for await (const chunk of stream) {
break
}
// Give the event loop a breather: this seems to be where the close happens
await new Promise(resolve => setTimeout(resolve, 10))
console.log('fd', fh.fd) // = -1; stream closed
How often does it reproduce? Is there a required condition?
Always
What is the expected behavior?
FileHandle.createReadStream({autoClose: false}) should result in the file handle not being automatically closed when the stream is destroyed.
What do you see instead?
Using fs.ReadStream[Symbol.asyncIterator] seems to unconditionally close the file handle (after a small delay; I guess at the end of the event loop or something? but haven't dug in; just noted the setTimeout above is necessary to reproduce) despite {autoClose: false} being passed to FileHandle.createReadStream().
This seems to be the result of the underlying readable.destroy() also closing the file handle; but it means that, as far as I can tell, there's no way to only partially consume an fs.ReadStream created from a file handle without either closing the handle or leaking the stream.
Additional information
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从提供的复现开始,跟踪部分异步迭代期间的 FileHandle.createReadStream()、fs.ReadStream[Symbol.asyncIterator] 和 readable.destroy()。确认尽管设置了 autoClose: false,文件句柄何时关闭,然后确保在跳出迭代后句柄仍保持打开状态,同时不泄漏 stream。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, nodejs
- 领域
- operating-systems
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100