From 44377738ef6b53607a7b17162aec984d5dcf7c58 Mon Sep 17 00:00:00 2001 From: nlf Date: Thu, 5 Aug 2021 13:30:42 -0700 Subject: [PATCH] graceful-fs@4.2.8 --- node_modules/graceful-fs/graceful-fs.js | 100 ++++++++++++++++++------ node_modules/graceful-fs/package.json | 2 +- package-lock.json | 14 ++-- package.json | 2 +- 4 files changed, 86 insertions(+), 32 deletions(-) diff --git a/node_modules/graceful-fs/graceful-fs.js b/node_modules/graceful-fs/graceful-fs.js index 1b0736c273f4..947cd94bb41b 100644 --- a/node_modules/graceful-fs/graceful-fs.js +++ b/node_modules/graceful-fs/graceful-fs.js @@ -54,7 +54,7 @@ if (!fs[gracefulQueue]) { return fs$close.call(fs, fd, function (err) { // This function uses the graceful-fs shared queue if (!err) { - retry() + resetQueue() } if (typeof cb === 'function') @@ -72,7 +72,7 @@ if (!fs[gracefulQueue]) { function closeSync (fd) { // This function uses the graceful-fs shared queue fs$closeSync.apply(fs, arguments) - retry() + resetQueue() } Object.defineProperty(closeSync, previousSymbol, { @@ -114,10 +114,10 @@ function patch (fs) { return go$readFile(path, options, cb) - function go$readFile (path, options, cb, attempts = 0) { + function go$readFile (path, options, cb, startTime) { return fs$readFile(path, options, function (err) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb], attempts + 1, err]) + enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()]) else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -134,10 +134,10 @@ function patch (fs) { return go$writeFile(path, data, options, cb) - function go$writeFile (path, data, options, cb, attempts = 0) { + function go$writeFile (path, data, options, cb, startTime) { return fs$writeFile(path, data, options, function (err) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb], attempts + 1, err]) + enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -155,10 +155,10 @@ function patch (fs) { return go$appendFile(path, data, options, cb) - function go$appendFile (path, data, options, cb, attempts = 0) { + function go$appendFile (path, data, options, cb, startTime) { return fs$appendFile(path, data, options, function (err) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb], attempts + 1, err]) + enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()]) else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -177,10 +177,10 @@ function patch (fs) { } return go$copyFile(src, dest, flags, cb) - function go$copyFile (src, dest, flags, cb, attempts = 0) { + function go$copyFile (src, dest, flags, cb, startTime) { return fs$copyFile(src, dest, flags, function (err) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$copyFile, [src, dest, flags, cb], attempts + 1, err]) + enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()]) else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -197,10 +197,10 @@ function patch (fs) { return go$readdir(path, options, cb) - function go$readdir (path, options, cb, attempts = 0) { + function go$readdir (path, options, cb, startTime) { return fs$readdir(path, options, function (err, files) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [path, options, cb], attempts + 1, err]) + enqueue([go$readdir, [path, options, cb], err, startTime || Date.now(), Date.now()]) else { if (files && files.sort) files.sort() @@ -334,10 +334,10 @@ function patch (fs) { return go$open(path, flags, mode, cb) - function go$open (path, flags, mode, cb, attempts = 0) { + function go$open (path, flags, mode, cb, startTime) { return fs$open(path, flags, mode, function (err, fd) { if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb], attempts + 1, err]) + enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()]) else { if (typeof cb === 'function') cb.apply(this, arguments) @@ -355,21 +355,75 @@ function enqueue (elem) { retry() } +// keep track of the timeout between retry() calls +var retryTimer + +// reset the startTime and lastTime to now +// this resets the start of the 60 second overall timeout as well as the +// delay between attempts so that we'll retry these jobs sooner +function resetQueue () { + var now = Date.now() + for (var i = 0; i < fs[gracefulQueue].length; ++i) { + // entries that are only a length of 2 are from an older version, don't + // bother modifying those since they'll be retried anyway. + if (fs[gracefulQueue][i].length > 2) { + fs[gracefulQueue][i][3] = now // startTime + fs[gracefulQueue][i][4] = now // lastTime + } + } + // call retry to make sure we're actively processing the queue + retry() +} + function retry () { + // clear the timer and remove it to help prevent unintended concurrency + clearTimeout(retryTimer) + retryTimer = undefined + if (fs[gracefulQueue].length === 0) return var elem = fs[gracefulQueue].shift() - if (elem) { - const [fn, args, attempts, err] = elem - if (attempts < 10) { - debug('RETRY', fn.name, args, `ATTEMPT #${attempts}`) - fn.call(null, ...args, attempts) + var fn = elem[0] + var args = elem[1] + // these items may be unset if they were added by an older graceful-fs + var err = elem[2] + var startTime = elem[3] + var lastTime = elem[4] + + // if we don't have a startTime we have no way of knowing if we've waited + // long enough, so go ahead and retry this item now + if (startTime === undefined) { + debug('RETRY', fn.name, args) + fn.apply(null, args) + } else if (Date.now() - startTime >= 60000) { + // it's been more than 60 seconds total, bail now + debug('TIMEOUT', fn.name, args) + var cb = args.pop() + if (typeof cb === 'function') + cb.call(null, err) + } else { + // the amount of time between the last attempt and right now + var sinceAttempt = Date.now() - lastTime + // the amount of time between when we first tried, and when we last tried + // rounded up to at least 1 + var sinceStart = Math.max(lastTime - startTime, 1) + // backoff. wait longer than the total time we've been retrying, but only + // up to a maximum of 100ms + var desiredDelay = Math.min(sinceStart * 1.2, 100) + // it's been long enough since the last retry, do it again + if (sinceAttempt >= desiredDelay) { + debug('RETRY', fn.name, args) + fn.apply(null, args.concat([startTime])) } else { - const cb = args.pop() - if (typeof cb === 'function') - cb.call(null, err) + // if we can't do this job yet, push it to the end of the queue + // and let the next iteration check again + fs[gracefulQueue].push(elem) } } - setImmediate(retry) + + // schedule our next run if one isn't already scheduled + if (retryTimer === undefined) { + retryTimer = setTimeout(retry, 0) + } } diff --git a/node_modules/graceful-fs/package.json b/node_modules/graceful-fs/package.json index accbf4c910bc..032c7d0b5844 100644 --- a/node_modules/graceful-fs/package.json +++ b/node_modules/graceful-fs/package.json @@ -1,7 +1,7 @@ { "name": "graceful-fs", "description": "A drop-in replacement for fs, making various improvements.", - "version": "4.2.7", + "version": "4.2.8", "repository": { "type": "git", "url": "https://github.com/isaacs/node-graceful-fs" diff --git a/package-lock.json b/package-lock.json index 3cd2c2c7f610..5c40822bd176 100644 --- a/package-lock.json +++ b/package-lock.json @@ -100,7 +100,7 @@ "cli-table3": "^0.6.0", "columnify": "~1.5.4", "glob": "^7.1.7", - "graceful-fs": "^4.2.7", + "graceful-fs": "^4.2.8", "hosted-git-info": "^4.0.2", "ini": "^2.0.0", "init-package-json": "^2.0.3", @@ -3465,9 +3465,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.7.tgz", - "integrity": "sha512-b1suB8r7mlSJQIBs6typf13fz55WYPeE7/KYlQUvqB7E3hUkXhz4D8FVHkENHTqG8+mD2yyT9HgT5bNkGNiqeQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "inBundle": true }, "node_modules/har-schema": { @@ -13040,9 +13040,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.7.tgz", - "integrity": "sha512-b1suB8r7mlSJQIBs6typf13fz55WYPeE7/KYlQUvqB7E3hUkXhz4D8FVHkENHTqG8+mD2yyT9HgT5bNkGNiqeQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "har-schema": { "version": "2.0.0", diff --git a/package.json b/package.json index 2bbfa3ad35b1..6bcdf732dffe 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "cli-table3": "^0.6.0", "columnify": "~1.5.4", "glob": "^7.1.7", - "graceful-fs": "^4.2.7", + "graceful-fs": "^4.2.8", "hosted-git-info": "^4.0.2", "ini": "^2.0.0", "init-package-json": "^2.0.3",