civodul pushed a commit to branch master
in repository guix.

commit 9a8f9f84cc1672c45c2d204d9c234c932a8cb623
Author: Ludovic Courtès <l...@gnu.org>
Date:   Thu Dec 1 22:53:37 2016 +0100

    daemon: Buffer data sent to clients by the 'export-path' RPC.
    
    Before that we'd have STDERR_WRITE round trips for very small amounts of
    data, ranging from a few bytes for the metadata of nars to the size of
    one file being exported.
    
    With this change, something like:
    
      guix archive --export 
/gnu/store/5rrsbaghh5ix1vjcicsl60gsxilhjnf2-coreutils-8.25 | dd of=/dev/null
    
    reports a throughput of 35 MB/s instead of 25 MB/s before.
    
    * nix/nix-daemon/nix-daemon.cc (TunnelSink): Inherit from 'BufferedSink'
    rather than 'Sink'.  Rename 'operator ()' to 'write'.
    (performOp) <wopExportPath>: Add 'sink.flush' call.
---
 nix/nix-daemon/nix-daemon.cc |    7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc
index 9b29b3e..682f9a2 100644
--- a/nix/nix-daemon/nix-daemon.cc
+++ b/nix/nix-daemon/nix-daemon.cc
@@ -203,11 +203,11 @@ static void stopWork(bool success = true, const string & 
msg = "", unsigned int
 }
 
 
-struct TunnelSink : Sink
+struct TunnelSink : BufferedSink
 {
     Sink & to;
-    TunnelSink(Sink & to) : to(to) { }
-    virtual void operator () (const unsigned char * data, size_t len)
+    TunnelSink(Sink & to) : BufferedSink(64 * 1024), to(to) { }
+    virtual void write(const unsigned char * data, size_t len)
     {
         writeInt(STDERR_WRITE, to);
         writeString(data, len, to);
@@ -433,6 +433,7 @@ static void performOp(bool trusted, unsigned int 
clientVersion,
         startWork();
         TunnelSink sink(to);
         store->exportPath(path, sign, sink);
+        sink.flush();
         stopWork();
         writeInt(1, to);
         break;

Reply via email to