unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
       [not found] <874j5lzhdn.fsf.ref@aol.com>
@ 2024-10-09 10:43 ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-09 13:12   ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-09 13:38   ` Dmitry Gutov
  0 siblings, 2 replies; 13+ messages in thread
From: Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-09 10:43 UTC (permalink / raw)
  To: 73718; +Cc: Michael Albinus, Dmitry Gutov


Hi Dmitry and Michael:

I enabled the project-mode-line recently and now when I try to open a
remote file emacs seems frozen forever (minutes in a not so bad
connection).

I made a profile and it looks like there is some bad interaction between
project-mode-line and tramp names

I already tried:

(connection-local-set-profile-variables 'my-profile '((project-mode-line . nil)))
(connection-local-set-profiles '(:application tramp :user "myuser") 'my-profile)

But is not disabling the modeline for remote files.

And

vc-ignore-dir-regexp (format "\\(%s\\)\\|\\(%s\\)" ;; disable vc on remotes
					   vc-ignore-dir-regexp
					   tramp-file-name-regexp)

But the project-try-vc is still trying in the remote files.

The profile report:

15458  75% - redisplay_internal (C function)
15442  75%  - eval
15442  75%   - project-mode-line-format
15442  75%    - project-current
15442  75%     - project--find-in-directory
15442  75%      - run-hook-with-args-until-success
15442  75%       - project-try-vc
15442  75%        - project--value-in-dir
15442  75%         - hack-dir-local-variables
15442  75%          - #<byte-code-function 8FF>
15442  75%           - hack-dir-local--get-variables
15442  75%            - dir-locals-find-file
14648  71%             - locate-dominating-file
14644  71%              - abbreviate-file-name
14644  71%               - tramp-file-name-handler
14637  71%                - apply
14637  71%                 - tramp-sh-file-name-handler
14611  71%                  - tramp-handle-insert-file-contents
14611  71%                   - file-local-copy
14611  71%                    - tramp-file-name-handler
14611  71%                     - apply
14611  71%                      - tramp-sh-file-name-handler
14611  71%                       - tramp-sh-handle-file-local-copy
14611  71%                        - tramp-barf-unless-okay
14611  71%                         - tramp-send-command-and-check
14611  71%                          - tramp-send-command
14611  71%                           - tramp-wait-for-output
14611  71%                            - tramp-wait-for-regexp
14611  71%                             - sit-for
14611  71%                              - redisplay_internal (C function)
14574  71%                               - eval
14574  71%                                - project-mode-line-format
14574  71%                                 - project-current
14574  71%                                  - project--find-in-directory
14574  71%                                   - run-hook-with-args-until-success
14574  71%                                    - project-try-vc
14530  70%                                     - project--value-in-dir
14530  70%                                      - hack-dir-local-variables
14530  70%                                       - #<byte-code-function 08F>
14530  70%                                        - hack-dir-local--get-variables
14523  70%                                         - dir-locals-find-file
 9766  47%                                          - locate-dominating-file
 7983  38%                                           - dir-locals--all-files
 7964  38%                                            - tramp-file-name-handler
 7909  38%                                             - apply
 7906  38%                                              - tramp-sh-file-name-handler
 5131  25%                                               - tramp-sh-handle-file-readable-p
 5052  24%                                                - tramp-run-test
 5052  24%                                                 - tramp-send-command-and-check
 5052  24%                                                  - tramp-send-command
 5052  24%                                                   - tramp-wait-for-output
 5052  24%                                                    - tramp-wait-for-regexp
 3188  15%                                                     - tramp-accept-process-output
 2193  10%                                                        accept-process-output
  201   0%                                                      + #<byte-code-function 0F2>
  201   0%                                                      + tramp-get-connection-property
  126   0%                                                      + tramp-set-connection-property
   59   0%                                                        make-closure
   40   0%                                                        tramp-message
   38   0%                                                      + #<byte-code-function FA1>
   35   0%                                                        buffer-string
   13   0%                                                        process-buffer
   12   0%                                                        process-status
   11   0%                                                        with-timeout-suspend
    9   0%                                                        process-get
 1340   6%                                                       sit-for
  481   2%                                                     + tramp-check-for-regexp
   33   0%                                                       process-live-p
   41   0%                                                + tramp-file-name-handler
   22   0%                                                + tramp-get-file-property
   13   0%                                                + tramp-dissect-file-name
 1822   8%                                               + tramp-handle-file-regular-p
  912   4%                                               + tramp-sh-handle-file-directory-p
   38   0%                                               + tramp-sh-handle-expand-file-name
    3   0%                                                 #<byte-code-function 9AA>
    3   0%                                                tramp-file-name-for-operation
   27   0%                                             + tramp-dissect-file-name
   11   0%                                               tramp-tramp-file-p
    4   0%                                             + tramp-replace-environment-variables
    3   0%                                               tramp-file-name-equal-p
    3   0%                                             + #<byte-code-function 152>
 1774   8%                                           + tramp-file-name-handler
 4734  23%                                          - dir-locals--all-files
 4731  23%                                           - tramp-file-name-handler
 4679  22%                                            - apply
 4679  22%                                             - tramp-sh-file-name-handler
 2659  12%                                              - tramp-sh-handle-file-readable-p
 2634  12%                                               - tramp-run-test
 2634  12%                                                - tramp-send-command-and-check
 2634  12%                                                 - tramp-send-command
 2634  12%                                                  - tramp-wait-for-output
 2634  12%                                                   - tramp-wait-for-regexp
 1642   8%                                                    + tramp-accept-process-output
  700   3%                                                      sit-for
  276   1%                                                    + tramp-check-for-regexp
    6   0%                                                      process-live-p
   19   0%                                               + tramp-file-name-handler
    6   0%                                               + tramp-get-file-property
 1356   6%                                              + tramp-handle-file-regular-p
  629   3%                                              + tramp-sh-handle-file-directory-p
   35   0%                                              + tramp-sh-handle-expand-file-name
   16   0%                                            + tramp-dissect-file-name
   14   0%                                              tramp-tramp-file-p
    8   0%                                            + tramp-file-name-equal-p
    4   0%                                            + #<byte-code-function B99>
    4   0%                                              tramp-flush-connection-property
    3   0%                                              make-closure
   23   0%                                          + tramp-file-name-handler
    7   0%                                         + dir-locals-collect-variables
   44   0%                                     + locate-dominating-file
    4   0%                               + file-remote-p
   15   0%                  + tramp-sh-handle-set-visited-file-modtime
   11   0%                  + tramp-handle-abbreviate-file-name
    4   0%                + tramp-replace-environment-variables
    3   0%                  tramp-dissect-file-name
    4   0%                tramp-file-name-handler
  794   3%             + tramp-file-name-handler
   10   0%  + file-remote-p
 4838  23%   Automatic GC
  170   0% + command-execute
    4   0% + ...

At the moment I disabled the project-mode-line. However There may be
a better solutions for this issue.

Best,
Ergus


In GNU Emacs 31.0.50 (build 16, x86_64-pc-linux-gnu, GTK+ Version
 3.24.43, cairo version 1.18.2) of 2024-10-08 built on RTX
Repository revision: 7f70165ad6959193266df1da5b1ce53c34c72d47
Repository branch: project
System Description: Arch Linux

Configured using:
 'configure --prefix=/home/ergo/.local/ --with-mailutils --with-pgtk
 --with-modules --with-cairo --with-harfbuzz
 --with-native-compilation=aot
 '--program-transform-name=s/^ctags$/ctags.emacs/''

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LCMS2 LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PGTK
PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS
TREE_SITTER WEBP XIM GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: ELisp/l

Minor modes in effect:
  fancy-compilation-mode: t
  global-auto-revert-mode: t
  electric-pair-mode: t
  whitespace-mode: t
  flyspell-mode: t
  completion-preview-mode: t
  diff-hl-margin-local-mode: t
  diff-hl-margin-mode: t
  diff-hl-mode: t
  corfu-terminal-mode: t
  global-corfu-mode: t
  corfu-mode: t
  repeat-mode: t
  xterm-mouse-mode: t
  xclip-mode: t
  override-global-mode: t
  winner-mode: t
  save-place-mode: t
  delete-selection-mode: t
  savehist-mode: t
  global-display-fill-column-indicator-mode: t
  display-fill-column-indicator-mode: t
  global-display-line-numbers-mode: t
  display-line-numbers-mode: t
  which-key-mode: t
  eldoc-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  context-menu-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  size-indication-mode: t
  column-number-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/mnt/casa/gits/emacs_clones/cuda-mode/cuda-mode hides /home/ergo/.config/emacs/elpa/cuda-mode-20240819.11/cuda-mode
/home/ergo/.config/emacs/elpa/transient-20241006.2150/transient hides /home/ergo/.local/share/emacs/31.0.50/lisp/transient

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media puny rfc822
mml mml-sec epa derived epg rfc6068 epg-config gnus-util mm-decode
mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader
sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
misearch multi-isearch vc-git help-fns radix-tree profiler dired-aux
hl-line tramp-cmds fancy-compilation compile text-property-search
comp-run comp-common tramp-cache time-stamp tramp-sh tramp trampver
tramp-integration files-x tramp-message tramp-compat xdg shell pcomplete
comint ansi-osc parse-time iso8601 time-date format-spec ansi-color
tramp-loaddefs autorevert filenotify ffap thingatpt url-parse
auth-source eieio eieio-core cl-macs icons password-cache json map
url-vars elec-pair whitespace flyspell-correct flyspell ispell
completion-preview diff-hl-margin diff-hl-dired citre-lang-fileref
citre-tags citre-ctags citre-readtags citre-readtags-tables
citre-backend-interface citre-common-tag rx citre-common-util project
dired-x dired dired-loaddefs diff-hl log-view pcvs-util vc-dir ewoc vc
vc-dispatcher diff-mode track-changes corfu-terminal popon corfu
term/xterm xterm init repeat markdown-ts-mode subr-x treesit cape compat
use-package-ensure use-package-diminish xt-mouse xclip edmacro kmacro
byte-opt gv use-package-bind-key bind-key cl-extra help-mode
simple-16-theme winner ring saveplace delsel savehist easy-mmode
display-fill-column-indicator display-line-numbers diminish which-key
cl-seq use-package-core cl-loaddefs cl-lib bytecomp byte-compile
disp-table info 0blayout-autoloads ac-emoji-autoloads
ac-haskell-process-autoloads ac-html-autoloads
arduino-cli-mode-autoloads auctex-autoloads tex-site
auto-complete-autoloads avy-zap-autoloads avy-autoloads
better-shell-autoloads caml-autoloads cape-autoloads citre-autoloads
clang-format-autoloads cobol-mode-autoloads compile-multi-autoloads
corfu-terminal-autoloads corfu-autoloads crdt-autoloads
csv-mode-autoloads cuda-mode-autoloads d-mode-autoloads
deadgrep-autoloads debbugs-autoloads diff-hl-autoloads
diminish-autoloads dired-sidebar-autoloads dired-subtree-autoloads
dired-hacks-utils-autoloads dumb-jump-autoloads e2ansi-autoloads
emamux-autoloads esup-autoloads evil-collection-autoloads
annalist-autoloads evil-leader-autoloads evil-autoloads
face-explorer-autoloads fancy-compilation-autoloads flx-autoloads
flycheck-julia-autoloads flycheck-rust-autoloads flycheck-autoloads
flymake-nasm-autoloads flymake-quickdef-autoloads
flyspell-correct-autoloads git-modes-autoloads git-timemachine-autoloads
gnuplot-autoloads google-c-style-autoloads goto-chg-autoloads
groovy-mode-autoloads gtags-mode-autoloads haskell-mode-autoloads
highlight-indent-guides-autoloads i3wm-config-mode-autoloads
ibuffer-sidebar-autoloads iedit-autoloads imenu-list-autoloads
julia-ts-mode-autoloads julia-mode-autoloads languagetool-autoloads
lice-autoloads lorem-ipsum-autoloads lua-mode-autoloads magit-autoloads
magit-section-autoloads markdown-mode-autoloads
markdown-ts-mode-autoloads modern-cpp-font-lock-autoloads
move-dup-autoloads multiple-cursors-autoloads mutt-mode-autoloads
nasm-mode-autoloads neotree-autoloads nftables-mode-autoloads
nginx-mode-autoloads notmuch-autoloads objed-autoloads
opencl-mode-autoloads paradox-autoloads phi-search-autoloads
pkg-info-autoloads epl-autoloads pkgbuild-mode-autoloads
platformio-mode-autoloads async-autoloads popon-autoloads
popup-autoloads projectile-autoloads projection-autoloads
protobuf-mode-autoloads protobuf-ts-mode-autoloads
ptemplate-templates-autoloads ptemplate-autoloads
py-vterm-interaction-autoloads scopeline-autoloads
shell-command+-autoloads slime-autoloads macrostep-autoloads
sphinx-mode-autoloads f-autoloads dash-autoloads s-autoloads
spinner-autoloads ssh-config-mode-autoloads string-inflection-autoloads
sudo-edit-autoloads systemd-autoloads tmux-mode-autoloads
transient-autoloads tsc-autoloads urgrep-autoloads vdiff-autoloads
hydra-autoloads lv-autoloads vterm-toggle-autoloads vterm-autoloads
vundo-autoloads with-editor-autoloads xclip-autoloads
yasnippet-snippets-autoloads yasnippet-autoloads early-init rmc
iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win
term/common-win touch-screen pgtk-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo gtk pgtk
lcms2 multi-tty move-toolbar make-network-process native-compile emacs)

Memory information:
((conses 16 235994 86287) (symbols 48 16860 0)
 (strings 32 59529 11399) (string-bytes 1 2092584) (vectors 16 30418)
 (vector-slots 8 1023066 183728) (floats 8 113 783)
 (intervals 56 7143 582) (buffers 992 19))





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 10:43 ` bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-10-09 13:12   ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-10 11:12     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-09 13:38   ` Dmitry Gutov
  1 sibling, 1 reply; 13+ messages in thread
From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-09 13:12 UTC (permalink / raw)
  To: Ergus; +Cc: 73718, dgutov

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

Ergus <spacibba@aol.com> writes:

> Hi Dmitry and Michael:

Hi Ergus,

> I enabled the project-mode-line recently and now when I try to open a
> remote file emacs seems frozen forever (minutes in a not so bad
> connection).
>
> I made a profile and it looks like there is some bad interaction between
> project-mode-line and tramp names
>
> The profile report:
>
> 15458  75% - redisplay_internal (C function)
> 15442  75%  - eval
> 15442  75%   - project-mode-line-format
> 15442  75%    - project-current
> 15442  75%     - project--find-in-directory
> 15442  75%      - run-hook-with-args-until-success
> 15442  75%       - project-try-vc
> 15442  75%        - project--value-in-dir
> 15442  75%         - hack-dir-local-variables
> 15442  75%          - #<byte-code-function 8FF>
> 15442  75%           - hack-dir-local--get-variables
> 15442  75%            - dir-locals-find-file
> 14648  71%             - locate-dominating-file
> 14644  71%              - abbreviate-file-name
> 14644  71%               - tramp-file-name-handler
> 14637  71%                - apply
> 14637  71%                 - tramp-sh-file-name-handler
> 14611  71%                  - tramp-handle-insert-file-contents
> 14611  71%                   - file-local-copy
> 14611  71%                    - tramp-file-name-handler
> 14611  71%                     - apply
> 14611  71%                      - tramp-sh-file-name-handler
> 14611  71%                       - tramp-sh-handle-file-local-copy
> 14611  71%                        - tramp-barf-unless-okay
> 14611  71%                         - tramp-send-command-and-check
> 14611  71%                          - tramp-send-command
> 14611  71%                           - tramp-wait-for-output
> 14611  71%                            - tramp-wait-for-regexp
> 14611  71%                             - sit-for
> 14611  71%                              - redisplay_internal (C function)
> 14574  71%                               - eval
> 14574  71%                                - project-mode-line-format

This is unfortune. sit-for should not trigger a redisplay. Does the
appended patch in tramp.el helps?

Best regards, Michael.

> At the moment I disabled the project-mode-line. However There may be
> a better solutions for this issue.
>
> Best,
> Ergus

Best regards, Michael.


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

diff --git a/lisp/tramp.el b/lisp/tramp.el
index 4ce44119..181bba01 100644
--- a/lisp/tramp.el
+++ b/lisp/tramp.el
@@ -6049,7 +6049,7 @@ nil."
     (with-tramp-timeout (timeout)
       (while (not found)
 	;; This is needed to yield the CPU, otherwise we'll see 100% CPU load.
-	(sit-for 0)
+	(sit-for 0 'nodisp)
 	(tramp-accept-process-output proc)
 	(unless (process-live-p proc)
 	  (tramp-error-with-buffer

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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 10:43 ` bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-09 13:12   ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-10-09 13:38   ` Dmitry Gutov
  2024-10-09 13:45     ` Ship Mints
                       ` (2 more replies)
  1 sibling, 3 replies; 13+ messages in thread
From: Dmitry Gutov @ 2024-10-09 13:38 UTC (permalink / raw)
  To: Ergus, 73718, Juri Linkov; +Cc: Michael Albinus

Hi!

On 09/10/2024 13:43, Ergus via Bug reports for GNU Emacs, the Swiss army 
knife of text editors wrote:
> I made a profile and it looks like there is some bad interaction between
> project-mode-line and tramp names
> 
> I already tried:
> 
> (connection-local-set-profile-variables 'my-profile '((project-mode-line . nil)))
> (connection-local-set-profiles '(:application tramp :user "myuser") 'my-profile)
> 
> But is not disabling the modeline for remote files.

I wonder if we'll need to disable project-mode-line in remote files 
altogether, or if this is a problem that could be solved in Tramp (with 
extra caching?)

To use connect-local value to disable, BTW, it would need to have extra 
code called from the mode line format (in bindings.el). And it's a part 
that was added only recently, for in Emacs 30.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 13:38   ` Dmitry Gutov
@ 2024-10-09 13:45     ` Ship Mints
  2024-10-09 14:01       ` Ship Mints
  2024-10-09 16:10     ` Juri Linkov
  2024-10-10  9:57     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 13+ messages in thread
From: Ship Mints @ 2024-10-09 13:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, Michael Albinus, 73718, Juri Linkov

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

I've added file-remote-p guards in a variety of places specifically to
avoid these issues.

On Wed, Oct 9, 2024 at 9:39 AM Dmitry Gutov <dgutov@yandex.ru> wrote:

> Hi!
>
> On 09/10/2024 13:43, Ergus via Bug reports for GNU Emacs, the Swiss army
> knife of text editors wrote:
> > I made a profile and it looks like there is some bad interaction between
> > project-mode-line and tramp names
> >
> > I already tried:
> >
> > (connection-local-set-profile-variables 'my-profile '((project-mode-line
> . nil)))
> > (connection-local-set-profiles '(:application tramp :user "myuser")
> 'my-profile)
> >
> > But is not disabling the modeline for remote files.
>
> I wonder if we'll need to disable project-mode-line in remote files
> altogether, or if this is a problem that could be solved in Tramp (with
> extra caching?)
>
> To use connect-local value to disable, BTW, it would need to have extra
> code called from the mode line format (in bindings.el). And it's a part
> that was added only recently, for in Emacs 30.
>
>
>
>

[-- Attachment #2: Type: text/html, Size: 1516 bytes --]

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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 13:45     ` Ship Mints
@ 2024-10-09 14:01       ` Ship Mints
  0 siblings, 0 replies; 13+ messages in thread
From: Ship Mints @ 2024-10-09 14:01 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, Michael Albinus, 73718, Juri Linkov

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

To be clearer, I've guarded project-try-vc with advice. Perhaps a user
option to enable the guard intrinsically would be better as everyone could
benefit. I have my own option variables doing this so I can enable it when
wanted.

Perhaps Ergus can give something similar a try and see if this solves his
immediate hanging concern.

Ergus, you should be able to just drop the below snippet in your init file
(or eval in *scratch*) and see if it works for you.

  (defun my/project-try-vc-advice (orig-fun dir)
    (or (vc-file-getprop dir 'project-vc)
        (if (file-remote-p dir)
            nil
          (funcall orig-fun dir))))
  (advice-add 'project-try-vc :around #'my/project-try-vc-advice))


On Wed, Oct 9, 2024 at 9:45 AM Ship Mints <shipmints@gmail.com> wrote:

> I've added file-remote-p guards in a variety of places specifically to
> avoid these issues.
>
> On Wed, Oct 9, 2024 at 9:39 AM Dmitry Gutov <dgutov@yandex.ru> wrote:
>
>> Hi!
>>
>> On 09/10/2024 13:43, Ergus via Bug reports for GNU Emacs, the Swiss army
>> knife of text editors wrote:
>> > I made a profile and it looks like there is some bad interaction between
>> > project-mode-line and tramp names
>> >
>> > I already tried:
>> >
>> > (connection-local-set-profile-variables 'my-profile
>> '((project-mode-line . nil)))
>> > (connection-local-set-profiles '(:application tramp :user "myuser")
>> 'my-profile)
>> >
>> > But is not disabling the modeline for remote files.
>>
>> I wonder if we'll need to disable project-mode-line in remote files
>> altogether, or if this is a problem that could be solved in Tramp (with
>> extra caching?)
>>
>> To use connect-local value to disable, BTW, it would need to have extra
>> code called from the mode line format (in bindings.el). And it's a part
>> that was added only recently, for in Emacs 30.
>>
>>
>>
>>

[-- Attachment #2: Type: text/html, Size: 3175 bytes --]

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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 13:38   ` Dmitry Gutov
  2024-10-09 13:45     ` Ship Mints
@ 2024-10-09 16:10     ` Juri Linkov
  2024-10-11  0:38       ` Dmitry Gutov
  2024-10-10  9:57     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 13+ messages in thread
From: Juri Linkov @ 2024-10-09 16:10 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, Michael Albinus, 73718

>> I made a profile and it looks like there is some bad interaction between
>> project-mode-line and tramp names
>> I already tried:
>> (connection-local-set-profile-variables 'my-profile '((project-mode-line
>> . nil)))
>> (connection-local-set-profiles '(:application tramp :user "myuser") 'my-profile)
>> But is not disabling the modeline for remote files.
>
> I wonder if we'll need to disable project-mode-line in remote files
> altogether, or if this is a problem that could be solved in Tramp (with
> extra caching?)
>
> To use connect-local value to disable, BTW, it would need to have extra
> code called from the mode line format (in bindings.el). And it's a part
> that was added only recently, for in Emacs 30.

Or maybe better to cache the value of project-name on remove projects.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 13:38   ` Dmitry Gutov
  2024-10-09 13:45     ` Ship Mints
  2024-10-09 16:10     ` Juri Linkov
