Commit Graph

81 Commits

Author SHA1 Message Date
Ben Newman
e4c7b0890c Watch all imported files in linked npm packages on server. 2016-11-14 14:25:22 -05:00
Ben Newman
8d1133743d Fix options.transformFilename behavior in files.cp_r.
The options.transformFilename function is only supposed to transform
target file names, not the names of source files to be copied.

This behavior was broken by c5809a4a1c
between Meteor 1.4.0.1 and 1.4.1. Thank goodness for `git bisect`!

The biggest symptom of this mistake was that `meteor create --package`
no longer created files based on the ~fs-name~.js and ~fs-name~-tests.js
template files.

This probably merits a 1.4.1.4 release in addition to 1.4.2.2.
2016-11-14 11:50:50 -05:00
Ben Newman
a43d66991b Allow watch.sha1 to accept multiple arguments. 2016-11-08 13:48:23 -05:00
Ben Newman
a7ac32e00a Tolerate ENOENT errors in Builder#copyDirectory. 2016-11-08 13:33:20 -05:00
Ben Newman
909419b36e Optionally tolerate SyntaxError in optimisticReadJsonOrNull. 2016-11-02 13:04:09 -04:00
Ben Newman
ca4baed90a Disable yielding for files.* operations unless explicitly un-disabled.
Set METEOR_DISABLE_FS_FIBERS=false to un-disable files.* fibers if you
suspect this commit has introduced a problematic difference in behavior.

cc @veered
2016-10-31 21:33:39 -04:00
Ben Newman
f5c61de2fa Fix watching of @scoped, linked npm packages.
https://github.com/meteor/meteor/issues/7978#issuecomment-257056243

Part of #7978.
2016-10-31 12:38:59 -04:00
Ben Newman
bf5f635ac7 Remove optimisticIsSymbolicLink-specific logic from shouldWatch. 2016-10-28 18:16:09 -04:00
Ben Newman
45bb2898fa Watch all paths in linked npm packages.
Fixes #7978.
2016-10-28 17:55:58 -04:00
Ben Newman
45626b699b Support METEOR_DISABLE_FS_FIBERS to help @veered debug fiber storms. 2016-10-25 10:07:42 -07:00
Ben Newman
0d3c74d11c Only call watchersByIno.set(ino, entry) if ino > 0. 2016-10-21 21:39:39 -04:00
Ben Newman
35da19ab4e Avoid "The handle(...) returned by watching..." errors on Linux.
It's a shame that Pathwatcher issues this warning using console.error,
without taking any verbosity options into account:
https://github.com/atom/node-pathwatcher/blob/7ef76e5dfd/src/main.coffee#L53

Fortunately, I believe I've identified the underlying reason why this
happens, which may help resolve the following issue:
https://github.com/atom/node-pathwatcher/issues/98

If all goes well, I'll submit an upstream pull request.

I've also reinstated an old file watching test that I mistakenly removed
when I attempted to switch to chokidar instead of pathwatcher.
2016-10-21 21:14:44 -04:00
Ben Newman
48a2ccbde7 Dirty optimistic functions when node_modules directories change.
This is a bit different from the previous strategy of invalidating
optimistic functions for specific npm package names.

Now, whenever we make changes to the contents of a specific node_modules
directory, or whenever the developer independently modifies an app's
node_modules directory, all optimistic results derived from paths
contained within that node_modules directory will be marked as dirty, and
thus may need to be recomputed.

This strategy prioritizes starting fewer watchers (just one per
node_modules directory) while still allowing npm packages to be added or
removed while the app is running:

  https://github.com/meteor/meteor/pull/7668#issuecomment-255120373

