Partially consuming fs.ReadStream closes file handle despite `autoClose: false`
Nessuno ha ancora preso questa issue.
- Lingua principale
- JavaScript
- Stelle
- 122k
- Fork
- 37.3k
- Merge medio
- 4g 2h
- PR unite (30g)
- 283
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con la riproduzione fornita e segui FileHandle.createReadStream(), fs.ReadStream[Symbol.asyncIterator] e readable.destroy() durante un’iterazione asincrona parziale. Verifica quando il file handle viene chiuso nonostante autoClose: false, quindi assicurati che l’handle rimanga aperto dopo l’interruzione dell’iterazione senza lasciare fuoriuscire lo stream.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, nodejs
- Ambito
- operating-systems
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 48/100