diff options
Diffstat (limited to 'guix-build-coordinator/utils.scm')
-rw-r--r-- | guix-build-coordinator/utils.scm | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/guix-build-coordinator/utils.scm b/guix-build-coordinator/utils.scm index d30fa9f..0b9c8f7 100644 --- a/guix-build-coordinator/utils.scm +++ b/guix-build-coordinator/utils.scm @@ -39,7 +39,9 @@ substitute-derivation - narinfo-string)) + narinfo-string + + retry-on-error)) (define %worker-thread-args @@ -392,3 +394,25 @@ References: ~a~%" (signature (base64-encode-string (canonical-sexp->string (signed-string info))))) (format #f "~aSignature: 1;~a;~a~%" info (gethostname) signature))) + +(define* (retry-on-error f #:key times delay) + (let loop ((attempt 1)) + (match (with-exception-handler + (lambda (exn) + (cons #f exn)) + (lambda () + (cons #t (f))) + #:unwind? #t) + ((#t . return-value) + return-value) + ((#f . exn) + (if (>= attempt times) + (raise-exception exn) + (begin + (simple-format + (current-error-port) + "error: ~A, retrying in ~A\n" + exn + delay) + (sleep delay) + (loop (+ 1 attempt)))))))) |