summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-09-17 22:00:26 +0200
committerLudovic Courtès <ludo@gnu.org>2018-09-17 22:10:31 +0200
commit3809824199cdd52446176c9cd4761dd09f732542 (patch)
treec895b78c0f2b317b7aceb586313686034189bd4b
parentd68aa41573bff6614a73ea28249cfd88fe206d38 (diff)
downloadguix-3809824199cdd52446176c9cd4761dd09f732542.tar.gz
store: Add missing buffer flushes.
This could result in deadlock in unusual situations, whereby we'd start
waiting for a reply while the query hasn't been flushed to the socket.

* guix/store.scm (buffering-output-port)[flush]: Add call to
'force-output'.
(add-to-store): Add call to 'write-buffered-output'.
-rw-r--r--guix/store.scm2
1 files changed, 2 insertions, 0 deletions
diff --git a/guix/store.scm b/guix/store.scm
index af7f6980cf..cc5dcef247 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -770,6 +770,7 @@ bytevector) as its internal buffer, and a thunk to flush this output port."
 
   (define (flush)
     (put-bytevector port buffer 0 total)
+    (force-output port)
     (set! total 0))
 
   (define (write bv offset count)
@@ -927,6 +928,7 @@ path."
              (write-int (if recursive? 1 0) port)
              (write-string hash-algo port)
              (write-file file-name port #:select? select?)
+             (write-buffered-output server)
              (let loop ((done? (process-stderr server)))
                (or done? (loop (process-stderr server))))
              (read-store-path port)))))