diff options
author | Christopher Baines <mail@cbaines.net> | 2023-05-10 10:50:51 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2023-05-10 10:50:51 +0100 |
commit | 3f6473c0d296ed6efab1feebcacd76fc597bb6ef (patch) | |
tree | da7217ef31c485d8e11db168f8d0bf50e60f029a | |
parent | 930e1d5b489797666602674247efe82756ca4082 (diff) | |
download | build-coordinator-3f6473c0d296ed6efab1feebcacd76fc597bb6ef.tar build-coordinator-3f6473c0d296ed6efab1feebcacd76fc597bb6ef.tar.gz |
Move output hash related operations in to the dedicated thread
So in case of connection loss, this still happens and the work to compute the
hash isn't wasted.
-rw-r--r-- | guix-build-coordinator/agent-messaging/http/server.scm | 110 |
1 files changed, 51 insertions, 59 deletions
diff --git a/guix-build-coordinator/agent-messaging/http/server.scm b/guix-build-coordinator/agent-messaging/http/server.scm index 7fe3dd4..389277f 100644 --- a/guix-build-coordinator/agent-messaging/http/server.scm +++ b/guix-build-coordinator/agent-messaging/http/server.scm @@ -280,7 +280,7 @@ port. Also, the port used can be changed by passing the --port option.\n" (define logger (build-coordinator-logger build-coordinator)) - (define (compute-hash-of-uploaded-output channel filename) + (define (compute-hash-of-uploaded-output channel filename output-filename) (with-exception-handler (lambda (exn) (log-msg logger @@ -307,22 +307,36 @@ port. Also, the port used can be changed by passing the --port option.\n" exn) (lambda () - (bytevector->nix-base32-string - (call-with-input-file filename - (lambda (compressed-port) - (call-with-lzip-input-port - compressed-port - (lambda (port) - (port-hash* (hash-algorithm sha256) - port - #:reporter - (progress-reporter/hash - (stat:size (stat filename)) - (lambda (processed-bytes) - (put-message - channel - `(update ,filename ,processed-bytes)))))))) - #:binary #t))) + (let ((hash + (bytevector->nix-base32-string + (call-with-input-file filename + (lambda (compressed-port) + (call-with-lzip-input-port + compressed-port + (lambda (port) + (port-hash* (hash-algorithm sha256) + port + #:reporter + (progress-reporter/hash + (stat:size (stat filename)) + (lambda (processed-bytes) + (put-message + channel + `(update ,filename ,processed-bytes)))))))) + #:binary #t)))) + + (log-msg logger + 'DEBUG + "computed the hash of " filename ", renaming") + + (call-with-output-file (string-append output-filename ".hash") + (lambda (port) + (simple-format port "~A\n" hash))) + + (rename-file filename + output-filename) + + hash)) #:unwind? #t)) (let ((channel (make-channel)) @@ -336,7 +350,7 @@ port. Also, the port used can be changed by passing the --port option.\n" (log-msg 'ERROR "exception in output hash thread: " exn)) (lambda () (match (get-message channel) - (('request build-uuid filename update-channel) + (('request build-uuid filename output-filename update-channel) (or (and=> (hash-ref update-channels-by-filename filename) @@ -360,7 +374,8 @@ port. Also, the port used can be changed by passing the --port option.\n" (list 'result filename (compute-hash-of-uploaded-output channel - filename)))))))) + filename + output-filename)))))))) (('update filename bytes-processed) (for-each (lambda (update-channel) @@ -394,7 +409,8 @@ port. Also, the port used can be changed by passing the --port option.\n" request response-port build-uuid - tmp-output-file-name) + tmp-output-file-name + output-file-name) (let ((channel (make-channel))) (define (write-to-response-port response) (display response response-port) @@ -416,7 +432,7 @@ port. Also, the port used can be changed by passing the --port option.\n" (const 'timeout))))) (put-message output-hash-channel - (list 'request build-uuid tmp-output-file-name channel)) + (list 'request build-uuid tmp-output-file-name output-file-name channel)) (let loop ((previous-bytes-processed 0) (message (get-message* channel))) @@ -770,25 +786,13 @@ port. Also, the port used can be changed by passing the --port option.\n" ;; Make sure NGinx gets the response headers (force-output (request-port request)) - (let ((result (compute-output-hash-via-channel - output-hash-channel - request - response-port - uuid - tmp-output-file-name))) - ;; TODO: Maybe do something different here to - ;; indicate the issue to the agent? - (unless (exception? result) - (log-msg logger - 'DEBUG - "computed the hash of " tmp-output-file-name ", renaming") - - (call-with-output-file (string-append output-file-name ".hash") - (lambda (port) - (simple-format port "~A\n" result))) - - (rename-file tmp-output-file-name - output-file-name)))))) + (compute-output-hash-via-channel + output-hash-channel + request + response-port + uuid + tmp-output-file-name + output-file-name)))) (render-json '(("error" . "access denied")) #:code 403)))) @@ -851,25 +855,13 @@ port. Also, the port used can be changed by passing the --port option.\n" ;; Make sure NGinx gets the response headers (force-output (request-port request)) - (let ((result (compute-output-hash-via-channel - output-hash-channel - request - response-port - uuid - tmp-output-file-name))) - ;; TODO: Maybe do something different here to - ;; indicate the issue to the agent? - (unless (exception? result) - (log-msg logger - 'DEBUG - "computed the hash of " tmp-output-file-name ", renaming") - - (call-with-output-file (string-append output-file-name ".hash") - (lambda (port) - (simple-format port "~A\n" result))) - - (rename-file tmp-output-file-name - output-file-name)))))) + (compute-output-hash-via-channel + output-hash-channel + request + response-port + uuid + tmp-output-file-name + output-file-name)))) (render-json '(("error" . "access denied")) #:code 403)))) |