diff mbox series

[bug#72642] substitute: Reopen connection upon “Error in the push function” from GnuTLS.

Message ID ea0a78352a85cc604b1358bf437d1c1c4f34ec52.1723738529.git.ludo@gnu.org
State New
Headers show
Series [bug#72642] substitute: Reopen connection upon “Error in the push function” from GnuTLS. | expand

Commit Message

Ludovic Courtès Aug. 15, 2024, 4:18 p.m. UTC
This works around an occasional issue where substitution stops abruptly
due to “Error in the push function” from GnuTLS, as reported at
<https://issues.guix.gnu.org/71238> by Richard Sent.

* guix/scripts/substitute.scm (call-with-cached-connection): Add
‘error/push-error’ and ‘error/pull-error’ to the list of gnutls-error
values for which the connection is reopened.

Change-Id: Icf079dd10b16739f62fee15bc3d90bab77110576
---
 guix/scripts/substitute.scm | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Hi!

This is an attempt to work around the dreaded “Error in the push function”
coming from GnuTLS and that would cause substitution to fail (“‘guix
substitute’ died unexpectedly”).  With this patch, a new connection attempt
is made.

This is not fully satisfactory since we don’t understand yet what causes
that error, which is not supposed to happen AIUI.  But at least, it should
provide more graceful handling.

Thoughts?

Thanks,
Ludo’.


base-commit: 72e586fcae78e467d01e2add09c1db26be6bfa93
diff mbox series

Patch

diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
index 8bcbca5e7a..8db730a9c0 100755
--- a/guix/scripts/substitute.scm
+++ b/guix/scripts/substitute.scm
@@ -43,7 +43,11 @@  (define-module (guix scripts substitute)
                 #:select (uri-abbreviation nar-uri-abbreviation
                           (open-connection-for-uri
                            . guix:open-connection-for-uri)))
-  #:autoload   (gnutls) (error/invalid-session error/again error/interrupted)
+  #:autoload   (gnutls) (error/invalid-session
+                         error/again
+                         error/interrupted
+                         error/push-error
+                         error/pull-error)
   #:use-module (guix progress)
   #:use-module ((guix build syscalls)
                 #:select (set-thread-name))
@@ -426,6 +430,11 @@  (define (call-with-cached-connection uri proc)
                               (memq (first args)
                                     (list error/invalid-session
 
+                                          ;; "Error in the push function" is
+                                          ;; usually a transient error.
+                                          error/push-error
+                                          error/pull-error
+
                                           ;; XXX: These two are not properly handled in
                                           ;; GnuTLS < 3.7.3, in
                                           ;; 'write_to_session_record_port'; see