unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
@ 2020-11-14 16:54 Spencer Baugh
  2020-11-14 16:54 ` bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer Spencer Baugh
  2020-11-14 17:22 ` bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Eli Zaretskii
  0 siblings, 2 replies; 22+ messages in thread
From: Spencer Baugh @ 2020-11-14 16:54 UTC (permalink / raw)
  To: 44638; +Cc: Spencer Baugh

Previously, when enabling autorevert for a new buffer, we would search
the buffers already registered with autorevert to see if any of them
had the same filename.

This is very slow with a large number of buffers - with 1000, it takes
2 seconds on my system. This 2-second overhead is paid for every new
file opened.

But this is an unnecesary optimization; registering the same file
twice with file-notify has minimal or no overhead, depending on the
implementation.

In fact, file-notify has some baked-in overhead to support registering
the same file twice without problems. For example, inotify on Linux
returns the same inotify watch descriptor when the same file is
registered twice; file-notify adds an additional uniquifying id so
that all watch descriptors are unique in Emacs, even with inotify.

We can rely on file-notify's existing support for handling the same
file being registered twice. We don't need this slow and complex
logic.

With this code deleted, enabling autorevert for a new buffer is
essentially instant even with 1000 buffers.
---
 lisp/autorevert.el | 29 +++++++----------------------
 1 file changed, 7 insertions(+), 22 deletions(-)

diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 046ea2b5d6..d5bb75c2f1 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -650,30 +650,15 @@ will use an up-to-date value of `auto-revert-interval'."
               (string-match auto-revert-notify-exclude-dir-regexp
 			    (expand-file-name default-directory))
 	      (file-symlink-p (or buffer-file-name default-directory)))
-    ;; Check, whether this has been activated already.
     (let ((file (if buffer-file-name
 		    (expand-file-name buffer-file-name default-directory)
 	          (expand-file-name default-directory))))
-      (maphash
-       (lambda (key _value)
-         (when (and
-                (file-notify-valid-p key)
-                (equal (file-notify--watch-absolute-filename
-                        (gethash key file-notify-descriptors))
-                       (directory-file-name file))
-                (equal (file-notify--watch-callback
-                        (gethash key file-notify-descriptors))
-                       'auto-revert-notify-handler))
-         (setq auto-revert-notify-watch-descriptor key)))
-       auto-revert--buffers-by-watch-descriptor)
-      ;; Create a new watch if needed.
-      (unless auto-revert-notify-watch-descriptor
-        (setq auto-revert-notify-watch-descriptor
-	      (ignore-errors
-		(file-notify-add-watch
-		 file
-                 (if buffer-file-name '(change attribute-change) '(change))
-                 'auto-revert-notify-handler))))
+      (setq auto-revert-notify-watch-descriptor
+	    (ignore-errors
+	      (file-notify-add-watch
+	       file
+               (if buffer-file-name '(change attribute-change) '(change))
+               'auto-revert-notify-handler))))
       (when auto-revert-notify-watch-descriptor
         (setq auto-revert-notify-modified-p t)
         (puthash
@@ -682,7 +667,7 @@ will use an up-to-date value of `auto-revert-interval'."
 	       (gethash auto-revert-notify-watch-descriptor
 		        auto-revert--buffers-by-watch-descriptor))
          auto-revert--buffers-by-watch-descriptor)
-        (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t)))))
+        (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t))))
 
 ;; If we have file notifications, we want to update the auto-revert buffers
 ;; immediately when a notification occurs. Since file updates can happen very
-- 
2.28.0






^ permalink raw reply related	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2020-11-14 16:54 bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Spencer Baugh
@ 2020-11-14 16:54 ` Spencer Baugh
  2020-12-02 14:50   ` Michael Albinus
  2020-11-14 17:22 ` bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Eli Zaretskii
  1 sibling, 1 reply; 22+ messages in thread
From: Spencer Baugh @ 2020-11-14 16:54 UTC (permalink / raw)
  To: 44639; +Cc: Spencer Baugh

Now that we don't share watch descriptors between buffers, we don't
need to store a list of buffers for each watch descriptor - there
would only be a single buffer in each list. This should have no
functional change.
---
 lisp/autorevert.el | 30 +++++++++++-------------------
 1 file changed, 11 insertions(+), 19 deletions(-)

diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index d5bb75c2f1..ad39884ab0 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -355,10 +355,10 @@ the list of old buffers.")
 (add-hook 'after-set-visited-file-name-hook
           #'auto-revert-set-visited-file-name)
 
-(defvar auto-revert--buffers-by-watch-descriptor
+(defvar auto-revert--buffer-by-watch-descriptor
   (make-hash-table :test 'equal)
-  "A hash table mapping notification descriptors to lists of buffers.
-The buffers use that descriptor for auto-revert notifications.
+  "A hash table mapping notification descriptors to buffers.
+The buffer uses that descriptor for auto-revert notifications.
 The key is equal to `auto-revert-notify-watch-descriptor' in each
 buffer.")
 
