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

Aberta Para iniciantes
#65,290 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
62/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
linux, typescript

Direção de pesquisa

A falha vem da chamada ao watcher do fanotify, que retorna EXDEV no diretório pai /home/michael/Sync/Projects. O relator aponta uma verificação existente que recorre ao inotify e diz que tratar também EXDEV ali resolve o problema; comece por essa verificação e pela configuração do watch que a chama. Está pronto quando tsc --watch em um caminho que abrange montagens virtiofs recorre ao inotify em vez de falhar, e o comportamento atual do watch continua passando nos seus testes.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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

Linguagem predominante
Go
Estrelas
112k
Forks
15.4k
Merge médio
3d 1h
PRs com merge (30d)
136

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de microsoft/TypeScript

Todas as issues de microsoft/TypeScript

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.