@ 2024-10-10  9:57     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-10-11  0:33       ` Dmitry Gutov
  2 siblings, 1 reply; 13+ messages in thread
From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-10  9:57 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, 73718, Juri Linkov

Dmitry Gutov <dgutov@yandex.ru> writes:

> Hi!

Hi Dmitry,

> I wonder if we'll need to disable project-mode-line in remote files
> altogether, or if this is a problem that could be solved in Tramp
> (with extra caching?)

What do you think should be cached in Tramp?

Best regards, Michael.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 13:12   ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-10-10 11:12     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-10 11:12 UTC (permalink / raw)
  To: Ergus; +Cc: 73718, dgutov

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

Hi Ergus,

> This is unfortune. sit-for should not trigger a redisplay. Does the
> appended patch in tramp.el helps?

I've pushed the patch to master. It doesn't hurt, at least.

Best regards, Michael.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-10  9:57     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-10-11  0:33       ` Dmitry Gutov
  2024-10-11 11:45         ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 13+ messages in thread
From: Dmitry Gutov @ 2024-10-11  0:33 UTC (permalink / raw)
  To: Michael Albinus; +Cc: Ergus, 73718, Juri Linkov

On 10/10/2024 12:57, Michael Albinus via Bug reports for GNU Emacs, the 
Swiss army knife of text editors wrote:
>> I wonder if we'll need to disable project-mode-line in remote files
>> altogether, or if this is a problem that could be solved in Tramp
>> (with extra caching?)
> What do you think should be cached in Tramp?

