From f285d11a8ef6d2119a0b8e0138a439ccd4c826be Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 10 May 2021 08:53:52 +0200 Subject: [PATCH] feat: cache precision per device See #103 --- lib/mtime-precision.js | 46 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/mtime-precision.js b/lib/mtime-precision.js index b82a3ce..8be61c0 100644 --- a/lib/mtime-precision.js +++ b/lib/mtime-precision.js @@ -3,40 +3,48 @@ const cacheSymbol = Symbol(); function probe(file, fs, callback) { - const cachedPrecision = fs[cacheSymbol]; + let cachedPrecisions = fs[cacheSymbol]; + if (cachedPrecisions === undefined) { + cachedPrecisions = new Map(); - if (cachedPrecision) { - return fs.stat(file, (err, stat) => { - /* istanbul ignore if */ - if (err) { - return callback(err); - } - - callback(null, stat.mtime, cachedPrecision); - }); + // Cache the precisions in a non-enumerable way + Object.defineProperty(fs, cacheSymbol, { value: cachedPrecisions }); } - // Set mtime by ceiling Date.now() to seconds + 5ms so that it's "not on the second" - const mtime = new Date((Math.ceil(Date.now() / 1000) * 1000) + 5); - - fs.utimes(file, mtime, mtime, (err) => { + return fs.stat(file, (err, stat) => { /* istanbul ignore if */ if (err) { return callback(err); } - fs.stat(file, (err, stat) => { + const dev = stat.dev; + + // Precisions are cached by device, see #103 + const precision = cachedPrecisions.get(dev); + if (precision !== undefined) { + return callback(null, stat.mtime, precision); + } + + // Set mtime by ceiling Date.now() to seconds + 5ms so that it's "not on the second" + const mtime = new Date((Math.ceil(Date.now() / 1000) * 1000) + 5); + + fs.utimes(file, mtime, mtime, (err) => { /* istanbul ignore if */ if (err) { return callback(err); } - const precision = stat.mtime.getTime() % 1000 === 0 ? 's' : 'ms'; + fs.stat(file, (err, stat) => { + /* istanbul ignore if */ + if (err) { + return callback(err); + } - // Cache the precision in a non-enumerable way - Object.defineProperty(fs, cacheSymbol, { value: precision }); + const precision = stat.mtime.getTime() % 1000 === 0 ? 's' : 'ms'; + cachedPrecisions.set(dev, precision); - callback(null, stat.mtime, precision); + callback(null, stat.mtime, precision); + }); }); }); }