The drawback is that changes within subdirectories of node_modules will
not be detected until the server is fully restarted, but that seems like
an acceptable tradeoff, since npm packages change much less often than
application code.
2016-10-21 20:06:23 -04:00
Ben Newman
e50d916709 Don't swallow JSON.parse SyntaxErrors in optimisticReadJsonOrNull. 2016-10-21 14:00:13 -04:00
Ben Newman
6c501b0148 Respect $METEOR_DISABLE_OPTIMISTIC_CACHING for debugging purposes. 2016-10-18 14:25:07 -04:00
Ben Newman
320874989f Implement and use optimisticReadJsonOrNull for better caching.
The problem with optimisticReadFile is that it doesn't cache anything when
the file is missing, because files.readFile throws an ENOENT exception.
2016-10-18 14:05:52 -04:00
Ben Newman
30d9a57f0d Allow dirtying optimistic functions by npm package name or path. 2016-10-18 13:26:06 -04:00
Ben Newman
ec34a4ecc6 Fix tests by making sure to close optimistic file watchers.
If a test process does not explicitly call process.exit, pathwatcher
watchers may keep it alive indefinitely (either that, or there's a bug
with the persistent:false option to fs.watchFile).

This accidental immortality can be prevented by explicitly closing all
watchers when we no longer have any interest in file change notifications.
2016-10-13 14:09:16 -04:00
Ben Newman
56de90e440 Switch back some optimistic functions in tools/fs/watch.js.
In particular, optimisticReaddir was getting called before relevant dirty
callbacks were firing, and thus failing to notice actual changes on the
file system.

In general, the tools/fs/watch.js code is the one place where we really
need an up-to-date view of the file system. Put another way, if optimistic
functions worked perfectly, we wouldn't need to rely so much on WatchSet
logic, but for now it's a balance of equally important strategies, and we
shouldn't be compromising one by intermingling it with the other.
2016-10-12 18:12:16 -04:00
Ben Newman
1d375ffb70 Hold off on using optimistic functions in watch.readAndWatchFileWithHash.
This partially reverts commit 96c95629eb.

When running `meteor update`, we call writeReleaseFileAndDevBundleLink
immediately before reading .meteor/release, so there's no time for a file
change notification to invalidate the cached contents of that file.

In the future, we could perhaps call optimisticReadFile.dirty(path) as a
consequence of files.writeFile(path, ...), but that may be tricky.
2016-10-11 11:25:36 -04:00
Ben Newman
b594b460a4 Go back to using pathwatcher.watch, with new rewatching logic.
Judging from the variety and extent of test failures, switching to
chokidar.watch was too drastic a change for this late-beta stage of the
release cycle.

The problem with pathwatcher.watch was that watches don't survive the
deletion of the watched file, because (like fs.watch) it watches files
based on inodes, not paths. This problem can be solved in a relatively
narrow way, by attempting to rewatch the file after any "delete" or
"rename" events.
2016-10-11 10:02:06 -04:00
Ben Newman
b814311266 Catch async chokidar.watch errors and suggest raising watch limit. 2016-10-10 17:39:17 -04:00
Ben Newman
0311e76673 Bring back fs.watchFile fallback when chokidar.watch fails.
Especially on Linux, chokidar.watch tends to throw ENOSPC errors when too
many files are being watched.

I removed this logic earlier because I thought chokidar could handle such
failures by itself, but that was wishful thinking.
2016-10-10 17:12:53 -04:00
Ben Newman
96c95629eb Use optimistic functions throughout tools/fs/watch.js. 2016-10-10 15:22:53 -04:00
Ben Newman
117b1a8525 Use chokidar for file watching instead of pathwatcher.
Healthy competition among fs.watch wrappers appears to have produced a
clear winner: https://www.npmjs.com/package/chokidar

This wrapper is better for Meteor than pathwatcher was, because it can
watch directory trees recursively, and it has no trouble watching
nonexistent file paths, whereas pathwatcher would throw an exception.
2016-10-10 14:12:51 -04:00
Ben Newman
1e5b414e48 Prepare for breaking API change affecting optimistic subscribe functions.
As of optimism@0.3.0, the value of `this` within subscribe functions is no
longer the optimistic wrapper function object (instead: null or global, as
if called with no receiver object), so we need to retain a reference to
the optimistic function so that the watcher can call .dirty(...args).
2016-10-10 11:47:19 -04:00
Ben Newman
d0f093413c Use optimisticStatOrNull in tools/fs/watch.js. 2016-10-03 22:19:13 -04:00
Ben Newman
23d62408b2 Use my optimism npm package to implement optimistic functions. 2016-10-03 17:32:10 -04:00
Ben Newman
bfa3eaa57d Use async rimraf as a fallback if rimraf.sync throws ENOTEMPTY.
This change preserves the performance benefits of my previous commit
5af59c58bc, since rimraf.sync is still
attempted first.
2016-09-29 19:25:32 -04:00
Ben Newman
9304f76b52 Fix tests by avoiding printing inotify warning when Console.isHeadless(). 2016-09-27 11:09:46 -04:00
Ben Newman
0d3466b882 Be more defensive when terminating watchers. 2016-09-27 10:41:40 -04:00
Ben Newman
ea92d83744 Don't cache exceptions in optimistic functions.
I originally added the exception-caching functionality in order to avoid
calling files.stat repeatedly for files known to be missing, but now that
we're using statOrNull, knowledge of missing files (as indicated by
statOrNull returning null) is being properly cached.