Not sure if more cache should be the answer here, but in the profile I 
see the hack-dir-local-variables call.

So first, it should do nothing unless enable-remote-dir-locals is set to 
t (right?), so my first guess would be Ergus has customized that var. 
Maybe try turning it off, does that lose some features that you use?

Second, I suppose Tramp could do some caching for the result of 
hack-dir-local--get-variables (just time-based), but I'm not sure how 
much it will help, on average. Only every 100th redisplay causing a 
stutter would still be a problem.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-09 16:10     ` Juri Linkov
@ 2024-10-11  0:38       ` Dmitry Gutov
  2024-10-11 14:35         ` Ship Mints
  0 siblings, 1 reply; 13+ messages in thread
From: Dmitry Gutov @ 2024-10-11  0:38 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Ergus, Michael Albinus, 73718

On 09/10/2024 19:10, Juri Linkov wrote:
> Or maybe better to cache the value of project-name on remove projects.

Just the project->project-name mapping? Why not. I suppose there'd still 
be a pause when switching projects, but it's not as bad.

For general caching, from past threads it seems the most problematic 
case is "no project". Because OT1H it's still costly it terms of remote 
I/O. But on the other, this is exactly when the cache might get invalid 
soon (because the user will initialize a Git repo, or create another 
root marker, etc).

I guess we should come back to this after bug#72300.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-11  0:33       ` Dmitry Gutov
@ 2024-10-11 11:45         ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 13+ messages in thread
From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-11 11:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, 73718, Juri Linkov

