unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: "João Távora" <joaotavora@gmail.com>
To: Michael Albinus <michael.albinus@gmx.de>
Cc: Thomas Koch <thomas@koch.ro>, 61350@debbugs.gnu.org
Subject: bug#61350: Eglot over Tramp freezes with large project
Date: Thu, 02 Mar 2023 11:22:49 +0000	[thread overview]
Message-ID: <87356n8kja.fsf@gmail.com> (raw)
In-Reply-To: <87y1ofct83.fsf@gmx.de> (Michael Albinus's message of "Thu, 02 Mar 2023 12:01:32 +0100")

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

>> Michael can probably confirm, correct or deny this.
> More or less correct.

Actually, I don't think it is correct, at least not the way I meant it:
JSONRPC data never gets into the tprocess's buffer.  Experiments also
seem to disprove it.

> But I still can't say which process gets output
> when, because I cannot debug accept-process-output (it's a C
> function). And running Emacs under gdb changes timings, which is
> important I believe.

Yes, we must probably write some gdb scripts.  Eli is expert at that,
but I've done some it myself.

>> When one (accept-process-output tprocess nil nil 'JUST-THIS-ONE=t) one
>> must be absolutely sure that tprocess is going to send _something_
>> "soon".  If it doesn't, we'll hang indefinitely (until the process dies
>> or the user quits)
>
> Yes. But Tramp calls accept-process-output only, if it has send a
> command to the remote shell, and it expects something to be returned. At
> least the shell prompt.

Yes.  Tramp is doing the right thing.  It really expects a response to
come.  And more often than not, it does.  But sometimes it doesn't, and
that's when we hang.

>> See the comment there?  Only 256 characters back are inspected.
>
> Yes. But the regexp it searches for is the final shell prompt. Something
> like "///4b3b7d4fa561141e84c94a1cf25e8575#$", which is shorter than 256
> bytes for sure.

OK, but why can't one search for it from where you last left parsing,
(i.e. point) up to process-mark?  Anyway, I increased that value
significantly and it didn't make a difference, so this is probably a red
herring.

>> So, finally, here's my conjecture:
>>
>> 1. Tramp goes into 'tramp-wait-for-regexp'.  tprocess's buffer already
>>    the message that 'found' is supposed to return, but it also has a lot
>>    more stuff, say a lot of JSONRPC data from the LSP server that also
>>    came into that tprocess buffer and is awaiting to be delivered to
>>    jprocess.
>>
>> 2. This data is for piping into jprocess, where the JSONRPC message will
>>    be decoded, but it will probably never arrive at its destination.
>>
>> 3. 'found' will be nil in tramp-wait-for-regexp, because of the
>>    tramp-search-regexp limitation.
>>
>> 4. tramp-wait-for-regexp will issue the "risky" accept-process-output
>>    call.
>>
>> 5. there is no more data that accept-process-output wants to put in the
>>    buffer,  because the LSP server is fine for the moment.
>>
>> 6. Emacs hang
>>
>> Just a conjecture.
>
> Yes, this is more or less the scenario. But I still don't understand why
> not all data are delivered through the socket ssh is using. Could it be
> there is a limitation, how much data could be buffered by ssh?

After testing with a enhanced tramp-backtrace that prints out the
contents of every process buffer, I don't think my conjecture is
correct.

diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index df4b7dfca2c..f24a3b51074 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -2212,12 +2212,21 @@ tramp-backtrace
 If VEC-OR-PROC is nil, the buffer *debug tramp* is used.  FORCE
 forces the backtrace even if `tramp-verbose' is less than 10.
 This function is meant for debugging purposes."
-  (let ((tramp-verbose (if force 10 tramp-verbose)))
+  (let ((tramp-verbose (if force 10 tramp-verbose))
+        (bt (lambda ()
+              (backtrace)
+              (dolist (p (process-list))
+                (let* ((buf (process-buffer p))
+                       (name (and buf (buffer-name buf))))
+                  (when buf
+                    (princ (format "\n--8<---- begin contents of `%s' ------>8---\n" name))
+                    (princ (with-current-buffer buf (buffer-string)))
+                    (princ (format "\n--8<---- end contents of `%s' ------>8---\n" name))))))))
     (when (>= tramp-verbose 10)
       (if vec-or-proc
          (tramp-message
-          vec-or-proc 10 "\n%s" (with-output-to-string (backtrace)))
-       (with-output-to-temp-buffer "*debug tramp*" (backtrace))))))
+          vec-or-proc 10 "\n%s" (with-output-to-string (funcall bt)))
+       (with-output-to-temp-buffer "*debug tramp*" (funcall bt))))))

When you press C-g after the hang occurs, the backtrace is correct but
the tprocess buffer is simply empty, according to the new logs.  IOW the
response Tramp was waiting for never arrived.

>> There are no (usable) threads in Emacs.
> There are. I made Tramp using threads, and it worked fine, when no
> interactive dialogue inside a thread happened.

