Title: Inconsistent `retryDelay` in `fs.rmSync` and asynchronous `fs.rm` (on Windows) · Issue #64016 · nodejs/node · GitHub
Open Graph Title: Inconsistent `retryDelay` in `fs.rmSync` and asynchronous `fs.rm` (on Windows) · Issue #64016 · nodejs/node
X Title: Inconsistent `retryDelay` in `fs.rmSync` and asynchronous `fs.rm` (on Windows) · Issue #64016 · nodejs/node
Description: Version v24.17.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem fs What steps will reproduce the bug? The current workspace eperm-folder |---> locked-file.txt locking.py index.js locking.py import os, signal os.makedirs("eperm-...
Open Graph Description: Version v24.17.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem fs What steps will reproduce the bug? The current workspace eperm-folder |---> locked-file.txt locking.py index.js locking....
X Description: Version v24.17.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem fs What steps will reproduce the bug? The current workspace eperm-folder |---> locked-file.txt locking.py index.js locki...
Opengraph URL: https://github.com/nodejs/node/issues/64016
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Inconsistent `retryDelay` in `fs.rmSync` and asynchronous `fs.rm` (on Windows)","articleBody":"### Version\n\nv24.17.0\n\n### Platform\n\n```text\nMicrosoft Windows NT 10.0.26200.0 x64\n```\n\n### Subsystem\n\nfs\n\n### What steps will reproduce the bug?\n\nThe current workspace\n```\neperm-folder\n|---> locked-file.txt\nlocking.py\nindex.js\n```\n\n\u003cbr>\n\n`locking.py`\n```python\nimport os, signal\nos.makedirs(\"eperm-folder\", exist_ok=True)\n\nfilepath = \"eperm-folder/locked-file.txt\"\nprint(f\"locking {filepath} indefinitely, until SIGINT\")\nfd = os.open(filepath, os.O_RDWR | os.O_CREAT )\nos.write(fd, b'Hello, World!')\ndef sigterm_handler(s, f):\n os.close(fd)\n exit(0)\nsignal.signal(signal.SIGINT, sigterm_handler)\nwhile True:\n pass\n```\n\n`index.js`\n```js\nconst fs = require('node:fs');\nconst fsPromises = require('node:fs/promises');\nconst path = require('node:path')\nconst { spawn } = require('node:child_process')\nconst filepath = \"eperm-folder/locked-file.txt\"\nif (fs.existsSync(filepath)) {\n console.log('deleting eperm-folder/')\n const start = performance.now()\n try { \n fs.rmSync(path.dirname(filepath), { recursive: true, retryDelay: 5 * 1000, maxRetries: 1 })\n }\n catch (e){\n console.log(e)\n const duration = performance.now() - start;\n console.log(`rmSync - ${duration} ms`)\n }\n}\n```\n\n**Steps to run:**\n1. Run `python locking.py` first\n- this is to create `eperm-folder/locked-file.txt` and to indefinitely lock the file (simulating an `EPERM`/`EBUSY` error)\n\n2. Then run `node index.js`\n\n\n### How often does it reproduce? Is there a required condition?\n\nAlways, this is specific to Windows, and only when the file / directory is locked by another process.\n\n### What is the expected behavior? Why is that the expected behavior?\n\nThe time elapsed should be more than `5000ms` given it is our `retryDelay` value\n\nFor comparison, in the asynchronous `fs.rm` functions, the time elapsed is around `15,000ms` which is what we expect\n\nHere's a reproducible script for the asynchronous `fs.rm` functions\n```js\nconst fs = require('node:fs');\nconst fsPromises = require('node:fs/promises');\nconst path = require('node:path')\nconst filepath = \"eperm-folder/locked-file.txt\"\n\nif (fs.existsSync(filepath)) {\n console.log('deleting eperm-folder/')\n const start = performance.now()\n fs.rm(\n path.dirname(filepath), \n { recursive: true, retryDelay: 5 * 1000, maxRetries: 1 },\n (e) => {\n if (e)\n console.error(e)\n const duration = performance.now() - start;\n console.log(`async fs.rm() - ${duration} ms`)\n }\n )\n}\n```\n\nThis means that in the `fs.rmSync`, retries are not delayed\n\n### What do you see instead?\n\nThe time elapsed in the `fs.rmSync` operation is between `1-30 ms` (on my end)\n\n### Additional information\n\nThis affects other retryable errors in Windows (e.g., `EMFILE`, `ENFILE`, `ENOTEMPTY`)\nMight be related to https://github.com/nodejs/node/issues/55555, but this is Windows-specific\n\n","author":{"url":"https://github.com/louiellan","@type":"Person","name":"louiellan"},"datePublished":"2026-06-20T01:24:51Z","url":"https://github.com/nodejs/node/issues/64016"}
| react-profiling | 0 |
| react-import-map | react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf |
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:d8d784ee-dbb4-edf9-5209-9e4b5f92e9ce |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 870C:5463F:6424AB:877707:6AED250A |
| html-safe-nonce | 43ecbcb5aa821f670543444c81b05a1203f46be36dd5f070a0c6164ac1ab3934 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4NzBDOjU0NjNGOjY0MjRBQjo4Nzc3MDc6NkFFRDI1MEEiLCJ2aXNpdG9yX2lkIjoiMTkwMTQzMDk3MzQ3NTM5ODkyMiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | ad7bc43af08f88beb6e2d5431782d2c6bde13d62b2a639c91e9a6d307e5cd115 |
| hovercard-subject-tag | issue:4704601365 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/64016/issue_layout |
| twitter:image | https://opengraph.githubassets.com/d28f6c90718b837591bda1fb18ed203cdf7436354e0b7c2ac5a4d22a63b35779/nodejs/node/issues/64016 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/d28f6c90718b837591bda1fb18ed203cdf7436354e0b7c2ac5a4d22a63b35779/nodejs/node/issues/64016 |
| og:image:alt | Version v24.17.0 Platform Microsoft Windows NT 10.0.26200.0 x64 Subsystem fs What steps will reproduce the bug? The current workspace eperm-folder |---> locked-file.txt locking.py index.js locking.... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | louiellan |
| hostname | github.com |
| expected-hostname | github.com |
| None | e3e0f7f63e50c6fe879198a93a0a023a648ecc0a5e9bc3b5e033ac57172237e6 |
| turbo-cache-control | no-preview |
| go-import | github.com/nodejs/node git https://github.com/nodejs/node.git |
| octolytics-dimension-user_id | 9950313 |
| octolytics-dimension-user_login | nodejs |
| octolytics-dimension-repository_id | 27193779 |
| octolytics-dimension-repository_nwo | nodejs/node |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 27193779 |
| octolytics-dimension-repository_network_root_nwo | nodejs/node |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 707a24b346ac8a82878b9c084efaa38a997660cb |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
| react-app-name | issues |
Links:
Viewport: width=device-width