Dmitry Gutov <dgutov@yandex.ru> writes:

Hi Dmitry,

>>> I wonder if we'll need to disable project-mode-line in remote files
>>> altogether, or if this is a problem that could be solved in Tramp
>>> (with extra caching?)
>> What do you think should be cached in Tramp?
>
> Not sure if more cache should be the answer here, but in the profile I
> see the hack-dir-local-variables call.
>
> So first, it should do nothing unless enable-remote-dir-locals is set
> to t (right?), so my first guess would be Ergus has customized that
> var. Maybe try turning it off, does that lose some features that you
> use?

Neither Tramp nor connection-local variables need this. Perhaps, it is a
good idea idea to bind enable-remote-dir-locals to nil in
project-mode-line-format.

> Second, I suppose Tramp could do some caching for the result of
> hack-dir-local--get-variables (just time-based), but I'm not sure how
> much it will help, on average. Only every 100th redisplay causing a
> stutter would still be a problem.

A redisplay shouldn't happen anymore, at least not triggered by
Tramp. I've added the NODISP arg to the respective sit-for call.

Best regards, Michael.





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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-11  0:38       ` Dmitry Gutov
@ 2024-10-11 14:35         ` Ship Mints
  2024-10-13 13:31           ` Ship Mints
  0 siblings, 1 reply; 13+ messages in thread
From: Ship Mints @ 2024-10-11 14:35 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, Michael Albinus, 73718, Juri Linkov

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

In addition to guarding project-try-vc, I also have a customized cache for
non-projects specifically to get around the incessant retesting for what
are effectively invariant conditions.

If of any utility to others:

(use-package project
...
  (defconst my:project--non-project-dir ".") ; nil disables the cache;
NOTE: eglot relies on project-root so this has to be a real path
  (defun my/project-try-non-project-cache (dir)
    (unless (and my:project-vc-inhibit-remote (file-remote-p dir)) ; yet
another optional remote guard
      (let ((proj (cons 'transient (or my:project--non-project-dir
(expand-file-name dir)))))
        (vc-file-setprop dir 'project-vc proj) ; project caches via vc
internal properties
        proj)))
  (add-to-list 'project-find-functions #'my/project-try-non-project-cache
'append))

  ;; customized project current name function that respects
  ;; non-project marker and returns nil if a non-project
  (defun my/project-current-name (&optional buf)
    "Return the current project name for BUF, or nil if a non-project.
If BUF is nil, the current buffer is used."
    (with-current-buffer (or buf (current-buffer))
      (when-let* ((p (project-current))
                  (pn (project-name p)))
        (unless (string= pn my:project--non-project-dir)
          pn))))
...
)

On Thu, Oct 10, 2024 at 8:38 PM Dmitry Gutov <dgutov@yandex.ru> wrote:

> On 09/10/2024 19:10, Juri Linkov wrote:
> > Or maybe better to cache the value of project-name on remove projects.
>
> Just the project->project-name mapping? Why not. I suppose there'd still
> be a pause when switching projects, but it's not as bad.
>
> For general caching, from past threads it seems the most problematic
> case is "no project". Because OT1H it's still costly it terms of remote
> I/O. But on the other, this is exactly when the cache might get invalid
> soon (because the user will initialize a Git repo, or create another
> root marker, etc).
>
> I guess we should come back to this after bug#72300.
>
>
>
>

[-- Attachment #2: Type: text/html, Size: 3145 bytes --]

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

* bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format
  2024-10-11 14:35         ` Ship Mints
