Skip to content

Commit

Permalink
WIP ssh-ng://
Browse files Browse the repository at this point in the history
  • Loading branch information
Ericson2314 committed Feb 14, 2025
1 parent 45d075e commit f3dc4e9
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 39 deletions.
8 changes: 4 additions & 4 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11-small";

inputs.nix = {
url = "github:NixOS/nix/legacy-ssh-extensions-for-hydra";
url = "github:NixOS/nix/ssh-ng-extensions-for-hydra";
inputs.nixpkgs.follows = "nixpkgs";

# hide nix dev tooling from our lock file
Expand Down
33 changes: 16 additions & 17 deletions src/hydra-queue-runner/build-remote.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

#include "build-result.hh"
#include "path.hh"
#include "legacy-ssh-store.hh"
#include "ssh-store.hh"
#include "serve-protocol.hh"
#include "state.hh"
#include "current-process.hh"
Expand Down Expand Up @@ -119,11 +119,10 @@ static BuildResult performBuild(
Store & localStore,
StorePath drvPath,
const BasicDerivation & drv,
const ServeProto::BuildOptions & options,
counter & nrStepsBuilding
)
{
auto kont = conn.store->buildDerivationAsync(drvPath, drv, options);
auto kont = conn.store->buildDerivationAsync(drvPath, drv, bmNormal);

BuildResult result;

Expand Down Expand Up @@ -238,7 +237,6 @@ void RemoteResult::updateWithBuildResult(const nix::BuildResult & buildResult)

void State::buildRemote(ref<Store> destStore,
::Machine::ptr machine, Step::ptr step,
const ServeProto::BuildOptions & buildOptions,
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
std::function<void(StepState)> updateStep,
NarMemberDatas & narMembers)
Expand All @@ -258,23 +256,26 @@ void State::buildRemote(ref<Store> destStore,
.machine = machine,
.store = [&]{
auto * pSpecified = std::get_if<StoreReference::Specified>(&machine->storeUri.variant);
if (!pSpecified || pSpecified->scheme != "ssh") {
throw Error("Currently, only (legacy-)ssh stores are supported!");
if (!pSpecified || pSpecified->scheme != "ssh-ng") {
throw Error("Currently, only ssh-ng:// stores are supported!");
}

auto remoteStore = machine->openStore().dynamic_pointer_cast<LegacySSHStore>();
auto remoteStore = machine->openStore().dynamic_pointer_cast<RemoteStore>();
auto remoteStoreConfig = std::dynamic_pointer_cast<SSHStoreConfig>(remoteStore);
assert(remoteStore);

if (machine->isLocalhost()) {
auto rp_new = remoteStore->remoteProgram.get();
auto rp_new = remoteStoreConfig->remoteProgram.get();
rp_new.push_back("--builders");
rp_new.push_back("");
const_cast<nix::Setting<Strings> &>(remoteStore->remoteProgram).assign(rp_new);
const_cast<nix::Setting<Strings> &>(remoteStoreConfig->remoteProgram).assign(rp_new);
}
remoteStore->extraSshArgs = {
remoteStoreConfig->extraSshArgs = {
"-a", "-oBatchMode=yes", "-oConnectTimeout=60", "-oTCPKeepAlive=yes"
};
const_cast<nix::Setting<int> &>(remoteStore->logFD).assign(logFD.get());

// TODO logging
//const_cast<nix::Setting<int> &>(remoteStore->logFD).assign(logFD.get());

return nix::ref{remoteStore};
}(),
Expand All @@ -283,12 +284,10 @@ void State::buildRemote(ref<Store> destStore,
{
auto activeStepState(activeStep->state_.lock());
if (activeStepState->cancelled) throw Error("step cancelled");
activeStepState->pid = conn.store->getConnectionPid();
}

Finally clearPid([&]() {
auto activeStepState(activeStep->state_.lock());
activeStepState->pid = -1;

/* FIXME: there is a slight race here with step
cancellation in State::processQueueChange(), which
Expand All @@ -299,9 +298,10 @@ void State::buildRemote(ref<Store> destStore,
});

Finally updateStats([&]() {
auto stats = conn.store->getConnectionStats();
bytesReceived += stats.bytesReceived;
bytesSent += stats.bytesSent;
// TODO
//auto stats = conn.store->getConnectionStats();
//bytesReceived += stats.bytesReceived;
//bytesSent += stats.bytesSent;
});

{
Expand Down Expand Up @@ -341,7 +341,6 @@ void State::buildRemote(ref<Store> destStore,
*localStore,
step->drvPath,
resolvedDrv,
buildOptions,
nrStepsBuilding
);

Expand Down
18 changes: 6 additions & 12 deletions src/hydra-queue-runner/builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,6 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,
it). */
BuildID buildId;
std::optional<StorePath> buildDrvPath;
// Other fields set below
nix::ServeProto::BuildOptions buildOptions {
.maxLogSize = maxLogSize,
.nrRepeats = step->isDeterministic ? 1u : 0u,
.enforceDeterminism = step->isDeterministic,
.keepFailed = false,
};

auto conn(dbPool.get());

Expand Down Expand Up @@ -139,18 +132,19 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,
{
auto i = jobsetRepeats.find(std::make_pair(build2->projectName, build2->jobsetName));
if (i != jobsetRepeats.end())
buildOptions.nrRepeats = std::max(buildOptions.nrRepeats, i->second);
warn("jobset repeats is deprecated; nix stopped supporting this correctly a long time ago.");
}
}
if (!build) build = *dependents.begin();

buildId = build->id;
buildDrvPath = build->drvPath;
buildOptions.maxSilentTime = build->maxSilentTime;
buildOptions.buildTimeout = build->buildTimeout;
settings.maxLogSize = maxLogSize;
settings.maxSilentTime = build->maxSilentTime;
settings.buildTimeout = build->buildTimeout;

printInfo("performing step ‘%s’ %d times on ‘%s’ (needed by build %d and %d others)",
localStore->printStorePath(step->drvPath), buildOptions.nrRepeats + 1, machine->storeUri.render(), buildId, (dependents.size() - 1));
localStore->printStorePath(step->drvPath), 1, machine->storeUri.render(), buildId, (dependents.size() - 1));
}

if (!buildOneDone)
Expand Down Expand Up @@ -211,7 +205,7 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,

try {
/* FIXME: referring builds may have conflicting timeouts. */
buildRemote(destStore, machine, step, buildOptions, result, activeStep, updateStep, narMembers);
buildRemote(destStore, machine, step, result, activeStep, updateStep, narMembers);
} catch (Error & e) {
if (activeStep->state_.lock()->cancelled) {
printInfo("marking step %d of build %d as cancelled", stepNr, buildId);
Expand Down
2 changes: 1 addition & 1 deletion src/hydra-queue-runner/hydra-queue-runner.cc
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ void State::monitorMachinesFile()
getEnv("NIX_REMOTE_SYSTEMS").value_or(pathExists(defaultMachinesFile) ? defaultMachinesFile : ""), ":");

if (machinesFiles.empty()) {
parseMachines("localhost " +
parseMachines("ssh-ng://localhost " +
(settings.thisSystem == "x86_64-linux" ? "x86_64-linux,i686-linux" : settings.thisSystem.get())
+ " - " + std::to_string(settings.maxBuildJobs) + " 1 "
+ concatStringsSep(",", StoreConfig::getDefaultSystemFeatures()));
Expand Down
7 changes: 3 additions & 4 deletions src/hydra-queue-runner/state.hh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include "store-api.hh"
#include "sync.hh"
#include "nar-extractor.hh"
#include "legacy-ssh-store.hh"
#include "ssh-store.hh"
#include "machines.hh"


Expand Down Expand Up @@ -294,12 +294,12 @@ struct Machine : nix::Machine
// Backpointer to the machine
ptr machine;
// Opened store
nix::ref<nix::LegacySSHStore> store;
nix::ref<nix::RemoteStore> store;
};
};


class HydraConfig;
struct HydraConfig;


class State
Expand Down Expand Up @@ -542,7 +542,6 @@ private:

void buildRemote(nix::ref<nix::Store> destStore,
Machine::ptr machine, Step::ptr step,
const nix::ServeProto::BuildOptions & buildOptions,
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
std::function<void(StepState)> updateStep,
NarMemberDatas & narMembers);
Expand Down

0 comments on commit f3dc4e9

Please sign in to comment.