diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 533ea557d25..3bc1c38204b 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -767,7 +767,22 @@ BuildResult RemoteStore::buildDerivation(const StorePath & drvPath, const BasicD auto conn(getConnection()); conn->putBuildDerivationRequest(*this, &conn.daemonException, drvPath, drv, buildMode); conn.processStderr(); - return WorkerProto::Serialise::read(*this, *conn); + return conn->getBuildDerivationResponse(*this, &conn.daemonException); +} + + +std::function RemoteStore::buildDerivationAsync( + const StorePath & drvPath, const BasicDerivation & drv, + BuildMode buildMode) +{ + // Until we have C++23 std::move_only_function + auto conn = std::make_shared(getConnection()); + (*conn)->putBuildDerivationRequest(*this, &conn->daemonException, drvPath, drv, buildMode); + conn->processStderr(); + + return [this,conn]() -> BuildResult { + return (*conn)->getBuildDerivationResponse(*this, &conn->daemonException); + }; } diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index ea6cd471eb5..c22413d1320 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -122,6 +122,16 @@ public: BuildResult buildDerivation(const StorePath & drvPath, const BasicDerivation & drv, BuildMode buildMode) override; + /** + * Note, the returned function must only be called once, or we'll + * try to read from the connection twice. + * + * @todo Use C++23 `std::move_only_function`. + */ + std::function buildDerivationAsync( + const StorePath & drvPath, const BasicDerivation & drv, + BuildMode buildMode); + void ensurePath(const StorePath & path) override; void addTempRoot(const StorePath & path) override; diff --git a/src/libstore/ssh-store.cc b/src/libstore/ssh-store.cc index 954a9746774..8adece3efed 100644 --- a/src/libstore/ssh-store.cc +++ b/src/libstore/ssh-store.cc @@ -209,7 +209,7 @@ ref SSHStore::openConnection() } command.insert(command.end(), extraRemoteProgramArgs.begin(), extraRemoteProgramArgs.end()); - conn->sshConn = master.startCommand(std::move(command)); + conn->sshConn = master.startCommand(std::move(command), std::list{extraSshArgs}); conn->to = FdSink(conn->sshConn->in.get()); conn->from = FdSource(conn->sshConn->out.get()); return conn; diff --git a/src/libstore/ssh-store.hh b/src/libstore/ssh-store.hh index 29a2a8b2c2d..be15836985c 100644 --- a/src/libstore/ssh-store.hh +++ b/src/libstore/ssh-store.hh @@ -18,6 +18,11 @@ struct SSHStoreConfig : virtual RemoteStoreConfig, virtual CommonSSHStoreConfig const Setting remoteProgram{ this, {"nix-daemon"}, "remote-program", "Path to the `nix-daemon` executable on the remote machine."}; + /** + * Hack for hydra + */ + Strings extraSshArgs = {}; + const std::string name() override { return "Experimental SSH Store";