From 0b88bbdeaaa62f51d5e2636f4cdf35b9e660091b Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 27 Nov 2019 10:16:36 -0500 Subject: [PATCH] fs: add ENFILE to rimraf retry logic Co-authored-by: Thang Tran Fixes: https://github.com/nodejs/node/issues/30482 Refs: https://github.com/nodejs/node/pull/30499 Refs: https://github.com/nodejs/node/issues/30580 PR-URL: https://github.com/nodejs/node/pull/30644 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- doc/api/fs.md | 34 +++++++++++++++++++--------------- lib/internal/fs/rimraf.js | 3 ++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/doc/api/fs.md b/doc/api/fs.md index d52fe47d0bbcc6..1d8508757b5c4f 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -3225,7 +3225,8 @@ changes: description: The `maxBusyTries` option is renamed to `maxRetries`, and its default is 0. The `emfileWait` option has been removed, and `EMFILE` errors use the same retry logic as other errors. The - `retryDelay` option is now supported. + `retryDelay` option is now supported. `ENFILE` errors are now + retried. - version: v12.10.0 pr-url: https://github.com/nodejs/node/pull/29168 description: The `recursive`, `maxBusyTries`, and `emfileWait` options are @@ -3248,11 +3249,11 @@ changes: * `path` {string|Buffer|URL} * `options` {Object} - * `maxRetries` {integer} If an `EBUSY`, `EMFILE`, `ENOTEMPTY`, or `EPERM` - error is encountered, Node.js will retry the operation with a linear backoff - wait of `retryDelay` ms longer on each try. This option represents the number - of retries. This option is ignored if the `recursive` option is not `true`. - **Default:** `0`. + * `maxRetries` {integer} If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + `EPERM` error is encountered, Node.js will retry the operation with a linear + backoff wait of `retryDelay` ms longer on each try. This option represents the + number of retries. This option is ignored if the `recursive` option is not + `true`. **Default:** `0`. * `recursive` {boolean} If `true`, perform a recursive directory removal. In recursive mode, errors are not reported if `path` does not exist, and operations are retried on failure. **Default:** `false`. @@ -3277,7 +3278,8 @@ changes: description: The `maxBusyTries` option is renamed to `maxRetries`, and its default is 0. The `emfileWait` option has been removed, and `EMFILE` errors use the same retry logic as other errors. The - `retryDelay` option is now supported. + `retryDelay` option is now supported. `ENFILE` errors are now + retried. - version: v12.10.0 pr-url: https://github.com/nodejs/node/pull/29168 description: The `recursive`, `maxBusyTries`, and `emfileWait` options are @@ -3292,8 +3294,9 @@ changes: * `path` {string|Buffer|URL} * `options` {Object} - * `maxRetries` {integer} If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error is - encountered, Node.js will retry the operation. This option represents the + * `maxRetries` {integer} If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + `EPERM` error is encountered, Node.js will retry the operation with a linear + backoff wait of `retryDelay` ms longer on each try. This option represents the number of retries. This option is ignored if the `recursive` option is not `true`. **Default:** `0`. * `recursive` {boolean} If `true`, perform a recursive directory removal. In @@ -5014,7 +5017,8 @@ changes: description: The `maxBusyTries` option is renamed to `maxRetries`, and its default is 0. The `emfileWait` option has been removed, and `EMFILE` errors use the same retry logic as other errors. The - `retryDelay` option is now supported. + `retryDelay` option is now supported. `ENFILE` errors are now + retried. - version: v12.10.0 pr-url: https://github.com/nodejs/node/pull/29168 description: The `recursive`, `maxBusyTries`, and `emfileWait` options are @@ -5025,11 +5029,11 @@ changes: * `path` {string|Buffer|URL} * `options` {Object} - * `maxRetries` {integer} If an `EBUSY`, `EMFILE`, `ENOTEMPTY`, or `EPERM` - error is encountered, Node.js will retry the operation with a linear backoff - wait of `retryDelay` ms longer on each try. This option represents the number - of retries. This option is ignored if the `recursive` option is not `true`. - **Default:** `0`. + * `maxRetries` {integer} If an `EBUSY`, `EMFILE`, `ENFILE`, `ENOTEMPTY`, or + `EPERM` error is encountered, Node.js will retry the operation with a linear + backoff wait of `retryDelay` ms longer on each try. This option represents the + number of retries. This option is ignored if the `recursive` option is not + `true`. **Default:** `0`. * `recursive` {boolean} If `true`, perform a recursive directory removal. In recursive mode, errors are not reported if `path` does not exist, and operations are retried on failure. **Default:** `false`. diff --git a/lib/internal/fs/rimraf.js b/lib/internal/fs/rimraf.js index 3212fdd539ed45..60310e1cf9427e 100644 --- a/lib/internal/fs/rimraf.js +++ b/lib/internal/fs/rimraf.js @@ -22,7 +22,8 @@ const { const { join } = require('path'); const { setTimeout } = require('timers'); const notEmptyErrorCodes = new Set(['ENOTEMPTY', 'EEXIST', 'EPERM']); -const retryErrorCodes = new Set(['EBUSY', 'EMFILE', 'ENOTEMPTY', 'EPERM']); +const retryErrorCodes = new Set( + ['EBUSY', 'EMFILE', 'ENFILE', 'ENOTEMPTY', 'EPERM']); const isWindows = process.platform === 'win32'; const epermHandler = isWindows ? fixWinEPERM : _rmdir; const epermHandlerSync = isWindows ? fixWinEPERMSync : _rmdirSync;