Right.  There are so-called green threads, which could fit input-waiting
situations like this one, not for achieving true simultaneity.  In my
opinion, they don't present any advantage over the evented model, which
we understand much better (wait... except we don't :-) )

I don't think we should do that until we understand what is happening.

>> Timers are events, and so are runs of each processe's process filter.
>> Those two are what creates asynchronicity and the emulation of
>> simultaneity in Emacs.  When jprocess's filter sees a whole JSONRPC
>> message, it calls the message handler.
>
> Timers and process filters are the cause of the "Forbidden reentrant
> call in Tramp" errors.

I've had problems with reentrant calls to process filters before, and I
solved them with a timer.  Not sure what that error is.

> Wwe must do anything, solving this.

I don't understand what you mean here.

João





  reply	other threads:[~2023-03-02 11:22 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-07 16:33 bug#61350: Eglot over Tramp freezes with large project Thomas Koch
2023-02-17  9:54 ` Michael Albinus
2023-02-17 10:33   ` Thomas Koch
2023-02-18 11:10     ` Thomas Koch
2023-02-18 12:07       ` Michael Albinus
2023-02-23 11:55         ` Thomas Koch
2023-02-25 14:36           ` Michael Albinus
2023-02-23 12:17 ` João Távora
2023-02-23 14:18   ` João Távora
2023-02-23 14:47     ` Thomas Koch
2023-02-23 15:22       ` João Távora
2023-02-24 17:19         ` Michael Albinus
2023-02-24 17:45           ` João Távora
2023-02-25 14:27             ` Michael Albinus
2023-02-25 23:09               ` João Távora
2023-02-26 10:24                 ` Thomas Koch
2023-02-26 15:58                   ` Michael Albinus
2023-02-26 17:23                 ` Michael Albinus
2023-02-26 21:13                   ` João Távora
2023-02-26 21:45                     ` João Távora
2023-02-27  7:53                       ` Michael Albinus
2023-02-27  9:42                         ` João Távora
2023-02-27 20:11                           ` Michael Albinus
2023-02-27  7:47                     ` Michael Albinus
2023-02-27  9:35                       ` João Távora
2023-02-27 20:10                         ` Michael Albinus
2023-02-28  0:10                           ` João Távora
2023-02-28 10:38                             ` Michael Albinus
2023-02-28 11:33                               ` João Távora
2023-02-28 12:59                                 ` Michael Albinus
2023-02-28 14:41                                   ` João Távora
2023-02-28 14:18                             ` Michael Albinus
2023-02-28 14:51                               ` João Távora
2023-02-28 15:01                                 ` Michael Albinus
2023-02-28 17:55                                   ` Thomas Koch
2023-03-01 14:10                                     ` João Távora
2023-03-01 16:19                                       ` João Távora
2023-03-02 11:01                                       ` Michael Albinus
2023-03-02 11:22                                         ` João Távora [this message]
2023-03-02 11:50                                           ` Michael Albinus
2023-03-05 11:21                                           ` Michael Albinus
2023-03-05 11:45                                             ` Thomas Koch
2023-03-05 12:23                                               ` Michael Albinus
2023-03-07 12:49                                                 ` Michael Albinus
2023-03-07 13:04                                                   ` Thomas Koch
2023-03-07 13:33                                                     ` João Távora
2023-03-07 13:52                                                       ` Michael Albinus
2023-03-07 14:03                                                         ` João Távora
2023-03-07 14:31                                                           ` Michael Albinus
2023-03-11  9:00                                                             ` Michael Albinus
2023-03-11 10:14                                                               ` Thomas Koch
2023-03-11 11:47                                                                 ` João Távora
2023-03-11 12:27                                                                 ` Michael Albinus
2023-03-11 11:42                                                               ` João Távora
2023-03-11 12:44                                                                 ` Michael Albinus
2023-03-11 14:01                                                                   ` João Távora
2023-03-11 14:25                                                                     ` Michael Albinus
2023-03-12  0:48                                                                       ` João Távora
2023-03-12 10:22                                                                         ` Michael Albinus
2023-03-14 11:01                                                                           ` Michael Albinus
2023-03-14 15:00                                                                             ` Michael Albinus
2023-03-14 15:19                                                                               ` João Távora
2023-03-14 15:42                                                                                 ` Michael Albinus
2023-03-15 17:47                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-15 18:05                                                                                     ` João Távora
2023-03-15 18:30                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-15 19:44                                                                                         ` João Távora
2023-03-15 20:14                                                                                           ` João Távora
2023-03-15 21:34                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-15 21:55                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-16 13:28                                                                                               ` João Távora
2023-03-18 12:34                                                                                               ` Michael Albinus
2023-03-15 21:43                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-15 21:49                                                                                             ` João Távora
2023-03-16  6:24                                                                                               ` Jim Porter
2023-03-16 13:25                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-16 13:28                                                                                                 ` João Távora
2023-03-16 15:58                                                                                                   ` João Távora
2023-03-16 20:36                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-03-16 22:04                                                                                                       ` João Távora
2023-03-07 13:47                                                     ` Michael Albinus
2023-03-06 12:42                                             ` Michael Albinus
2023-03-06 13:45                                               ` João Távora
2023-03-06 13:42                                             ` João Távora
2023-03-02 10:40                                     ` Michael Albinus
2023-02-28 19:37                                   ` João Távora
2023-03-01  8:44                                     ` Michael Albinus
2023-03-01 11:15                                       ` João Távora
2023-03-01 10:46                                 ` Gregory Heytings
2023-03-01 11:08                                   ` João Távora
2023-03-01 11:23                                     ` Gregory Heytings
2023-03-01 11:37                                       ` João Távora
2023-03-01 14:51                                         ` Michael Albinus
2023-03-01 15:02                                           ` Gregory Heytings
2023-04-24  1:44 ` Aaron Madlon-Kay
2023-05-05 11:32   ` Michael Albinus
2023-05-05 13:14     ` Ruijie Yu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-05 14:53       ` 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=87356n8kja.fsf@gmail.com \
    --to=joaotavora@gmail.com \
    --cc=61350@debbugs.gnu.org \
    --cc=michael.albinus@gmx.de \
    --cc=thomas@koch.ro \
    /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).