@@ -631,12 +631,9 @@ will use an up-to-date value of `auto-revert-interval'."
 (defun auto-revert-notify-rm-watch ()
   "Disable file notification for current buffer's associated file."
   (let ((desc auto-revert-notify-watch-descriptor)
-        (table auto-revert--buffers-by-watch-descriptor))
+        (table auto-revert--buffer-by-watch-descriptor))
     (when desc
-      (let ((buffers (delq (current-buffer) (gethash desc table))))
-        (if buffers
-            (puthash desc buffers table)
-          (remhash desc table)))
+      (remhash desc table)
       (ignore-errors
 	(file-notify-rm-watch desc))
       (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t)))
@@ -663,10 +660,8 @@ will use an up-to-date value of `auto-revert-interval'."
         (setq auto-revert-notify-modified-p t)
         (puthash
          auto-revert-notify-watch-descriptor
-         (cons (current-buffer)
-	       (gethash auto-revert-notify-watch-descriptor
-		        auto-revert--buffers-by-watch-descriptor))
-         auto-revert--buffers-by-watch-descriptor)
+         (current-buffer)
+         auto-revert--buffer-by-watch-descriptor)
         (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t))))
 
 ;; If we have file notifications, we want to update the auto-revert buffers
@@ -696,8 +691,8 @@ system.")
 	   (action (nth 1 event))
 	   (file (nth 2 event))
 	   (file1 (nth 3 event)) ;; Target of `renamed'.
-	   (buffers (gethash descriptor
-			     auto-revert--buffers-by-watch-descriptor)))
+	   (buffer (gethash descriptor
+			    auto-revert--buffer-by-watch-descriptor)))
       ;; Check, that event is meant for us.
       (cl-assert descriptor)
       ;; Since we watch a directory, a file name must be returned.
@@ -708,7 +703,6 @@ system.")
 
       (if (eq action 'stopped)
           ;; File notification has stopped.  Continue with polling.
-          (cl-dolist (buffer buffers)
             (with-current-buffer buffer
               (when (or
                      ;; A buffer associated with a file.
@@ -721,10 +715,8 @@ system.")
                 (auto-revert-notify-rm-watch)
                 ;; Restart the timer if it wasn't running.
                 (unless auto-revert-timer
-                  (auto-revert-set-timer)))))
+                  (auto-revert-set-timer))))
 
-        ;; Loop over all buffers, in order to find the intended one.
-        (cl-dolist (buffer buffers)
           (when (buffer-live-p buffer)
             (with-current-buffer buffer
               (when (or
@@ -752,7 +744,7 @@ system.")
                   (setq auto-revert--lockout-timer
                         (run-with-timer
                          auto-revert--lockout-interval nil
-                         #'auto-revert--end-lockout buffer)))))))))))
+                         #'auto-revert--end-lockout buffer))))))))))
 
 (defun auto-revert--end-lockout (buffer)
   "End the lockout period after a notification.
-- 
2.28.0






^ permalink raw reply related	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-14 16:54 bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Spencer Baugh
  2020-11-14 16:54 ` bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer Spencer Baugh
@ 2020-11-14 17:22 ` Eli Zaretskii
  2020-11-14 21:19   ` Spencer Baugh
  1 sibling, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2020-11-14 17:22 UTC (permalink / raw)
  To: Spencer Baugh; +Cc: sbaugh, 44638

> From: Spencer Baugh <sbaugh@catern.com>
> Date: Sat, 14 Nov 2020 11:54:58 -0500
> Cc: Spencer Baugh <sbaugh@catern.com>
> 
> Previously, when enabling autorevert for a new buffer, we would search
> the buffers already registered with autorevert to see if any of them
> had the same filename.
> 
> This is very slow with a large number of buffers - with 1000, it takes
> 2 seconds on my system. This 2-second overhead is paid for every new
> file opened.
> 
> But this is an unnecesary optimization; registering the same file
> twice with file-notify has minimal or no overhead, depending on the
> implementation.

Emacs actually watches the file's directory, not the file itself.  The
directory is what's registered with inotify and other similar
backends.

> In fact, file-notify has some baked-in overhead to support registering
> the same file twice without problems. For example, inotify on Linux
> returns the same inotify watch descriptor when the same file is
> registered twice; file-notify adds an additional uniquifying id so
> that all watch descriptors are unique in Emacs, even with inotify.

