From: "Mattias Engdegård" <mattiase@acm.org>
To: Michael Albinus <michael.albinus@gmx.de>
Cc: 35418@debbugs.gnu.org
Subject: bug#35418: [PATCH] Don't poll auto-revert files that use notification
Date: Sat, 27 Apr 2019 18:19:36 +0200 [thread overview]
Message-ID: <DB035878-69EB-4006-A926-B703F0ABFCE0@acm.org> (raw)
In-Reply-To: <875zqzssql.fsf@gmx.de>
27 apr. 2019 kl. 11.27 skrev Michael Albinus <michael.albinus@gmx.de>:
>
> Well, in inotify you still get undesired notifications. Like this:
>
> --8<---------------cut here---------------start------------->8---
> (write-region "foo" nil "/tmp/foo")
> (add-name-to-file "/tmp/foo" "/tmp/bar" 'ok)
>
> (inotify-add-watch "/tmp/foo" t (lambda (event) (message "inotify %S" event)))
> => (1 . 0)
> (inotify-add-watch "/tmp/bar" t (lambda (event) (message "inotify %S" event)))
> => (1 . 1)
> (write-region "foo" nil "/tmp/foo")
> => inotify ((1 . 0) (modify) "/tmp/foo" 0)
> inotify ((1 . 1) (modify) "/tmp/bar" 0)
Thanks for the example!
I wouldn't call this undesired. Create a hard link to a file, ask for notification on both links, and then modify the file. Then both notifiers trigger, because someone has modified the file they were watching. The kqueue back-end behaves similarly.
> However, in filenotify this is fixed:
>
> --8<---------------cut here---------------start------------->8---
> (file-notify-add-watch "/tmp/foo" '(change attribute-change)
> (lambda (event) (message "file-notify %S" event)))
> => (2 . 0)
> (file-notify-add-watch "/tmp/bar" '(change attribute-change)
> (lambda (event) (message "file-notify %S" event)))
> => (2 . 1)
> (write-region "foo" nil "/tmp/foo")
> => file-notify ((2 . 0) changed "/tmp/foo")
> inotify ((1 . 0) (modify) "/tmp/foo" 0)
> inotify ((1 . 1) (modify) "/tmp/bar" 0)
Actually, it is (arguably) a bug. With two buffers referring to distinct hard links for the same file, surely we want a change in that file to trigger notification for both! (It's quite an exotic case, not the least because Emacs normally recognises hard links as if they were the same file name.)
However, with the kqueue back-end, file-notify watches do trigger for both, as expected.
The reason is that file-notify does not call inotify-add-watch on individual files, as in your example above, but on their containing directory ("/tmp" in your example). When monitoring a directory with two hard links to the same file, and the file is changed, inotify (sensibly) only reports a change to one of the links (the one employed for the change). Thus, the logic is in the Linux kernel, not in filenotify.
For kqueue it is different: here, changes to files are not reported when a watch is monitoring their directory, so filenotify.el sets kqueue watches on each file instead. The same could be done with inotify (and w32notify, if I read the code right), but watching directories has certain advantages.
> Unrelated events for "/tmp/bar" are filtered out in
> `file-notify-callback'. So yes, the inotify problems seem to be fixed.
Are you really sure that the inotify problems were really about changes to files with multiple hard links? It sounds very unlikely, and as showed above, the behaviour differs between back-ends.
If I were to guess, the problem was rather that the inotify back-end used to return the kernel-provided descriptor number, which is the same for the same directory: when /dir/a and /dir/b (distinct files, not hard links) both were watched, inotify would monitor /dir twice and give the same descriptor for both, with the ensuing chaos. This was subsequently fixed by making inotify return unique descriptors.
> We might extend this variable. *If* this regexp matches a file name, we
> know that we need polling. But it is clear, that we cannot catch all
> cases by just parsing file names.
>
> (Btw, we should use the value of `mounted-file-systems', introduced in
> Emacs 26.1, when initializing `auto-revert-notify-exclude-dir-regexp'.)
That variable contains "^//[^/]+/" on Windows, so we need to make up our minds about it.
> One alternative approach could be to analyze the file system device
> number, as returned by `file-attributes'. By this, we could detect
> mounted file systems.
Sort of; the interpretation is tricky, and as Eli commented, quite platform-specific.
> But I don't believe that this information is always trustworty, given it
> isn't used anywhere. And at least for remote files it doesn't tell you
> anything. Furthermore, mounted file systems are not the only reason that
> file notification doesn't work, and we need to poll.
What other reasons are you thinking about?
next prev parent reply other threads:[~2019-04-27 16:19 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-24 18:14 bug#35418: [PATCH] Don't poll auto-revert files that use notification Mattias Engdegård
2019-04-24 18:58 ` Eli Zaretskii
2019-04-24 19:36 ` Michael Albinus
2019-04-26 20:46 ` Mattias Engdegård
2019-04-27 9:40 ` Michael Albinus
2019-04-27 16:28 ` Mattias Engdegård
2019-04-25 9:56 ` Mattias Engdegård
2019-04-25 10:04 ` Eli Zaretskii
2019-04-25 18:07 ` Mattias Engdegård
2019-04-27 9:27 ` Michael Albinus
2019-04-27 9:54 ` Eli Zaretskii
2019-04-27 10:23 ` Michael Albinus
2019-04-27 16:19 ` Mattias Engdegård [this message]
2019-04-27 16:52 ` Eli Zaretskii
2019-04-28 10:21 ` Mattias Engdegård
2019-04-29 7:53 ` Michael Albinus
2019-04-29 11:06 ` Mattias Engdegård
2019-04-29 12:18 ` Michael Albinus
2019-04-29 16:24 ` Eli Zaretskii
2019-04-29 18:29 ` Mattias Engdegård
2019-04-29 20:17 ` Michael Albinus
2019-04-30 3:57 ` Eli Zaretskii
2019-04-30 11:41 ` Mattias Engdegård
2019-04-30 12:59 ` Michael Albinus
2019-04-30 13:56 ` Mattias Engdegård
2019-04-30 14:19 ` Michael Albinus
2019-04-29 16:23 ` Eli Zaretskii
2019-04-29 19:21 ` Mattias Engdegård
2019-04-29 19:56 ` Michael Albinus
2019-04-30 21:09 ` Mattias Engdegård
2019-05-01 17:45 ` Eli Zaretskii
2019-05-01 19:41 ` Mattias Engdegård
2019-05-02 12:18 ` Michael Albinus
2019-05-02 12:53 ` Mattias Engdegård
2019-05-02 13:02 ` Michael Albinus
2019-05-03 12:00 ` Mattias Engdegård
2019-05-03 13:44 ` Eli Zaretskii
2019-05-03 14:47 ` Mattias Engdegård
2019-05-04 9:04 ` Eli Zaretskii
2019-05-04 11:21 ` Mattias Engdegård
2019-05-04 13:41 ` Eli Zaretskii
2019-05-04 16:53 ` Michael Albinus
2019-05-04 17:08 ` Eli Zaretskii
2019-05-04 18:50 ` Mattias Engdegård
2019-05-04 19:43 ` Michael Albinus
2019-05-04 20:31 ` Michael Albinus
2019-05-04 20:46 ` Mattias Engdegård
2019-05-05 8:22 ` Michael Albinus
2019-05-05 9:58 ` Mattias Engdegård
2019-05-08 8:34 ` Mattias Engdegård
2019-05-08 8:47 ` Eli Zaretskii
2019-05-08 10:18 ` Mattias Engdegård
2019-05-08 10:58 ` Eli Zaretskii
2019-05-08 11:48 ` Mattias Engdegård
2019-05-08 12:35 ` Eli Zaretskii
2019-05-08 12:58 ` Mattias Engdegård
2019-05-08 13:09 ` Michael Albinus
2019-05-08 13:28 ` Eli Zaretskii
2019-05-08 14:13 ` Mattias Engdegård
2019-05-08 17:24 ` Eli Zaretskii
2019-05-08 18:17 ` Michael Albinus
2019-05-09 11:50 ` Michael Albinus
2019-05-10 15:22 ` Mattias Engdegård
2019-05-12 8:48 ` Michael Albinus
2019-05-12 19:49 ` Mattias Engdegård
2019-05-13 13:35 ` Michael Albinus
2019-05-14 12:41 ` Mattias Engdegård
2019-05-14 14:52 ` Michael Albinus
2019-05-08 10:23 ` Mattias Engdegård
2019-05-09 10:00 ` Mattias Engdegård
2019-05-09 10:48 ` Eli Zaretskii
2019-05-09 11:15 ` Mattias Engdegård
2019-05-10 9:49 ` Michael Albinus
2019-05-10 12:27 ` Mattias Engdegård
2019-05-10 12:43 ` Michael Albinus
2019-05-13 11:34 ` Mattias Engdegård
2019-05-13 15:08 ` Michael Albinus
2019-05-18 17:39 ` Mattias Engdegård
2019-05-19 9:12 ` Michael Albinus
2019-05-19 20:25 ` Mattias Engdegård
2019-05-20 7:30 ` Michael Albinus
2019-05-20 19:19 ` Mattias Engdegård
2019-04-29 7:19 ` Michael Albinus
2019-04-29 11:54 ` Mattias Engdegård
2019-04-29 12:26 ` Michael Albinus
2019-04-29 18:58 ` Mattias Engdegård
2019-04-29 20:04 ` Michael Albinus
2019-04-30 15:14 ` Eli Zaretskii
2019-04-24 19:59 ` Michael Albinus
2019-04-25 9:58 ` Mattias Engdegård
2019-04-25 11:04 ` Michael Albinus
2019-04-25 15:22 ` Mattias Engdegård
2019-04-30 1:03 ` Zhang Haijun
2019-04-30 7:06 ` Michael Albinus
2019-05-01 2:17 ` Zhang Haijun
2019-05-01 2:59 ` Zhang Haijun
2019-05-01 3:10 ` Zhang Haijun
2019-05-02 12:30 ` Michael Albinus
2019-05-02 13:24 ` Zhang Haijun
2019-05-02 12:28 ` Michael Albinus
2019-05-02 12:24 ` Michael Albinus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DB035878-69EB-4006-A926-B703F0ABFCE0@acm.org \
--to=mattiase@acm.org \
--cc=35418@debbugs.gnu.org \
--cc=michael.albinus@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).