Skip to content

Commit

Permalink
Bare minimum ssh-ng:// extensions for Hydra
Browse files Browse the repository at this point in the history
This is not as comprehensive as #10748, but I am also interested in
figuring out whether all those additions are in fact necessary.

This is bare minimum needed for
NixOS/hydra#1445, which has notable gaps but
nevertheless reimplements enough with `ssh-ng://` to past all tests.

I would like to merge this change as definitely necessary, and unclear
whether sufficient. Then I would iterate on the corresponding Hydra PR
until it seems potentially correct, seeing what, if any, further Nix API
changes are necessary.
  • Loading branch information
Ericson2314 committed Feb 17, 2025
1 parent f0dbfad commit 64f91d0
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 2 deletions.
17 changes: 16 additions & 1 deletion src/libstore/remote-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<BuildResult>::read(*this, *conn);
return conn->getBuildDerivationResponse(*this, &conn.daemonException);
}


std::function<BuildResult()> RemoteStore::buildDerivationAsync(
const StorePath & drvPath, const BasicDerivation & drv,
BuildMode buildMode)
{
// Until we have C++23 std::move_only_function
auto conn = std::make_shared<ConnectionHandle>(getConnection());
(*conn)->putBuildDerivationRequest(*this, &conn->daemonException, drvPath, drv, buildMode);
conn->processStderr();

return [this,conn]() -> BuildResult {
return (*conn)->getBuildDerivationResponse(*this, &conn->daemonException);
};
}


Expand Down
10 changes: 10 additions & 0 deletions src/libstore/remote-store.hh
Original file line number Diff line number Diff line change
Expand Up @@ -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<BuildResult()> buildDerivationAsync(
const StorePath & drvPath, const BasicDerivation & drv,
BuildMode buildMode);

void ensurePath(const StorePath & path) override;

void addTempRoot(const StorePath & path) override;
Expand Down
2 changes: 1 addition & 1 deletion src/libstore/ssh-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ ref<RemoteStore::Connection> 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;
Expand Down
5 changes: 5 additions & 0 deletions src/libstore/ssh-store.hh
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ struct SSHStoreConfig : virtual RemoteStoreConfig, virtual CommonSSHStoreConfig
const Setting<Strings> 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";
Expand Down

0 comments on commit 64f91d0

Please sign in to comment.