Again, we watch the directory of the file, so what inotify does with
files is not really relevant, IMO.  I wonder what that means for the
changes you propose.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-14 17:22 ` bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Eli Zaretskii
@ 2020-11-14 21:19   ` Spencer Baugh
  2020-11-30 18:01     ` Spencer Baugh
  0 siblings, 1 reply; 22+ messages in thread
From: Spencer Baugh @ 2020-11-14 21:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 44638

Eli Zaretskii <eliz@gnu.org> writes:
>> From: Spencer Baugh <sbaugh@catern.com>
>> Date: Sat, 14 Nov 2020 11:54:58 -0500
>> Cc: Spencer Baugh <sbaugh@catern.com>
>> 
>> Previously, when enabling autorevert for a new buffer, we would search
>> the buffers already registered with autorevert to see if any of them
>> had the same filename.
>> 
>> This is very slow with a large number of buffers - with 1000, it takes
>> 2 seconds on my system. This 2-second overhead is paid for every new
>> file opened.
>> 
>> But this is an unnecesary optimization; registering the same file
>> twice with file-notify has minimal or no overhead, depending on the
>> implementation.
>
> Emacs actually watches the file's directory, not the file itself.  The
> directory is what's registered with inotify and other similar
> backends.
>
>> In fact, file-notify has some baked-in overhead to support registering
>> the same file twice without problems. For example, inotify on Linux
>> returns the same inotify watch descriptor when the same file is
>> registered twice; file-notify adds an additional uniquifying id so
>> that all watch descriptors are unique in Emacs, even with inotify.
>
> Again, we watch the directory of the file, so what inotify does with
> files is not really relevant, IMO.  I wonder what that means for the
> changes you propose.

Ah. Well, the inotify comment was just an example. Even given that Emacs
watches directories rather than files, I think this change is for the
best - the overhead of registering 5 files directly instead of 1
underlying directory is minimal.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-14 21:19   ` Spencer Baugh
@ 2020-11-30 18:01     ` Spencer Baugh
  2020-11-30 18:21       ` Eli Zaretskii
  0 siblings, 1 reply; 22+ messages in thread
From: Spencer Baugh @ 2020-11-30 18:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 44638

Spencer Baugh <sbaugh@catern.com> writes:
> Eli Zaretskii <eliz@gnu.org> writes:
>> Again, we watch the directory of the file, so what inotify does with
>> files is not really relevant, IMO.  I wonder what that means for the
>> changes you propose.
>
> Ah. Well, the inotify comment was just an example. Even given that Emacs
> watches directories rather than files, I think this change is for the
> best - the overhead of registering 5 files directly instead of 1
> underlying directory is minimal.

So does this kind of change still seem plausible?  Again, the overhead
of additional watches for the same file in the operating system is
minimal, and is rare anyway.

The alternative to this change is to add a new hash table to autorevert
which maps filenames to file-notify watches, so that autorevert can look
up duplicate watches efficiently in O(1) instead of iterating over all
watches in O(n) as it does now.

I started doing that originally, but concluded it was unnecessary since
sharing watches is unnecessary.  But it's a much smaller change to
behavior while still getting the same performance gain, so if you'd
prefer that, I can do it.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-30 18:01     ` Spencer Baugh
@ 2020-11-30 18:21       ` Eli Zaretskii
  2020-11-30 18:31         ` Michael Albinus
  0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2020-11-30 18:21 UTC (permalink / raw)
  To: Spencer Baugh; +Cc: 44638

> From: Spencer Baugh <sbaugh@catern.com>
> Cc: 44638@debbugs.gnu.org
> Date: Mon, 30 Nov 2020 13:01:43 -0500
> 
> Spencer Baugh <sbaugh@catern.com> writes:
> > Eli Zaretskii <eliz@gnu.org> writes:
> >> Again, we watch the directory of the file, so what inotify does with
> >> files is not really relevant, IMO.  I wonder what that means for the
> >> changes you propose.
> >
> > Ah. Well, the inotify comment was just an example. Even given that Emacs
> > watches directories rather than files, I think this change is for the
> > best - the overhead of registering 5 files directly instead of 1
> > underlying directory is minimal.
> 
> So does this kind of change still seem plausible?

I'd expect Michael Albinus to chime in on this, as autorevert is his
domain.  Michael?





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-30 18:21       ` Eli Zaretskii
@ 2020-11-30 18:31         ` Michael Albinus
  2020-12-01 20:16           ` Michael Albinus
  0 siblings, 1 reply; 22+ messages in thread
From: Michael Albinus @ 2020-11-30 18:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Spencer Baugh, 44638

Eli Zaretskii <eliz@gnu.org> writes:

>> So does this kind of change still seem plausible?
>
> I'd expect Michael Albinus to chime in on this, as autorevert is his
> domain.  Michael?

It's already on my todo list. Hmm, too much items there. I'll try to
find a sufficient time slot tomorrow.

