Repository navigation
Description
🔎 Search Terms
Hi,
I'm using TypeScript in a VM and TypeScript 7's fanotify-based watching consistently fails (and tsc doesn't watch at all as result).
Filesystems are mounted like this:
/storage type ext4
/ type overlay (rw,relatime,lowerdir+=/storage/...,upperdir=/storage/...,workdir=/storage/...,index=off)
/home/michael type virtiofs (rw,relatime)
/home/michael/Sync/Projects/test type virtiofs (rw,relatime)
🕗 Version & Regression Information
- This changed between versions 6.0.2 and 7.0.0
⏯ Playground Link
No response
💻 Code
n/a (doesn't depend on input file content)
I tried to include a reasonably small reproduction script, but it doesn't reproduce easily with loopback-mounted ext4, tmpfs, overlayfs or similar.
🙁 Actual behavior
$ node_modules/.bin/tsc --watch
[07:39:08 PM] Starting compilation in watch mode...
fanotify_mark on '/home/michael/Sync/Projects/test' failed: invalid cross-device link
(never updates when changing files)
🙂 Expected behavior
$ node_modules/.bin/tsc --watch
[07:39:08 PM] Starting compilation in watch mode...
(and updates when changing files)
Additional information about the issue
strace reveals a lot about what tsc is doing:
$ strace -f -e trace=fanotify_init,fanotify_mark ./node_modules/.bin/tsc --watch
[pid 7886] fanotify_init(FAN_CLASS_NOTIF|FAN_CLOEXEC|FAN_NONBLOCK|FAN_REPORT_FID|FAN_REPORT_DIR_FID|FAN_REPORT_NAME, O_RDONLY|O_CLOEXEC) = 7
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_REMOVE|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/@typescript") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/@typescript/typescript-linux-x64") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/@typescript/typescript-linux-x64/lib") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/bin") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/lib") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/api") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/api/async") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/api/sync") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/api/node") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/ast") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/enums") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/dist/internal") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc/lib") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc/lib/common") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc/lib/browser") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc/lib/node") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/typescript/vendor/vscode-jsonrpc/typings") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects/test/node_modules/.bin") = 0
[pid 7877] fanotify_mark(7, FAN_MARK_ADD|FAN_MARK_DONT_FOLLOW|FAN_MARK_ONLYDIR, FAN_MODIFY|FAN_CREATE|FAN_DELETE|FAN_DELETE_SELF|FAN_MOVE_SELF|FAN_EVENT_ON_CHILD|FAN_RENAME|FAN_ONDIR, AT_FDCWD, "/home/michael/Sync/Projects") = -1 EXDEV (Invalid cross-device link)
And it's trying to start watching all the parent directories above the project, too (and starting to fail there).
I looked for known issues and found the very similar #63646 (but that's already closed).
Instead of trying longer to find a small reproduction script that boots up a VM, I just tried out extending the existing check that triggers a fallback to inotify.
And 3.8 GiB disk space later I can confirm that just checking for EXDEV, too, fixes my issue and it works blazingly fast and smooth compared to pre-7.0.
Activity