aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/remote-store.cc5
-rw-r--r--src/libstore/worker-protocol.hh2
-rw-r--r--src/nix-daemon/nix-daemon.cc16
3 files changed, 17 insertions, 6 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 080cef93d..d53037558 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -411,8 +411,9 @@ void RemoteStore::addToStore(const ValidPathInfo & info, Source & source,
<< info.references << info.registrationTime << info.narSize
<< info.ultimate << info.sigs << info.ca
<< repair << !checkSigs;
- copyNAR(source, conn->to);
- conn->processStderr();
+ bool tunnel = GET_PROTOCOL_MINOR(conn->daemonVersion) >= 21;
+ if (!tunnel) copyNAR(source, conn->to);
+ conn->processStderr(0, tunnel ? &source : nullptr);
}
}
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index 996e1d253..5ebdfaf13 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -6,7 +6,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f
-#define PROTOCOL_VERSION 0x114
+#define PROTOCOL_VERSION 0x115
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
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;
}