Node: fsPromises.truncate doesn't close fd.

Created on 4 Jul 2020  路  8Comments  路  Source: nodejs/node

  • Version: v12.18.1
  • Platform: Linux 5.4.0-37-generic #41-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
  • Subsystem:

What steps will reproduce the bug?

fsPromises.truncate(path) will result in a warning a few seconds later: (node:1387179) Warning: Closing file descriptor 22 on garbage collection - Using the callback truncate await new Promise((res, rej) => { fs.truncate(file, (err, ret) => { if(err) rej(err); else res(ret) }) }) works fine without such warning.

How often does it reproduce? Is there a required condition?

Every time.

What is the expected behavior?

Not having this warning.

What do you see instead?

Additional information

confirmed-bug fs v12.x

Most helpful comment

@richardlau ... yeah, I spotted that. This one commit is not semver-major. I'm working on a backport PR now for 12.x but github is giving me the Unicorn of Sadness at the moment. Will open as soon as the site becomes responsive again

All 8 comments

Could you show the code to reproduce?

I'm not able to reproduce. As an example:

$ node --expose_gc
> fs.promises.truncate('/tmp/x.txt').then(_ => gc())  // x.txt exists
Promise { <pending> }
> 

No warnings.

@sheepa I'm going to close this but I can reopen if you post steps to reproduce.

const fs = require('fs').promises

async function test()
{
  const file = '/tmp/x.txt'
  await fs.writeFile(file, 'data')
  await fs.truncate(file)
  gc()
}

test()

The following code give me (node:268029) Warning: Closing file descriptor 19 on garbage collection

@bnoordhuis... closing this was premature.

This is an issue that was fixed in master in eadc385 but it does not look like the fix was backported to 12.x yet. See... https://github.com/nodejs/node/blob/v12.x/lib/internal/fs/promises.js#L307-L309

C:\Users\jasne\Projects\tmp>node --expose-gc
Welcome to Node.js v12.18.0.
Type ".help" for more information.
> fs.promises.truncate('t.js').then(_ => gc())
Promise { <pending> }
> (node:23652) Warning: Closing file descriptor 4 on garbage collection

@sheepa ... I'll be opening a PR to backport the fix to 12.x soon but it will take a while for that to land in a release. You can work around the issue for now by using the ftruncate() method instead using the exact same pattern used in the fix:

async function myTruncate(path, len) {
  const fd = await open(path, 'r+');
  return ftruncate(fd, len).finally(fd.close.bind(fd));
}

This is an issue that was fixed in master in eadc385 but it does not look like the fix was backported to 12.x yet. See... https://github.com/nodejs/node/blob/v12.x/lib/internal/fs/promises.js#L307-L309

eadc385 references https://github.com/nodejs/node/pull/28858 as the PR and that's marked semver-major so it will be ignored by our tooling (e.g. branch-diff) and processes when evaluating what could be backported.

@richardlau ... yeah, I spotted that. This one commit is not semver-major. I'm working on a backport PR now for 12.x but github is giving me the Unicorn of Sadness at the moment. Will open as soon as the site becomes responsive again

PR opened!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Brekmister picture Brekmister  路  3Comments

dfahlander picture dfahlander  路  3Comments

mcollina picture mcollina  路  3Comments

srl295 picture srl295  路  3Comments

cong88 picture cong88  路  3Comments