computerd: writes applied over sync do not reach inotify watchers on the FUSE mount
Maintainer thường phản hồi trong vòng 1 ngày
@aron-cf đang làm issue này rồi.
Từ ngày 3/10/2026.
Đánh giá
Issue này chưa được đánh giá.
Mô tả
Describe the bug
When the host pushes a change to computerd, the entry is applied straight into the in-container VFS. Reads through the FUSE mount return the new bytes, but the kernel never sees an operation on the path, so no inotify event is emitted. File watchers inside the container (Vite/chokidar, astro dev, tsc --watch, node --watch) never notice the change.
The workflow this breaks: an agent edits files through workspace.fs (or the worker-shell backend) while a dev server runs in the container. Hot module replacement never fires, and new files are not picked up by the dev server's router until it restarts.
Writes made inside the container through the mount do emit events, because they go through the kernel.
Expected behavior
A change applied by the sync push handler is visible to inotify watchers on the mount, the same way a local write is, without syncing anything back to the host.
Steps to reproduce
computerd built from main (2f76387), FUSE_MOUNT=fuse, MOUNT_POINT=/workspace. The host side is driven by pushOnce, pullOnce and reconcileWatermarks from @cloudflare/computer-rpc/driver on a SQLiteTestStorage database, as in script/computerd-soak.mjs.
- Run
inotifywait -m -r /workspace, then write a file on the host andpushOnce. The file content is correct on the mount and no event is printed. A localecho hi > /workspace/xprints CREATE, MODIFY and CLOSE_WRITE. - Run
astro dev(Astro 7, Vite 8, chokidar 4) on a project in the mount, with an HMR WebSocket client connected. Push an edit tosrc/site.ts: no HMR message arrives and the page keeps serving the old content. - Push a new
src/pages/nova.astro:GET /novareturns 404.
Environment
@cloudflare/computer0.4.0,computerdfrommainat 2f76387- Linux x86_64 (kernel 6.18), Node 22, libfuse 2.9.9, real FUSE (
/dev/fuse) - Host side run locally with the sync driver; not yet reproduced on Cloudflare Containers
Proposed fix
Pass the applied paths to the existing afterApply hook, and in the real FUSE backend set the times of each applied path and its parent directory through the mount after the batch commits:
ServerOptions.afterApplybecomes(applied: { readonly paths: readonly string[] }) => void | Promise<void>. The shim'safterApplyignores the argument, so existing callers keep compiling.computerdregistersafterApply: ({ paths }) => announceAppliedPaths(paths)when FUSE is mounted.utimeson the file covers edits;utimeson the parent covers creates and deletes. ENOENT is ignored.- The FUSE
utimenshandler only records times in driver metadata, so the poke does not produce a VFS change and nothing syncs back.
The patch is about 30 lines in packages/rpc/src/server.ts and packages/computerd/src/cli/computerd.ts. I can share it as a diff or open a pull request if a maintainer asks for one.
Results with the patch
| Case | Without patch | With patch |
|---|---|---|
| Pushed edit to an imported module | no HMR, stale page | full-reload 25 ms after the push, page updated |
| Pushed new page | /nova returns 404 |
/nova returns 200 |
| Pull after the poke | 0 entries | 0 entries (no echo) |
tsc --noEmit for packages/rpc and packages/computerd reports the same pre-existing errors in test files before and after the change.
Compatibility and open questions
- The hook signature change is additive for implementers of
afterApply. - Large batches: touching every applied path may be worth bounding, for example to the parent directories once a batch passes some size.
- The touch sets the times to now. Using the VFS mtime instead would keep
statconsistent with what the host wrote. - A privileged Docker test in the style of
src/exec/runner.fuse.test.tscould runinotifywaitand assert an event after a push.
- Ngôn ngữ chính
- TypeScript
- Star
- 9.5k
- Fork
- 552
- Merge trung bình
- 2 ngày 6 giờ
- Pull request đã merge (30 ngày)
- 47
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của cloudflare/computer
-
Sync planning scans the full pending change set before yielding; repeated Durable Object CPU-limit failuresCó thể đã có người làm @aron-cf đã nhận 1 ngày trước. Đang mởbug
cloudflare/computer#225 · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
cloudflare/computer#224 · 5 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Always run the "next" computerd workflow on push to the `release` branchCó thể đã có người làm @aron-cf đã nhận 2 ngày trước. Đang mởbug
cloudflare/computer#222 · 2 bình luận · 1 reaction · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Make just-bash and acorn optional peer dependencies, pulled in only by the backend that needs themĐang mởenhancement
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 45/100
cloudflare/computer#220 · 3 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Workspace namespaces: more than one Workspace per Durable Object storageCó thể đã có người làm @aron-cf đã nhận 3 ngày trước. Đang mởenhancement
cloudflare/computer#219 · 1 bình luận · 1 reaction · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của cloudflare/computer
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
cline/mcp-marketplace#2932 ·
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
lingdojo/kana-dojo#32188 · 1 bình luận · 5 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Portkey-AI/gateway#1844 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
needs triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 61/100
rjsf-team/react-jsonschema-form#5495 ·
Maintainer thường phản hồi trong vòng 2 ngày