@ 2024-10-13 13:31           ` Ship Mints
  0 siblings, 0 replies; 13+ messages in thread
From: Ship Mints @ 2024-10-13 13:31 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ergus, Michael Albinus, 73718, Juri Linkov

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

Forgot to add this counterpart for when you want to use a non-project
semaphore but also want to project-current to tell the truth about being a
non-project:

  (defun my/project-current-non-project-advice (orig-fun &rest args)
    (let ((p (apply orig-fun args)))
      (when (and p (string= (project-name p) my:project--non-project-dir))
        (setq p nil))
      p))
  (advice-add #'project-current :around
#'my/project-current-non-project-advice))

On Fri, Oct 11, 2024 at 10:35 AM Ship Mints <shipmints@gmail.com> wrote:

> In addition to guarding project-try-vc, I also have a customized cache for
> non-projects specifically to get around the incessant retesting for what
> are effectively invariant conditions.
>
> If of any utility to others:
>
> (use-package project
> ...
>   (defconst my:project--non-project-dir ".") ; nil disables the cache;
> NOTE: eglot relies on project-root so this has to be a real path
>   (defun my/project-try-non-project-cache (dir)
>     (unless (and my:project-vc-inhibit-remote (file-remote-p dir)) ; yet
> another optional remote guard
>       (let ((proj (cons 'transient (or my:project--non-project-dir
> (expand-file-name dir)))))
>         (vc-file-setprop dir 'project-vc proj) ; project caches via vc
> internal properties
>         proj)))
>   (add-to-list 'project-find-functions #'my/project-try-non-project-cache
> 'append))
>
>   ;; customized project current name function that respects
>   ;; non-project marker and returns nil if a non-project
>   (defun my/project-current-name (&optional buf)
>     "Return the current project name for BUF, or nil if a non-project.
> If BUF is nil, the current buffer is used."
>     (with-current-buffer (or buf (current-buffer))
>       (when-let* ((p (project-current))
>                   (pn (project-name p)))
>         (unless (string= pn my:project--non-project-dir)
>           pn))))
> ...
> )
>
> On Thu, Oct 10, 2024 at 8:38 PM Dmitry Gutov <dgutov@yandex.ru> wrote:
>
>> On 09/10/2024 19:10, Juri Linkov wrote:
>> > Or maybe better to cache the value of project-name on remove projects.
>>
>> Just the project->project-name mapping? Why not. I suppose there'd still
>> be a pause when switching projects, but it's not as bad.
>>
>> For general caching, from past threads it seems the most problematic
>> case is "no project". Because OT1H it's still costly it terms of remote
>> I/O. But on the other, this is exactly when the cache might get invalid
>> soon (because the user will initialize a Git repo, or create another
>> root marker, etc).
>>
>> I guess we should come back to this after bug#72300.
>>
>>
>>
>>

[-- Attachment #2: Type: text/html, Size: 4203 bytes --]

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

end of thread, other threads:[~2024-10-13 13:31 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <874j5lzhdn.fsf.ref@aol.com>
2024-10-09 10:43 ` bug#73718: 31.0.50; Severe performance issue with Tramp and project-mode-line-format Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-09 13:12   ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-10 11:12     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-09 13:38   ` Dmitry Gutov
2024-10-09 13:45     ` Ship Mints
2024-10-09 14:01       ` Ship Mints
2024-10-09 16:10     ` Juri Linkov
2024-10-11  0:38       ` Dmitry Gutov
2024-10-11 14:35         ` Ship Mints
2024-10-13 13:31           ` Ship Mints
2024-10-10  9:57     ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-10-11  0:33       ` Dmitry Gutov
2024-10-11 11:45         ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors

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