Sorry for not being as responsive as I should :-(

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-11-30 18:31         ` Michael Albinus
@ 2020-12-01 20:16           ` Michael Albinus
  2020-12-02  3:20             ` Eli Zaretskii
  0 siblings, 1 reply; 22+ messages in thread
From: Michael Albinus @ 2020-12-01 20:16 UTC (permalink / raw)
  To: Spencer Baugh; +Cc: 44638

Michael Albinus <michael.albinus@gmx.de> writes:

> It's already on my todo list. Hmm, too much items there. I'll try to
> find a sufficient time slot tomorrow.

As expected, it takes more time. Currently I'm writing a test case which
covers the problem. This must run then for different backends with and
w/o your patch, at least inotify, gfilenotify and kqueue. If possible
also for w32notify.

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-01 20:16           ` Michael Albinus
@ 2020-12-02  3:20             ` Eli Zaretskii
  2020-12-02 15:17               ` Michael Albinus
  0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2020-12-02  3:20 UTC (permalink / raw)
  To: Michael Albinus; +Cc: sbaugh, 44638

> From: Michael Albinus <michael.albinus@gmx.de>
> Cc: Eli Zaretskii <eliz@gnu.org>,  44638@debbugs.gnu.org
> Date: Tue, 01 Dec 2020 21:16:25 +0100
> 
> Michael Albinus <michael.albinus@gmx.de> writes:
> 
> > It's already on my todo list. Hmm, too much items there. I'll try to
> > find a sufficient time slot tomorrow.
> 
> As expected, it takes more time. Currently I'm writing a test case which
> covers the problem. This must run then for different backends with and
> w/o your patch, at least inotify, gfilenotify and kqueue. If possible
> also for w32notify.

Thanks, let me know if I can help with the latter.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2020-11-14 16:54 ` bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer Spencer Baugh
@ 2020-12-02 14:50   ` Michael Albinus
  2021-01-27  3:59     ` Lars Ingebrigtsen
  0 siblings, 1 reply; 22+ messages in thread
From: Michael Albinus @ 2020-12-02 14:50 UTC (permalink / raw)
  To: Spencer Baugh; +Cc: 44639

Spencer Baugh <sbaugh@catern.com> writes:

> Now that we don't share watch descriptors between buffers, we don't
> need to store a list of buffers for each watch descriptor - there
> would only be a single buffer in each list. This should have no
> functional change.

Just for the records, when I apply both patches 1/2 and 2/2,
autorevert-tests fails. So it cannot be applied as such.

Using just patch 1/2 works for the inotify backend. I'll continue to
test. I recommend you to test also your patches by calling

$ make -C test autorevert-tests

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02  3:20             ` Eli Zaretskii
@ 2020-12-02 15:17               ` Michael Albinus
  2020-12-02 15:41                 ` Eli Zaretskii
  0 siblings, 1 reply; 22+ messages in thread
From: Michael Albinus @ 2020-12-02 15:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sbaugh, 44638

Eli Zaretskii <eliz@gnu.org> writes:

>> As expected, it takes more time. Currently I'm writing a test case which
>> covers the problem. This must run then for different backends with and
>> w/o your patch, at least inotify, gfilenotify and kqueue. If possible
>> also for w32notify.
>
> Thanks, let me know if I can help with the latter.

I've pushed a new test of autorevert-tests.el to master,
auto-revert-test07-auto-revert-several-buffers. It ought to cover the
scenario described in this report. It passes for me with the inotify,
gfilenotify and kqueue backends, which is fine. There are some problems
with remote backends (inotifywait and gio), but since there are also
problems with other tests, I wouldn't count on these failures for the
propsed patch.

Eli, could you run autorevert-test on MS Windows, for the w32notify
backend? Either a complete run, or just

$ make -C test autorevert-tests SELECTOR=auto-revert-test07-auto-revert-several-buffers

Thanks, and best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 15:17               ` Michael Albinus
@ 2020-12-02 15:41                 ` Eli Zaretskii
  2020-12-02 17:05                   ` Michael Albinus
  0 siblings, 1 reply; 22+ messages in thread
From: Eli Zaretskii @ 2020-12-02 15:41 UTC (permalink / raw)
  To: Michael Albinus; +Cc: sbaugh, 44638

> From: Michael Albinus <michael.albinus@gmx.de>
> Cc: sbaugh@catern.com,  44638@debbugs.gnu.org
> Date: Wed, 02 Dec 2020 16:17:01 +0100
> 
> Eli, could you run autorevert-test on MS Windows, for the w32notify
> backend? Either a complete run, or just
> 
> $ make -C test autorevert-tests SELECTOR=auto-revert-test07-auto-revert-several-buffers

auto-revert-test07-auto-revert-several-buffers succeeds.  Running the
entire test finds 2 failures:

  2 unexpected results:
     FAILED  auto-revert-test04-auto-revert-mode-dired
     FAILED  auto-revert-test05-global-notify

The evidence for the first failure is:

  Test auto-revert-test04-auto-revert-mode-dired condition:
      (ert-test-failed
       ((should-not
	 (string-match name
		       (substring-no-properties ...)))
	:form
	(string-match "auto-revert-testhf8BmX" "  c:/Documents and Settings/Zaretskii/Local Settings/Temp:\12  total used in directory 1178 available 46.5 GiB\12  drwxrwxrwx  1 Zaretskii None      0 2012-04-16  ..\12  drwxrwxrwx  1 Zaretskii None      0 12-02 17:35 .\12  drwxrwxrwx  1 Zaretskii None      0 09-25 21:47 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\12  drwxrwxrwx  1 Zaretskii None      0 12-01 17:26 acrord32_sbx\12  -rw-rw-rw-  1 Zaretskii None  38296 12...(the rest elided)

Not sure what that means.

The second test fails because:

  Test auto-revert-test05-global-notify condition:
      (ert-test-failed
       ((should
	 (buffer-local-value 'auto-revert-notify-watch-descriptor buf-1))
	:form
	(buffer-local-value auto-revert-notify-watch-descriptor #<killed buffer>)
	:value nil))

Let me know if I can help you more.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 15:41                 ` Eli Zaretskii
@ 2020-12-02 17:05                   ` Michael Albinus
  2020-12-02 17:13                     ` Eli Zaretskii
  0 siblings, 1 reply; 22+ messages in thread
From: Michael Albinus @ 2020-12-02 17:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sbaugh, 44638

Eli Zaretskii <eliz@gnu.org> writes:

Hi Eli,

>> Eli, could you run autorevert-test on MS Windows, for the w32notify
>> backend? Either a complete run, or just
>>
>> $ make -C test autorevert-tests
>> SELECTOR=auto-revert-test07-auto-revert-several-buffers
>
> auto-revert-test07-auto-revert-several-buffers succeeds.  Running the
> entire test finds 2 failures:
>
>   2 unexpected results:
>      FAILED  auto-revert-test04-auto-revert-mode-dired
>      FAILED  auto-revert-test05-global-notify
>
> Let me know if I can help you more.

Well, if the same errors happen also w/o that patch, I believe we are
safe to install the patch in master.

In general, I need to debug what happens, the ert reports are not
sufficient (for me) to understand what's going wrong. Do you know how to
get an MS Windows VM instance? I would be even willing to pay for a
license.

I have a spare server which runs already VMs, like the FreeBSD instance
I've just taken for the kqueue tests.

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 17:05                   ` Michael Albinus
@ 2020-12-02 17:13                     ` Eli Zaretskii
  2020-12-02 17:20                       ` Michael Albinus
  2020-12-02 17:46                       ` Dmitry Gutov
  0 siblings, 2 replies; 22+ messages in thread
From: Eli Zaretskii @ 2020-12-02 17:13 UTC (permalink / raw)
  To: Michael Albinus; +Cc: sbaugh, 44638

> From: Michael Albinus <michael.albinus@gmx.de>
> Cc: sbaugh@catern.com,  44638@debbugs.gnu.org
> Date: Wed, 02 Dec 2020 18:05:35 +0100
> 
> > auto-revert-test07-auto-revert-several-buffers succeeds.  Running the
> > entire test finds 2 failures:
> >
> >   2 unexpected results:
> >      FAILED  auto-revert-test04-auto-revert-mode-dired
> >      FAILED  auto-revert-test05-global-notify
> >
> > Let me know if I can help you more.
> 
> Well, if the same errors happen also w/o that patch, I believe we are
> safe to install the patch in master.

Yes, I think those tests always failed for me.

> In general, I need to debug what happens, the ert reports are not
> sufficient (for me) to understand what's going wrong. Do you know how to
> get an MS Windows VM instance? I would be even willing to pay for a
> license.

Sorry, I don't know.  maybe someone else here does.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 17:13                     ` Eli Zaretskii
@ 2020-12-02 17:20                       ` Michael Albinus
  2020-12-02 17:43                         ` Eli Zaretskii
  2020-12-03 15:01                         ` Michael Albinus
  2020-12-02 17:46                       ` Dmitry Gutov
  1 sibling, 2 replies; 22+ messages in thread
From: Michael Albinus @ 2020-12-02 17:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sbaugh, 44638

Eli Zaretskii <eliz@gnu.org> writes:

>> > auto-revert-test07-auto-revert-several-buffers succeeds.  Running the
>> > entire test finds 2 failures:
>> >
>> >   2 unexpected results:
>> >      FAILED  auto-revert-test04-auto-revert-mode-dired
>> >      FAILED  auto-revert-test05-global-notify
>> >
>> > Let me know if I can help you more.
>>
>> Well, if the same errors happen also w/o that patch, I believe we are
>> safe to install the patch in master.
>
> Yes, I think those tests always failed for me.

Good, so I will install patch 1/2 in master. Likely tomorrow.

>> In general, I need to debug what happens, the ert reports are not
>> sufficient (for me) to understand what's going wrong. Do you know how to
>> get an MS Windows VM instance? I would be even willing to pay for a
>> license.
>
> Sorry, I don't know.  maybe someone else here does.

Hmm. What would be the canonical address to ask Microsoft directly?

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 17:20                       ` Michael Albinus
@ 2020-12-02 17:43                         ` Eli Zaretskii
  2020-12-03 15:01                         ` Michael Albinus
  1 sibling, 0 replies; 22+ messages in thread
From: Eli Zaretskii @ 2020-12-02 17:43 UTC (permalink / raw)
  To: Michael Albinus; +Cc: sbaugh, 44638

> From: Michael Albinus <michael.albinus@gmx.de>
> Cc: sbaugh@catern.com,  44638@debbugs.gnu.org
> Date: Wed, 02 Dec 2020 18:20:01 +0100
> 
> >> Do you know how to get an MS Windows VM instance? I would be even
> >> willing to pay for a license.
> >
> > Sorry, I don't know.  maybe someone else here does.
> 
> Hmm. What would be the canonical address to ask Microsoft directly?

Does the below help?

  https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
  https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/
  https://www.extremetech.com/computing/198427-how-to-install-windows-10-in-a-virtual-machine
  https://superuser.com/questions/961322/find-a-windows-10-iso-to-install-it-in-a-virtual-machine





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 17:13                     ` Eli Zaretskii
  2020-12-02 17:20                       ` Michael Albinus
@ 2020-12-02 17:46                       ` Dmitry Gutov
  1 sibling, 0 replies; 22+ messages in thread
From: Dmitry Gutov @ 2020-12-02 17:46 UTC (permalink / raw)
  To: Eli Zaretskii, Michael Albinus; +Cc: sbaugh, 44638

On 02.12.2020 19:13, Eli Zaretskii wrote:
>> In general, I need to debug what happens, the ert reports are not
>> sufficient (for me) to understand what's going wrong. Do you know how to
>> get an MS Windows VM instance? I would be even willing to pay for a
>> license.
> Sorry, I don't know.  maybe someone else here does.

Check out one of these:

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/

These are distributed explicitly for development and testing. They are 
free, but with an expiration date that's fairly close.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors
  2020-12-02 17:20                       ` Michael Albinus
  2020-12-02 17:43                         ` Eli Zaretskii
@ 2020-12-03 15:01                         ` Michael Albinus
  1 sibling, 0 replies; 22+ messages in thread
From: Michael Albinus @ 2020-12-03 15:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: sbaugh, 44638-done

Michael Albinus <michael.albinus@gmx.de> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> > auto-revert-test07-auto-revert-several-buffers succeeds.  Running the
>>> > entire test finds 2 failures:
>>> >
>>> >   2 unexpected results:
>>> >      FAILED  auto-revert-test04-auto-revert-mode-dired
>>> >      FAILED  auto-revert-test05-global-notify
>>> >
>>> > Let me know if I can help you more.
>>>
>>> Well, if the same errors happen also w/o that patch, I believe we are
>>> safe to install the patch in master.
>>
>> Yes, I think those tests always failed for me.
>
> Good, so I will install patch 1/2 in master. Likely tomorrow.

Done, closing the bug.

Best regards, Michael.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2020-12-02 14:50   ` Michael Albinus
@ 2021-01-27  3:59     ` Lars Ingebrigtsen
  2021-01-27 16:34       ` Spencer Baugh
  0 siblings, 1 reply; 22+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-27  3:59 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Spencer Baugh, 44639

Michael Albinus <michael.albinus@gmx.de> writes:

> Spencer Baugh <sbaugh@catern.com> writes:
>
>> Now that we don't share watch descriptors between buffers, we don't
>> need to store a list of buffers for each watch descriptor - there
>> would only be a single buffer in each list. This should have no
>> functional change.
>
> Just for the records, when I apply both patches 1/2 and 2/2,
> autorevert-tests fails. So it cannot be applied as such.

Spencer, did you do any further work on this patch?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2021-01-27  3:59     ` Lars Ingebrigtsen
@ 2021-01-27 16:34       ` Spencer Baugh
  2021-01-28  3:29         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 22+ messages in thread
From: Spencer Baugh @ 2021-01-27 16:34 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Michael Albinus; +Cc: 44639


Lars Ingebrigtsen <larsi@gnus.org> writes:
> Michael Albinus <michael.albinus@gmx.de> writes:
>
>> Spencer Baugh <sbaugh@catern.com> writes:
>>
>>> Now that we don't share watch descriptors between buffers, we don't
>>> need to store a list of buffers for each watch descriptor - there
>>> would only be a single buffer in each list. This should have no
>>> functional change.
>>
>> Just for the records, when I apply both patches 1/2 and 2/2,
>> autorevert-tests fails. So it cannot be applied as such.
>
> Spencer, did you do any further work on this patch?

Not this patch, no.  Locally I have applied patch 1/2 and not patch
2/2. Patch 2/2 just removes dead code after patch 1/2 removes the
functionality, and I must have gotten it wrong.

But I can report that performance has been fine with patch 1/2 - I
haven't seen the pathological case I was seeing before, and I haven't
seen any new pathological cases to replace it.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2021-01-27 16:34       ` Spencer Baugh
@ 2021-01-28  3:29         ` Lars Ingebrigtsen
  2021-01-28 14:19           ` Michael Albinus
  0 siblings, 1 reply; 22+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-28  3:29 UTC (permalink / raw)
  To: Spencer Baugh; +Cc: Michael Albinus, 44639

Spencer Baugh <sbaugh@catern.com> writes:

>>> Just for the records, when I apply both patches 1/2 and 2/2,
>>> autorevert-tests fails. So it cannot be applied as such.
>>
>> Spencer, did you do any further work on this patch?
>
> Not this patch, no.  Locally I have applied patch 1/2 and not patch
> 2/2. Patch 2/2 just removes dead code after patch 1/2 removes the
> functionality, and I must have gotten it wrong.
>
> But I can report that performance has been fine with patch 1/2 - I
> haven't seen the pathological case I was seeing before, and I haven't
> seen any new pathological cases to replace it.

Patch 1/2 was applied to Emacs 28 some time ago (and works fine), so
this was just a followup on 2/2 -- whether this clean-up patch (which
apparently doesn't work correctly, according to Michael) is going to get
any further work done, or whether this issue should just be closed...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 22+ messages in thread

* bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer
  2021-01-28  3:29         ` Lars Ingebrigtsen
@ 2021-01-28 14:19           ` Michael Albinus
  0 siblings, 0 replies; 22+ messages in thread
From: Michael Albinus @ 2021-01-28 14:19 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Spencer Baugh, 44639-done

[-- Attachment #1: Type: text/plain, Size: 617 bytes --]

Lars Ingebrigtsen <larsi@gnus.org> writes:

Hi,

> Patch 1/2 was applied to Emacs 28 some time ago (and works fine), so
> this was just a followup on 2/2 -- whether this clean-up patch (which
> apparently doesn't work correctly, according to Michael) is going to get
> any further work done, or whether this issue should just be closed...

I've reworked the patch, using an association list instead of a hash
table. By this, I've fixed also the error which was always evident, but
uncovered only by Spencer's patch.

Pushed to master, I'm closing the bug. The patch itself is appended
below.

Best regards, Michael.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 8816 bytes --]

*** /tmp/ediffGTBgTB	2021-01-28 15:18:21.881661122 +0100
--- /home/albinus/src/emacs/lisp/autorevert.el	2021-01-28 15:06:38.034456811 +0100
***************
*** 355,364 ****
  (add-hook 'after-set-visited-file-name-hook
            #'auto-revert-set-visited-file-name)

! (defvar auto-revert--buffers-by-watch-descriptor
!   (make-hash-table :test 'equal)
!   "A hash table mapping notification descriptors to lists of buffers.
! The buffers use that descriptor for auto-revert notifications.
  The key is equal to `auto-revert-notify-watch-descriptor' in each
  buffer.")

--- 355,363 ----
  (add-hook 'after-set-visited-file-name-hook
            #'auto-revert-set-visited-file-name)

! (defvar auto-revert--buffer-by-watch-descriptor nil
!   "An association list mapping notification descriptors to buffers.
! The buffer uses that descriptor for auto-revert notifications.
  The key is equal to `auto-revert-notify-watch-descriptor' in each
  buffer.")

***************
*** 630,645 ****

  (defun auto-revert-notify-rm-watch ()
    "Disable file notification for current buffer's associated file."
!   (let ((desc auto-revert-notify-watch-descriptor)
!         (table auto-revert--buffers-by-watch-descriptor))
!     (when desc
!       (let ((buffers (delq (current-buffer) (gethash desc table))))
!         (if buffers
!             (puthash desc buffers table)
!           (remhash desc table)))
!       (ignore-errors
! 	(file-notify-rm-watch desc))
!       (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t)))
    (setq auto-revert-notify-watch-descriptor nil
  	auto-revert-notify-modified-p nil))

--- 629,640 ----

  (defun auto-revert-notify-rm-watch ()
    "Disable file notification for current buffer's associated file."
!   (when-let ((desc auto-revert-notify-watch-descriptor))
!     (setq auto-revert--buffer-by-watch-descriptor
!           (assoc-delete-all desc auto-revert--buffer-by-watch-descriptor))
!     (ignore-errors
!       (file-notify-rm-watch desc))
!     (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t))
    (setq auto-revert-notify-watch-descriptor nil
  	auto-revert-notify-modified-p nil))

***************
*** 660,672 ****
                 (if buffer-file-name '(change attribute-change) '(change))
                 'auto-revert-notify-handler))))
        (when auto-revert-notify-watch-descriptor
!         (setq auto-revert-notify-modified-p t)
!         (puthash
!          auto-revert-notify-watch-descriptor
!          (cons (current-buffer)
! 	       (gethash auto-revert-notify-watch-descriptor
! 		        auto-revert--buffers-by-watch-descriptor))
!          auto-revert--buffers-by-watch-descriptor)
          (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t))))

  ;; If we have file notifications, we want to update the auto-revert buffers
--- 655,664 ----
                 (if buffer-file-name '(change attribute-change) '(change))
                 'auto-revert-notify-handler))))
        (when auto-revert-notify-watch-descriptor
!         (setq auto-revert-notify-modified-p t
!               auto-revert--buffer-by-watch-descriptor
!               (cons (cons auto-revert-notify-watch-descriptor (current-buffer))
!                     auto-revert--buffer-by-watch-descriptor))
          (add-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch nil t))))

  ;; If we have file notifications, we want to update the auto-revert buffers
***************
*** 696,703 ****
  	   (action (nth 1 event))
  	   (file (nth 2 event))
  	   (file1 (nth 3 event)) ;; Target of `renamed'.
! 	   (buffers (gethash descriptor
! 			     auto-revert--buffers-by-watch-descriptor)))
        ;; Check, that event is meant for us.
        (cl-assert descriptor)
        ;; Since we watch a directory, a file name must be returned.
--- 688,695 ----
  	   (action (nth 1 event))
  	   (file (nth 2 event))
  	   (file1 (nth 3 event)) ;; Target of `renamed'.
! 	   (buffer (alist-get descriptor auto-revert--buffer-by-watch-descriptor
!                               nil nil #'equal)))
        ;; Check, that event is meant for us.
        (cl-assert descriptor)
        ;; Since we watch a directory, a file name must be returned.
***************
*** 706,714 ****
        (when auto-revert-debug
          (message "auto-revert-notify-handler %S" event))

!       (if (eq action 'stopped)
!           ;; File notification has stopped.  Continue with polling.
!           (cl-dolist (buffer buffers)
              (with-current-buffer buffer
                (when (or
                       ;; A buffer associated with a file.
--- 698,706 ----
        (when auto-revert-debug
          (message "auto-revert-notify-handler %S" event))

!       (when (buffer-live-p buffer)
!         (if (eq action 'stopped)
!             ;; File notification has stopped.  Continue with polling.
              (with-current-buffer buffer
                (when (or
                       ;; A buffer associated with a file.
***************
*** 721,758 ****
                  (auto-revert-notify-rm-watch)
                  ;; Restart the timer if it wasn't running.
                  (unless auto-revert-timer
!                   (auto-revert-set-timer)))))

!         ;; Loop over all buffers, in order to find the intended one.
!         (cl-dolist (buffer buffers)
!           (when (buffer-live-p buffer)
!             (with-current-buffer buffer
!               (when (or
!                      ;; A buffer associated with a file.
!                      (and (stringp buffer-file-name)
!                           (or
!                            (and (memq
!                                  action '(attribute-changed changed created))
!                                 (string-equal
!                                  (file-name-nondirectory file)
!                                  (file-name-nondirectory buffer-file-name)))
!                            (and (eq action 'renamed)
!                                 (string-equal
!                                  (file-name-nondirectory file1)
!                                  (file-name-nondirectory buffer-file-name)))))
!                      ;; A buffer w/o a file, like dired.
!                      (and (null buffer-file-name)
!                           (memq action '(created renamed deleted))))
!                 ;; Mark buffer modified.
!                 (setq auto-revert-notify-modified-p t)
!
!                 ;; Revert the buffer now if we're not locked out.
!                 (unless auto-revert--lockout-timer
!                   (auto-revert-handler)
!                   (setq auto-revert--lockout-timer
!                         (run-with-timer
!                          auto-revert--lockout-interval nil
!                          #'auto-revert--end-lockout buffer)))))))))))

  (defun auto-revert--end-lockout (buffer)
    "End the lockout period after a notification.
--- 713,747 ----
                  (auto-revert-notify-rm-watch)
                  ;; Restart the timer if it wasn't running.
                  (unless auto-revert-timer
!                   (auto-revert-set-timer))))

!           (with-current-buffer buffer
!             (when (or
!                    ;; A buffer associated with a file.
!                    (and (stringp buffer-file-name)
!                         (or
!                          (and (memq
!                                action '(attribute-changed changed created))
!                               (string-equal
!                                (file-name-nondirectory file)
!                                (file-name-nondirectory buffer-file-name)))
!                          (and (eq action 'renamed)
!                               (string-equal
!                                (file-name-nondirectory file1)
!                                (file-name-nondirectory buffer-file-name)))))
!                    ;; A buffer w/o a file, like dired.
!                    (and (null buffer-file-name)
!                         (memq action '(created renamed deleted))))
!               ;; Mark buffer modified.
!               (setq auto-revert-notify-modified-p t)
!
!               ;; Revert the buffer now if we're not locked out.
!               (unless auto-revert--lockout-timer
!                 (auto-revert-handler)
!                 (setq auto-revert--lockout-timer
!                       (run-with-timer
!                        auto-revert--lockout-interval nil
!                        #'auto-revert--end-lockout buffer))))))))))

  (defun auto-revert--end-lockout (buffer)
    "End the lockout period after a notification.

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2021-01-28 14:19 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-14 16:54 bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Spencer Baugh
2020-11-14 16:54 ` bug#44639: [PATCH 2/2] autorevert: map each watch descriptor to a single buffer Spencer Baugh
2020-12-02 14:50   ` Michael Albinus
2021-01-27  3:59     ` Lars Ingebrigtsen
2021-01-27 16:34       ` Spencer Baugh
2021-01-28  3:29         ` Lars Ingebrigtsen
2021-01-28 14:19           ` Michael Albinus
2020-11-14 17:22 ` bug#44638: [PATCH 1/2] autorevert: don't reuse existing watch descriptors Eli Zaretskii
2020-11-14 21:19   ` Spencer Baugh
2020-11-30 18:01     ` Spencer Baugh
2020-11-30 18:21       ` Eli Zaretskii
2020-11-30 18:31         ` Michael Albinus
2020-12-01 20:16           ` Michael Albinus
2020-12-02  3:20             ` Eli Zaretskii
2020-12-02 15:17               ` Michael Albinus
2020-12-02 15:41                 ` Eli Zaretskii
2020-12-02 17:05                   ` Michael Albinus
2020-12-02 17:13                     ` Eli Zaretskii
2020-12-02 17:20                       ` Michael Albinus
2020-12-02 17:43                         ` Eli Zaretskii
2020-12-03 15:01                         ` Michael Albinus
2020-12-02 17:46                       ` Dmitry Gutov

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