1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-29 06:21:14 +02:00

Make 'nix copy --to daemon' run in constant memory (daemon side)

Continuation of 97002b684c. 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.
This commit is contained in:
Eelco Dolstra 2018-03-26 23:36:30 +02:00
parent 23d6bb583a
commit 6185d25e52
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 17 additions and 6 deletions

View file

@ -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;
}