`tsc --watch` in virtual machine fails with `fanotify_mark on '...' failed: invalid cross-device link` trying to watch parent directories

オープン 初心者向け
#65,290 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
62/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
linux, typescript

調査の方向性

障害は fanotify ウォッチャーの呼び出しに由来し、親ディレクトリ /home/michael/Sync/Projects に対して EXDEV を返します。報告者は inotify にフォールバックする既存のチェックをリンクしており、そこでも EXDEV を処理すれば直ると述べています。そのチェックと、それを呼び出すウォッチのセットアップから始めてください。virtiofs マウントをまたぐパスで tsc --watch を実行したときに、失敗せず inotify にフォールバックすること、そして既存のウォッチの動作のテストが引き続き通ることが完了条件です。

索引モデルが issue の本文から書いたものです。

説明

🔎 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.

主要言語
Go
スター
112k
フォーク
15.4k
平均マージ
3日 1時間
マージ済み PR(30日)
136

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

microsoft/TypeScript のほかの issue

microsoft/TypeScript の issue をすべて見る

似ている issue

Go の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。