* bug#73199: soap-client; soap-invoke-internal is not thread-safe @ 2024-09-12 14:20 Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-09-14 14:06 ` Thomas Fitzsimmons 0 siblings, 1 reply; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-09-12 14:20 UTC (permalink / raw) To: 73199; +Cc: Alexandru Harsanyi Forward to debbugs From: Michael Albinus <michael.albinus@gmx.de> Subject: soap-client; soap-invoke-internal is not thread-safe To: Alexandru Harsanyi <AlexHarsanyi@gmail.com> Date: Thu, 12 Sep 2024 15:57:45 +0200 (19 minutes, 24 seconds ago) In package debbugs, I try to use Emacs Lisp threads when retrieving SOAP data from the debbugs server. However, ocaasionally I run into the error --8<---------------cut here---------------start------------->8--- (error "Attempt to accept output from process debbugs.gnu.org locked to thread #<thread 0xc288a0>") --8<---------------cut here---------------end--------------->8--- My work around is to advice url-http-create-request --8<---------------cut here---------------start------------->8--- (advice-add 'url-http-create-request :around (lambda (orig-fun) "Set `url-http-attempt-keepalives' to nil." (setq url-http-attempt-keepalives nil) (funcall orig-fun)) '(name debbugs-advice)) --8<---------------cut here---------------end--------------->8--- However, it would be great if soap-invoke-internal could care. Emacs : GNU Emacs 31.0.50 (build 35, x86_64-pc-linux-gnu, GTK+ Version 3.24.43, cairo version 1.18.0) of 2024-09-12 Package: soap-client ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: soap-client; soap-invoke-internal is not thread-safe 2024-09-12 14:20 bug#73199: soap-client; soap-invoke-internal is not thread-safe Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-09-14 14:06 ` Thomas Fitzsimmons 2024-09-20 9:58 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 1 reply; 11+ messages in thread From: Thomas Fitzsimmons @ 2024-09-14 14:06 UTC (permalink / raw) To: 73199; +Cc: AlexHarsanyi, michael.albinus Hi Michael, Michael Albinus writes: > Forward to debbugs > > From: Michael Albinus <michael.albinus@gmx.de> > Subject: soap-client; soap-invoke-internal is not thread-safe > To: Alexandru Harsanyi <AlexHarsanyi@gmail.com> > Date: Thu, 12 Sep 2024 15:57:45 +0200 (19 minutes, 24 seconds ago) > > In package debbugs, I try to use Emacs Lisp threads when retrieving SOAP > data from the debbugs server. However, ocaasionally I run into the error > > --8<---------------cut here---------------start------------->8--- > (error "Attempt to accept output from process debbugs.gnu.org locked to thread #<thread 0xc288a0>") > --8<---------------cut here---------------end--------------->8--- > > My work around is to advice url-http-create-request > > --8<---------------cut here---------------start------------->8--- > (advice-add > 'url-http-create-request :around > (lambda (orig-fun) > "Set `url-http-attempt-keepalives' to nil." > (setq url-http-attempt-keepalives nil) > (funcall orig-fun)) > '(name debbugs-advice)) > --8<---------------cut here---------------end--------------->8--- > > However, it would be great if soap-invoke-internal could care. I am not able to test Excorporate's usage of soap-client anymore to check if a candidate patch would break anything. I will ask on emacs-devel if anyone wants to take over maintenance of Excorporate and its dependencies. A starting point for adding thread safety would be a minimal test case that calls soap-invoke-internal against the debbugs server from multiple different threads. Are you able to extract such a test case? If the resulting patch is obviously safe for single-threaded usage by Excorporate, then I could push it to soap-client.el. Thanks, Thomas ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: soap-client; soap-invoke-internal is not thread-safe 2024-09-14 14:06 ` Thomas Fitzsimmons @ 2024-09-20 9:58 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors [not found] ` <87wmit9nvh.fsf_-_@gmx.de> 0 siblings, 1 reply; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-09-20 9:58 UTC (permalink / raw) To: Thomas Fitzsimmons; +Cc: 73199, AlexHarsanyi, monnier Thomas Fitzsimmons <fitzsim@fitzsim.org> writes: > Hi Michael, Hi Thomas, sorry for the late reply, I was out of order for a week. > A starting point for adding thread safety would be a minimal test case > that calls soap-invoke-internal against the debbugs server from multiple > different threads. Are you able to extract such a test case? Install the just-released debbugs 0.41. Open a new Emacs session, load debbugs-gnu. Deactivate the advice I have added to mitigate the problem. --8<---------------cut here---------------start------------->8--- (defalias 'debbugs-compat-add-debbugs-advice 'ignore) (defalias 'debbugs-compat-remove-debbugs-advice 'ignore) --8<---------------cut here---------------end--------------->8--- Retrieve the most recent 10 bugs. This happens in the main thread. --8<---------------cut here---------------start------------->8--- M-x debbugs-gnu-bugs RET RET --8<---------------cut here---------------end--------------->8--- Retrieve the most recent 100 bugs. This happens in another thread. --8<---------------cut here---------------start------------->8--- M-x debbugs-gnu-bugs RET -100 RET --8<---------------cut here---------------end--------------->8--- You'll see the error. --8<---------------cut here---------------start------------->8--- Error #<thread debbugs>: (error "Attempt to accept output from process debbugs.gnu.org locked to thread #<thread 0xc288a0>") --8<---------------cut here---------------end--------------->8--- BTW, in a short discussion on emacs-devel, Stefan Monnier proposed to fix this problem in url-http.el. Don't know what's the better approach. > Thanks, > Thomas Best regards, Michael. ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <87wmit9nvh.fsf_-_@gmx.de>]
* bug#73199: url-retrieve is not thread-safe [not found] ` <87wmit9nvh.fsf_-_@gmx.de> @ 2024-09-30 15:40 ` Eli Zaretskii 2024-09-30 16:42 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 1 reply; 11+ messages in thread From: Eli Zaretskii @ 2024-09-30 15:40 UTC (permalink / raw) To: Michael Albinus; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 > Cc: AlexHarsanyi@gmail.com, Thomas Fitzsimmons <fitzsim@fitzsim.org>, > monnier@iro.umontreal.ca > Date: Mon, 30 Sep 2024 17:12:34 +0200 > From: Michael Albinus via "Bug reports for GNU Emacs, > the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org> > > > BTW, in a short discussion on emacs-devel, Stefan Monnier proposed to > > fix this problem in url-http.el. Don't know what's the better approach. > > I gave it a try. The appended patch seems to fix the problem. At least > in my use case, there's no error anymore when I use debbugs w/o the > advice in debbugs-compat.el. > > Comments? ENOPATCH ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-09-30 15:40 ` bug#73199: url-retrieve " Eli Zaretskii @ 2024-09-30 16:42 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-09-30 17:38 ` Eli Zaretskii 0 siblings, 1 reply; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-09-30 16:42 UTC (permalink / raw) To: Eli Zaretskii; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 [-- Attachment #1: Type: text/plain, Size: 132 bytes --] Eli Zaretskii <eliz@gnu.org> writes: >> Comments? > > ENOPATCH Oops, sorry. I've appended the vc-dir buffer, not the vc-diff ... [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: Type: text/x-patch, Size: 2890 bytes --] diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el index 184c1278072..019ba2d7e57 100644 --- a/lisp/url/url-http.el +++ b/lisp/url/url-http.el @@ -74,7 +74,9 @@ url-http-proxy-basic-auth-storage (defvar url-http-open-connections (make-hash-table :test 'equal :size 17) - "A hash table of all open network connections.") + "A hash table of all open network connections. +If Emacs is compiled with thread support, the key is a list `(host port +thread)'. Otherwise, it is a cons cell `(host . port)'.") (defvar url-http-version "1.1" "What version of HTTP we advertise, as a string. @@ -154,26 +156,33 @@ url-http-debug (apply #'url-debug 'http args)) (defun url-http-mark-connection-as-busy (host port proc) - (url-http-debug "Marking connection as busy: %s:%d %S" host port proc) - (set-process-query-on-exit-flag proc t) - (puthash (cons host port) - (delq proc (gethash (cons host port) url-http-open-connections)) - url-http-open-connections) - proc) + (let ((key (if main-thread + (list host port (funcall 'current-thread)) (cons host port)))) + (url-http-debug "Marking connection as busy: %s:%d %S" host port proc) + (set-process-query-on-exit-flag proc t) + (puthash key + (delq proc (gethash key url-http-open-connections)) + url-http-open-connections) + proc)) (defun url-http-mark-connection-as-free (host port proc) - (url-http-debug "Marking connection as free: %s:%d %S" host port proc) - (when (memq (process-status proc) '(open run connect)) - (set-process-buffer proc nil) - (set-process-sentinel proc 'url-http-idle-sentinel) - (set-process-query-on-exit-flag proc nil) - (puthash (cons host port) - (cons proc (gethash (cons host port) url-http-open-connections)) - url-http-open-connections)) - nil) + (let ((key (if main-thread + (list host port (funcall 'current-thread)) (cons host port)))) + (url-http-debug "Marking connection as free: %s:%d %S" host port proc) + (when (memq (process-status proc) '(open run connect)) + (set-process-buffer proc nil) + (set-process-sentinel proc 'url-http-idle-sentinel) + (set-process-query-on-exit-flag proc nil) + (puthash key + (cons proc (gethash key url-http-open-connections)) + url-http-open-connections)) + nil)) (defun url-http-find-free-connection (host port &optional gateway-method) - (let ((conns (gethash (cons host port) url-http-open-connections)) + (let ((conns (gethash + (if main-thread + (list host port (funcall 'current-thread)) (cons host port)) + url-http-open-connections)) (connection nil)) (while (and conns (not connection)) (if (not (memq (process-status (car conns)) '(run open connect))) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-09-30 16:42 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-09-30 17:38 ` Eli Zaretskii 2024-10-02 16:34 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 1 reply; 11+ messages in thread From: Eli Zaretskii @ 2024-09-30 17:38 UTC (permalink / raw) To: Michael Albinus; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 > From: Michael Albinus <michael.albinus@gmx.de> > Cc: 73199@debbugs.gnu.org, AlexHarsanyi@gmail.com, fitzsim@fitzsim.org, > monnier@iro.umontreal.ca > Date: Mon, 30 Sep 2024 18:42:55 +0200 > > Oops, sorry. I've appended the vc-dir buffer, not the vc-diff ... Thanks. I'd appreciate if you could explain why url-retrieve is currently not thread-safe, and how this patch is supposed to solve that. ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-09-30 17:38 ` Eli Zaretskii @ 2024-10-02 16:34 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-10-02 18:30 ` Eli Zaretskii 2024-10-10 11:29 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 2 replies; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-02 16:34 UTC (permalink / raw) To: Eli Zaretskii; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 Eli Zaretskii <eliz@gnu.org> writes: >> From: Michael Albinus <michael.albinus@gmx.de> >> Cc: 73199@debbugs.gnu.org, AlexHarsanyi@gmail.com, fitzsim@fitzsim.org, >> monnier@iro.umontreal.ca >> Date: Mon, 30 Sep 2024 18:42:55 +0200 >> >> Oops, sorry. I've appended the vc-dir buffer, not the vc-diff ... > > Thanks. I'd appreciate if you could explain why url-retrieve is > currently not thread-safe, and how this patch is supposed to solve > that. In <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=73199#14>, there's a recipe for reproduction. The general problem is when you want to access the same HTTP server from a different thread, and url-http-attempt-keepalives is set to t. This happens, for example, in debbugs 0.41. Let's assume, there is an access to debbugs:443 from a given thread, for example the main thread. Soap-client serves. It also binds url-http-attempt-keepalives to t, the https process stays alive. Later on, there is an access to debbugs:443 from another thread. It checks, whether there is a running process for that target, and tries to reuse. We get the error --8<---------------cut here---------------start------------->8--- Error #<thread debbugs>: (error "Attempt to accept output from process debbugs.gnu.org locked to thread #<thread 0xc288a0>") --8<---------------cut here---------------end--------------->8--- My patch tries to fix this. The list of still open processes is the hash table url-http-open-connections. It has the ky (cons host port), and as value a list of processes. My patch changes this such a way, that the key is now (list host port thread). Therefore, only open processes which belong to the same thread are checked. This seems to work sufficiently. Best regards, Michael. ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-10-02 16:34 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-02 18:30 ` Eli Zaretskii 2024-10-10 11:29 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 1 sibling, 0 replies; 11+ messages in thread From: Eli Zaretskii @ 2024-10-02 18:30 UTC (permalink / raw) To: Michael Albinus; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-10-02 16:34 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-10-02 18:30 ` Eli Zaretskii @ 2024-10-10 11:29 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-10-10 13:10 ` Eli Zaretskii 1 sibling, 1 reply; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-10 11:29 UTC (permalink / raw) To: Eli Zaretskii; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 Michael Albinus <michael.albinus@gmx.de> writes: > Eli Zaretskii <eliz@gnu.org> writes: > >>> From: Michael Albinus <michael.albinus@gmx.de> >>> Cc: 73199@debbugs.gnu.org, AlexHarsanyi@gmail.com, fitzsim@fitzsim.org, >>> monnier@iro.umontreal.ca >>> Date: Mon, 30 Sep 2024 18:42:55 +0200 >>> >>> Oops, sorry. I've appended the vc-dir buffer, not the vc-diff ... >> >> Thanks. I'd appreciate if you could explain why url-retrieve is >> currently not thread-safe, and how this patch is supposed to solve >> that. > > In <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=73199#14>, there's a > recipe for reproduction. > > The general problem is when you want to access the same HTTP server from > a different thread, and url-http-attempt-keepalives is set to t. This > happens, for example, in debbugs 0.41. > > Let's assume, there is an access to debbugs:443 from a given thread, for > example the main thread. Soap-client serves. It also binds > url-http-attempt-keepalives to t, the https process stays alive. > > Later on, there is an access to debbugs:443 from another thread. It > checks, whether there is a running process for that target, and tries to > reuse. We get the error > > Error #<thread debbugs>: (error "Attempt to accept output from process debbugs.gnu.org locked to thread #<thread 0xc288a0>") > > My patch tries to fix this. The list of still open processes is the hash > table url-http-open-connections. It has the ky (cons host port), and as > value a list of processes. > > My patch changes this such a way, that the key is now (list host port > thread). Therefore, only open processes which belong to the same thread > are checked. > > This seems to work sufficiently. Ping. Any comments? Otherwise, I'll install the patch in a couple of days. Best regards, Michael. ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-10-10 11:29 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-10 13:10 ` Eli Zaretskii 2024-10-11 10:44 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 1 reply; 11+ messages in thread From: Eli Zaretskii @ 2024-10-10 13:10 UTC (permalink / raw) To: Michael Albinus; +Cc: AlexHarsanyi, fitzsim, monnier, 73199 > From: Michael Albinus <michael.albinus@gmx.de> > Cc: AlexHarsanyi@gmail.com, fitzsim@fitzsim.org, monnier@iro.umontreal.ca, > 73199@debbugs.gnu.org > Date: Thu, 10 Oct 2024 13:29:42 +0200 > > Ping. Any comments? Otherwise, I'll install the patch in a couple of days. Sorry, too much stuff on my table. Please go ahead and install, I think the patch is okay. (I presume you know about set-process-thread, and that it doesn't help in this scenario?) ^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#73199: url-retrieve is not thread-safe 2024-10-10 13:10 ` Eli Zaretskii @ 2024-10-11 10:44 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 0 siblings, 0 replies; 11+ messages in thread From: Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-10-11 10:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: AlexHarsanyi, fitzsim, monnier, 73199-done Version: 31.1 Eli Zaretskii <eliz@gnu.org> writes: Hi Eli, > Please go ahead and install, I think the patch is okay. Done. I'm closing the bug, therefore. > (I presume you know about set-process-thread, and that it doesn't help > in this scenario?) Yes, I know it. But I cannot use it; the process is already in the proper thread where it should be. Best regards, Michael. ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-10-11 10:44 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-09-12 14:20 bug#73199: soap-client; soap-invoke-internal is not thread-safe Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-09-14 14:06 ` Thomas Fitzsimmons 2024-09-20 9:58 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors [not found] ` <87wmit9nvh.fsf_-_@gmx.de> 2024-09-30 15:40 ` bug#73199: url-retrieve " Eli Zaretskii 2024-09-30 16:42 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-09-30 17:38 ` Eli Zaretskii 2024-10-02 16:34 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-10-02 18:30 ` Eli Zaretskii 2024-10-10 11:29 ` Michael Albinus via Bug reports for GNU Emacs, the Swiss army knife of text editors 2024-10-10 13:10 ` Eli Zaretskii 2024-10-11 10:44 ` 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).