The reason it's dangerous to cache exceptions is that (for example) when
an ENOENT exception indicates the file is missing, there will be no more
change events for that file, effectively making the exception permanent,
even if the file comes to exist at a later time.
2016-09-27 10:13:19 -04:00
Ben Newman
c7b8b72e77 Never yield in files.symlink. 2016-09-26 20:04:30 -04:00
Ben Newman
5af59c58bc Always use rimraf.sync in files.rm_recursive. 2016-09-26 20:04:30 -04:00
Ben Newman
978df6e043 Use optimistic functions in meteorNpm.isPortable. 2016-09-26 20:04:29 -04:00
Ben Newman
d954415752 Add profiling to PathWatcher watch function. 2016-09-26 20:04:29 -04:00
Ben Newman
83e7b38779 Break circular dependency between {files,watch,optimistic}.js. 2016-09-26 20:04:28 -04:00
Ben Newman
033a935a89 Use optimistic functions to speed up IO-bound bottlenecks. 2016-09-26 20:04:28 -04:00
Ben Newman
6b320bd64b Avoid starting optimistic watchers for node_modules files.
I've also moved both try-catch blocks out of the optimistic wrapper
function in an effort to help V8 optimize the optimistic functions.
2016-09-26 20:04:28 -04:00
Ben Newman
ae7bd2e5af Ignore meaningless initial fs.watchFile callback.
As a reminder, we use fs.watchFile only as a fallback in environments
where pathwatcher.watch is not available, such as on network or virtual
file systems.
2016-09-26 19:59:40 -04:00
Ben Newman
37647c8657 Implement optimistic versions of heavily used files.* methods. 2016-09-26 18:29:08 -04:00
Ben Newman
26597c4fbb Simplify rehashing in safe-pathwatcher.js. 2016-09-26 15:58:13 -04:00
Ben Newman
1b25050aa8 Delay disposing of file watchers, in case acquireWatcher called again.
Typically all outstanding watchers will be closed when the development
server restarts, but we can save a lot of effort if they survive the
restart, for the small cost of keeping them open for an extra 30sec.
2016-09-15 19:44:00 -04:00
Ben Newman
d5f239e455 Use global file watching oracle to compute file hashes cheaply.
For the galaxy-server application, this reduces the time spent in
watch.isUpToDate from six seconds to a little over second. Of course we
should also try to call it less often, but making it cheaper helps!
2016-09-15 19:42:55 -04:00
Ben Newman
219b18168d Establish a global source of truth for file watching events.
This should not only reduce the total resource usage of the file watching
system, but pave the way for a faster implementation of watch.isUpToDate.
2016-09-15 19:34:57 -04:00
Ben Newman
d5c83aaf8f Don't try to use native tar command on Windows.
Fixes #7689.
2016-08-22 16:52:03 -04:00
Ben Newman
88bccdb36a Tolerate missing source files in files.cp_r. 2016-08-16 22:20:53 -04:00
Ben Newman
cc362a3bca Fix typo in new version of files.cp_r. 2016-08-16 18:34:25 -04:00
Ben Newman
c5809a4a1c Allow files.cp_r to copy non-directories. 2016-08-16 16:27:09 -04:00
Ben Newman
277fa504a7 Honor options.forceConvert in tryExtractWithNpmTar. 2016-07-28 13:58:16 -04:00