~ruther/guix-local

9a8f9f84cc1672c45c2d204d9c234c932a8cb623 — Ludovic Courtès 9 years ago 0b72475
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.
1 files changed, 4 insertions(+), 3 deletions(-)

M nix/nix-daemon/nix-daemon.cc
M nix/nix-daemon/nix-daemon.cc => nix/nix-daemon/nix-daemon.cc +4 -3
@@ 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;