about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-05-01T13·00+0200
committerEelco Dolstra <edolstra@gmail.com>2017-05-01T15·30+0200
commitca9f589a93309ca548d772f1634169007568d6a0 (patch)
treea6f38ee0777f6de398c2677bd8f1ca9f08b53131
parentb986c7f8b14c1270e012f22183737ebbaa33173d (diff)
build-remote: Don't copy the .drv closure
Since build-remote uses buildDerivation() now, we don't need to copy
the .drv file anymore. This greatly reduces the set of input paths
copied to the remote side (e.g. from 392 to 51 store paths for GNU
hello on x86_64-darwin).
-rw-r--r--src/build-remote/build-remote.cc7
-rw-r--r--src/libstore/build.cc17
2 files changed, 8 insertions, 16 deletions
diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc
index f3195f6317d9..1ee8a625b6bc 100644
--- a/src/build-remote/build-remote.cc
+++ b/src/build-remote/build-remote.cc
@@ -269,8 +269,11 @@ connected:
         copyPaths(store, ref<Store>(sshStore), inputs);
         uploadLock = -1;
 
-        printError("building ‘%s’ on ‘%s’", drvPath, hostName);
-        sshStore->buildDerivation(drvPath, readDerivation(drvPath));
+        BasicDerivation drv(readDerivation(drvPath));
+        drv.inputSrcs = inputs;
+
+        printError("building ‘%s’ on ‘%s’", drvPath, storeUri);
+        sshStore->buildDerivation(drvPath, drv);
 
         PathSet missing;
         for (auto & path : outputs)
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 8b869063d5e1..a0efd880400c 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1622,23 +1622,12 @@ HookReply DerivationGoal::tryBuildHook()
     hook = std::move(worker.hook);
 
     /* Tell the hook all the inputs that have to be copied to the
-       remote system.  This unfortunately has to contain the entire
-       derivation closure to ensure that the validity invariant holds
-       on the remote system.  (I.e., it's unfortunate that we have to
-       list it since the remote system *probably* already has it.) */
-    PathSet allInputs;
-    allInputs.insert(inputPaths.begin(), inputPaths.end());
-    worker.store.computeFSClosure(drvPath, allInputs);
-
-    string s;
-    for (auto & i : allInputs) { s += i; s += ' '; }
-    writeLine(hook->toHook.writeSide.get(), s);
+       remote system. */
+    writeLine(hook->toHook.writeSide.get(), concatStringsSep(" ", inputPaths));
 
     /* Tell the hooks the missing outputs that have to be copied back
        from the remote system. */
-    s = "";
-    for (auto & i : missingPaths) { s += i; s += ' '; }
-    writeLine(hook->toHook.writeSide.get(), s);
+    writeLine(hook->toHook.writeSide.get(), concatStringsSep(" ", missingPaths));
 
     hook->toHook.writeSide = -1;