aboutsummaryrefslogtreecommitdiff
path: root/src/nix-daemon/nix-daemon.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-03-26 23:36:30 +0200
committerEelco Dolstra <edolstra@gmail.com>2018-05-30 13:26:48 +0200
commit6185d25e523a3cd223dd6f6aca10cf6ff15b4823 (patch)
tree87562dc111974054360ae7eb74b842b7fa4ec32d /src/nix-daemon/nix-daemon.cc
parent23d6bb583afb2b98cc9152911c12a37ba56d1e39 (diff)
Make 'nix copy --to daemon' run in constant memory (daemon side)
Continuation of 97002b684c902dadcd351a67208f9c2a88ff8f8f. This makes the daemon use constant memory. For example, it reduces the daemon's maximum RSS on $ nix copy --from ~/my-nix --to daemon /nix/store/1n7x0yv8vq6zi90hfmian84vdhd04bgp-blender-2.79a from 264 MiB to 7 MiB. We now use a TunnelSource to prevent the connection from ending up in an undefined state if an exception is thrown while the NAR is being sent. Issue https://github.com/NixOS/nix/issues/1681.
Diffstat (limited to 'src/nix-daemon/nix-daemon.cc')
-rw-r--r--src/nix-daemon/nix-daemon.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index baf169804..590f96211 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -690,12 +690,22 @@ static void performOp(TunnelLogger * logger, ref<LocalStore> store,
if (!trusted)
info.ultimate = false;
- TeeSink tee(from);
- parseDump(tee, tee.source);
+ std::string saved;
+ std::unique_ptr<Source> source;
+ if (GET_PROTOCOL_MINOR(clientVersion) >= 21)
+ source = std::make_unique<TunnelSource>(from);
+ else {
+ TeeSink tee(from);
+ parseDump(tee, tee.source);
+ saved = std::move(*tee.source.data);
+ source = std::make_unique<StringSource>(saved);
+ }
logger->startWork();
- store.cast<Store>()->addToStore(info, tee.source.data, (RepairFlag) repair,
+
+ store.cast<Store>()->addToStore(info, *source, (RepairFlag) repair,
dontCheckSigs ? NoCheckSigs : CheckSigs, nullptr);
+
logger->stopWork();
break;
}