Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Infinite WRITE events when watching $TMPDIR on MacOS #600

Open
denandz opened this issue Jan 3, 2024 · 3 comments
Open

Infinite WRITE events when watching $TMPDIR on MacOS #600

denandz opened this issue Jan 3, 2024 · 3 comments
Labels
bug macOS need-feedback Requires feedback to be actionable

Comments

@denandz
Copy link

denandz commented Jan 3, 2024

Describe the bug

When watching $TMPDIR (/var/folders/[two chars]/[a bunch of chars]/T) on MacOS, and editing a file with VI, fsnotify ends up looping unlimited WRITE events with no file name.

To Reproduce

In one terminal, execute a watch on $TMPDIR using go run ./cmd/fsnotify/ watch $TMPDIR. In a seperate terminal, create a file with vi $TMPDIR/foo, type a single character and save. Saving is not strictly necessary for the loop to trigger. VI writing to the .swp file should trip the condition

doi@sjekira fsnotify % go run ./cmd/fsnotify/ watch $TMPDIR
21:30:54.1816 ready; press ^C to exit
21:30:56.5230   1 CREATE        "/var/folders/hm/d6kgq5lj1p90pskbf495f41c0000gn/T/.foo.swp"
21:30:56.5230   2 CREATE        "/var/folders/hm/d6kgq5lj1p90pskbf495f41c0000gn/T/6588a2e37cfc9"
21:30:57.8665   3 WRITE         "/var/folders/hm/d6kgq5lj1p90pskbf495f41c0000gn/T/.foo.swp"
21:30:57.8667   4 WRITE         ""
21:30:57.8669   5 WRITE         ""
21:30:57.8670   6 WRITE         ""
21:30:57.8671   7 WRITE         ""
21:30:57.8672   8 WRITE         ""
21:30:57.8673   9 WRITE         ""
... yoink ...
21:30:59.3423 89906 WRITE         ""
21:30:59.3424 89907 WRITE         ""
21:30:59.3424 89908 WRITE         ""
21:30:59.3424 89909 WRITE         ""
21:30:59.3424 89910 WRITE         ""

This condition seems to be limited to $TMPDIR with some preliminary testing. The same behaviour does not happen when using vi to edit a file in /private/tmp, for example:

doi@sjekira fsnotify % go run ./cmd/fsnotify/ watch /private/tmp     
21:34:06.7131 ready; press ^C to exit
21:34:17.5683   1 CREATE        "/private/tmp/.foo.swp"
21:34:19.7827   2 WRITE         "/private/tmp/.foo.swp"
21:34:19.7828   3 WRITE         "/private/tmp/.foo.swp"
21:34:19.7870   4 CHMOD         "/private/tmp/foo"
21:34:19.7871   5 WRITE         "/private/tmp/foo"
21:34:19.7898   6 CHMOD         "/private/tmp/foo"
21:34:25.7781   7 WRITE         "/private/tmp/.foo.swp"

Which operating system and version are you using?

ProductName:		macOS
ProductVersion:		13.6.1
BuildVersion:		22G313

M2 Macbook Air

Which fsnotify version are you using?

Main branch commit c94b93b

Did you try the latest main branch?

Yes

@arp242
Copy link
Member

arp242 commented Apr 3, 2024

I can't reproduce this, using c94b93b:

% print $TMPDIR
/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/

% vim $TMPDIR/x

% fsnotify watch $TMPDIR
14:50:08.3160 ready; press ^C to exit
14:50:19.6281   1 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/com.apple.appstoreagent"
14:50:20.5443   2 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/internal"
14:50:20.6040   3 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/com.apple.ap.promotedcontentd"
14:50:20.7930   4 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/analytics"
14:50:20.8633   5 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/journeys"
14:50:21.3953   6 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/recommendations"
14:50:40.6327   7 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/.x.swp"
14:50:41.2260   8 WRITE         "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/.x.swp"
14:50:42.1262   9 CREATE        "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/x"
14:50:42.1474  10 WRITE         "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/.x.swp"
14:50:46.1560  11 WRITE         "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/.x.swp"
14:50:46.1565  12 WRITE         "/var/folders/01/5qf4m0jn7rz_15kt2fm5p6g40000gn/T/.x.swp"

I used :set updatecount=1 to write the swap file more often, played around a bit – seems to be fine.

This is with pretty much default macOS and whatever it ships with that:

% sw_vers
ProductName:    macOS
ProductVersion: 12.5
BuildVersion:   21G72

And Vim 8.2.5032


That is the macOS 12.5 VM I had lying around. I also installed a macOS 13 VM; and using defaults for everything:

% sw_vers
ProductName:            macOS
ProductVersion:         13.6.6
BuildVersion:           22G630

% print $TMPDIR
/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/

% fsnotify watch $TMPDIR
15:43:27.5185 ready; press ^C to exit
15:44:04.3295   1 CREATE        "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.2241   2 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.2242   3 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.2653   4 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.4232   5 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.4246   6 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:09.5105   7 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.1504   8 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.3068   9 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.3068  10 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.4284  11 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.4682  12 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.6210  13 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.6472  14 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.7487  15 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.9113  16 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:11.9125  17 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.0303  18 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.0308  19 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.1684  20 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.1685  21 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.2284  22 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.2296  23 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.2494  24 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.2860  25 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:12.4250  26 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:16.4525  27 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:16.4526  28 WRITE         "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/.x.swp"
15:44:18.9608  29 CREATE        "/var/folders/r8/5kt_pnnd21d2fbhcpgrmhmw00000gn/T/x"

And again, all seems fine. Lots of updates because I set updatecount to 1 again, but seems to work fine. Tried a few times.

Using Vim 9.0.1991

@arp242
Copy link
Member

arp242 commented Apr 3, 2024

Also there is the test/kqueue.c program, which works identical to fsnotify, but is much more simple. Can you reproduce it with that? Or what does that output?

@arp242
Copy link
Member

arp242 commented Apr 28, 2024

Also with the main branch you can set the FSNOTIFY_DEBUG=1 environment variable to print more debug info.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug macOS need-feedback Requires feedback to be actionable
Projects
None yet
Development

No branches or pull requests

2 participants