Files
meteor/tools/fs
Ben Newman dea305ca4a Set a higher LRU cache size for makeCheapPathFunction entries.
In PR #10720, we introduced the makeCheapPathFunction in an effort to
reduce the caching overhead for very frequently called (and already pretty
quick) operations like files.stat.

However, the default maximum LRU cache size of Math.pow(2, 16) can cause
quite a bit of cache eviction churn for large applications, which @veered
has identified as a potential source of build performance problems.

By setting the maximum cache size to Math.pow(2, 20) instead, I am no
longer seeing any files.stat calls in the profiling output for rebuilding
a large internal app, saving several seconds of rebuild time. The obvious
downside is that this cache might accumulate more memory over time, which
is why I didn't just set the max to Infinity, though that might be a
viable option if the total set of paths ever stat'd is small enough to fit
into the available memory.

In the future, I hope to find ways of managing LRU cache size that respond
to actual memory pressure (relative to available memory), rather than
pruning the cache after an arbitrary numeric threshold is reached.
2019-11-05 11:19:43 -05:00
..
2019-07-04 14:43:51 -04:00

This folder contains modules that help communicating with the file-system.

files vs fs and files.path* vs path

Since the Meteor tool was originally written to work on Mac OS X and Linux but now is also required to work on Windows, there has been a decision to abstract the file-system calls to fs and path modules and make them go through the files.js lib.

All path and files manipulations in the tools code assumes it is running in a unixy environment, where the path separator is / and the default line-break symbol is \n; calls like rename and unlink are atomic and the file-system always works as you expect.

The files.js file tries its best to simulate this behavior on Windows, converting slashes, file contents and running FS operations in a "try/sleep/repeat" loop when an EBUSY error is returned. Operations on Windows happen to be slower, especially moving folders and symlinking (which is done by copying the directory instead).

It is advised to use files.readFile and others instead of fs.readFileSync. The methods are Fiberized and are converted on Windows.

Also files.pathJoin instead of path.join and others to properly preserve the unixy feel of paths: /C/Users/IEUser/AppData/Local instead of C:\Users\IEUser\AppData\Local.

File watching

Since node.js doesn't ship a stable library to watch a folder on all file-systems, a wrapper is used. The wrapper checks if the native functionality works, if not (while on Windows, or a virtualized shared file-system like in VirtualBox), polling is used.

Watchset

A specific data-structure that is a set of files and directories paths observed by the file-watcher.