Automatically reload $NIX_REMOTE_SYSTEMS when it changes
[?]
Jun 25, 2015, 10:24 AM
SODOV2CMWA4JMIKRQNJ6MD3U3BS2XTSLINLRAG4SFY742IIJNI5QCDependencies
- [2]
FKLICOHYPrefer cached failure over unsupported system type - [3]
ODCBSLFGhydra-queue-runner: Fix segfault sorting machines by load - [4]
O64P4XJSKeep per-machine stats - [5]
IE2PRAQUhydra-queue-runner: Send build notifications - [6]
MB3TISH2Rate-limit the number of threads copying closures at the same time - [7]
N5O7VEEOImmediately abort builds that require an unsupported system type - [8]
NJJ7H64SVery basic multi-threaded queue runner - [9]
YZAI5GQUImplement a database connection pool - [10]
HLSHCK3CSupport requiredSystemFeatures - [11]
NNOCZ4ROhydra-queue-runner: Improve dispatcher - [12]
IWB3F4Z6Fail builds with previously failed steps early - [13]
OCZ4LSGGAutomatically retry aborted builds - [14]
PLOZBRTRAdd command ‘hydra-queue-runner --status’ to show current status - [15]
HUUZFPPKFix race between the queue monitor and the builder threads - [16]
GS4BE6TBAsynchronously compress build logs - [17]
T2EIYJNGOn SIGINT, shut down the builder threads - [18]
FQQRJUO4Mark builds as busy - [19]
24BMQDZAStart of single-process hydra-queue-runner - [20]
ENXUSMSVMake concurrency more robust - [21]
63W4T5PUhydra-queue-runner: More stats - [22]
GKZN4UV7Make the queue monitor more robust, and better debug output - [23]
WKJFPR77hydra-queue-runner: Maintain count of active build steps - [24]
5AIYUMTBBasic remote building
Change contents
- replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 183
counter currentJobs{0};counter nrStepsDone{0};counter totalStepTime{0}; // total time for steps, including closure copyingcounter totalStepBuildTime{0}; // total build time for stepsstruct State {typedef std::shared_ptr<State> ptr;counter currentJobs{0};counter nrStepsDone{0};counter totalStepTime{0}; // total time for steps, including closure copyingcounter totalStepBuildTime{0}; // total build time for steps};State::ptr state; - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 201[7.190]→[7.745:751](∅→∅),[7.6293]→[7.745:751](∅→∅),[7.745]→[7.745:751](∅→∅),[7.751]→[7.6097:6102](∅→∅),[7.6097]→[7.6097:6102](∅→∅),[7.6102]→[7.6294:6549](∅→∅),[7.6549]→[7.69:101](∅→∅),[7.101]→[7.6632:6670](∅→∅),[7.6632]→[7.6632:6670](∅→∅),[7.6670]→[7.102:134](∅→∅)
}};/* A RAII helper that manages the currentJobs field of Machineobjects. */struct MachineReservation{typedef std::shared_ptr<MachineReservation> ptr;Machine::ptr machine;MachineReservation(Machine::ptr machine) : machine(machine){machine->currentJobs++;}~MachineReservation(){machine->currentJobs--; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 234
typedef std::list<Machine::ptr> Machines;typedef std::map<string, Machine::ptr> Machines; - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 236
Path machinesFile;struct stat machinesFileStat; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 279
void loadMachines();/* (Re)load /etc/nix/machines. */void loadMachinesFile();/* Thread to reload /etc/nix/machines periodically. */void monitorMachinesFile(); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 314
void builder(Step::ptr step, MachineReservation::ptr reservation);void builder(Step::ptr step, Machine::ptr machine, std::shared_ptr<MaintainCount> reservation); - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 355
machinesFile = getEnv("NIX_REMOTE_SYSTEMS", "/etc/nix/machines");machinesFileStat.st_ino = 0;machinesFileStat.st_mtime = 0; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 362
void State::loadMachines()void State::loadMachinesFile() - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 364[7.7924]→[7.7924:7999](∅→∅),[7.7999]→[7.7731:7732](∅→∅),[7.7731]→[7.7731:7732](∅→∅),[7.7732]→[7.8000:8027](∅→∅)
Path machinesFile = getEnv("NIX_REMOTE_SYSTEMS", "/etc/nix/machines");Machines newMachines;string contents; - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 366
struct stat st;if (stat(machinesFile.c_str(), &st) != 0)throw SysError(format("getting stats about ‘%1%’") % machinesFile);if (st.st_ino == machinesFileStat.st_ino && st.st_mtime == machinesFileStat.st_mtime)return;printMsg(lvlDebug, "reloading machines");contents = readFile(machinesFile);machinesFileStat = st;} else {StringSet systems = StringSet({settings.thisSystem});if (settings.thisSystem == "x86_64-linux")systems.insert("i686-linux");contents = "localhost " + concatStringsSep(",", systems)+ " - " + int2String(settings.maxBuildJobs) + " 1";} - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 382
for (auto line : tokenizeString<Strings>(readFile(machinesFile), "\n")) {line = trim(string(line, 0, line.find('#')));auto tokens = tokenizeString<std::vector<std::string>>(line);if (tokens.size() < 3) continue;tokens.resize(7);Machines newMachines, oldMachines;{auto machines_(machines.lock());oldMachines = *machines_;} - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 388[7.8354]→[7.8354:8944](∅→∅),[7.8944]→[7.339:449](∅→∅),[7.449]→[7.8944:8998](∅→∅),[7.8944]→[7.8944:8998](∅→∅)
auto machine = std::make_shared<Machine>();machine->sshName = tokens[0];machine->systemTypes = tokenizeString<StringSet>(tokens[1], ",");machine->sshKey = tokens[2];if (tokens[3] != "")string2Int(tokens[3], machine->maxJobs);elsemachine->maxJobs = 1;machine->speedFactor = atof(tokens[4].c_str());machine->supportedFeatures = tokenizeString<StringSet>(tokens[5], ",");machine->mandatoryFeatures = tokenizeString<StringSet>(tokens[6], ",");for (auto & f : machine->mandatoryFeatures)machine->supportedFeatures.insert(f);newMachines.push_back(machine);}for (auto line : tokenizeString<Strings>(contents, "\n")) {line = trim(string(line, 0, line.find('#')));auto tokens = tokenizeString<std::vector<std::string>>(line);if (tokens.size() < 3) continue;tokens.resize(7); - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 394
} else { - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 395
machine->sshName = "localhost";machine->systemTypes = StringSet({settings.thisSystem});if (settings.thisSystem == "x86_64-linux")machine->systemTypes.insert("i686-linux");machine->maxJobs = settings.maxBuildJobs;newMachines.push_back(machine);machine->sshName = tokens[0];machine->systemTypes = tokenizeString<StringSet>(tokens[1], ",");machine->sshKey = tokens[2];if (tokens[3] != "")string2Int(tokens[3], machine->maxJobs);elsemachine->maxJobs = 1;machine->speedFactor = atof(tokens[4].c_str());machine->supportedFeatures = tokenizeString<StringSet>(tokens[5], ",");machine->mandatoryFeatures = tokenizeString<StringSet>(tokens[6], ",");for (auto & f : machine->mandatoryFeatures)machine->supportedFeatures.insert(f);/* Re-use the State object of the previous machine with thesame name. */auto i = oldMachines.find(machine->sshName);if (i == oldMachines.end())printMsg(lvlChatty, format("adding new machine ‘%1%’") % machine->sshName);elseprintMsg(lvlChatty, format("updating machine ‘%1%’") % machine->sshName);machine->state = i == oldMachines.end()? std::make_shared<Machine::State>(): i->second->state;newMachines[machine->sshName] = machine; - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 420
for (auto & m : oldMachines)if (newMachines.find(m.first) == newMachines.end())printMsg(lvlInfo, format("removing machine ‘%1%’") % m.first); - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 427
}void State::monitorMachinesFile(){while (true) {try {// FIXME: use inotify.sleep(60);loadMachinesFile();} catch (std::exception & e) {printMsg(lvlError, format("reloading machines file: %1%") % e.what());}} - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 658
if (m->supportsStep(r)) { supported = true; break; }if (m.second->supportsStep(r)) { supported = true; break; } - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 935
machinesSorted.push_back({m, m->currentJobs});machinesSorted.push_back({m.second, m.second->state->currentJobs}); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 968
if (mi.machine->currentJobs >= mi.machine->maxJobs) continue;if (mi.machine->state->currentJobs >= mi.machine->maxJobs) continue; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1005
auto reservation = std::make_shared<MachineReservation>(mi.machine);auto reservation = std::make_shared<MaintainCount>(mi.machine->state->currentJobs); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1008
auto builderThread = std::thread(&State::builder, this, step, reservation);auto builderThread = std::thread(&State::builder, this, step, mi.machine, reservation); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1042
void State::builder(Step::ptr step, MachineReservation::ptr reservation)void State::builder(Step::ptr step, Machine::ptr machine, std::shared_ptr<MaintainCount> reservation) - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1050
retry = doBuildStep(store, step, reservation->machine);retry = doBuildStep(store, step, machine); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1053
% step->drvPath % reservation->machine->sshName % e.what());% step->drvPath % machine->sshName % e.what()); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1398
machine->nrStepsDone++;machine->totalStepTime += stepStopTime - stepStartTime;machine->totalStepBuildTime += result.stopTime - result.startTime;machine->state->nrStepsDone++;machine->state->totalStepTime += stepStopTime - stepStartTime;machine->state->totalStepBuildTime += result.stopTime - result.startTime; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1603
for (auto & m : *machines_) {for (auto & i : *machines_) {auto & m(i.second);auto & s(m->state); - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1608
nested2.attr("currentJobs", m->currentJobs);nested2.attr("nrStepsDone", m->nrStepsDone);if (m->nrStepsDone) {nested2.attr("totalStepTime", m->totalStepTime);nested2.attr("totalStepBuildTime", m->totalStepBuildTime);nested2.attr("avgStepTime"); out << (float) m->totalStepTime / m->nrStepsDone;nested2.attr("avgStepBuildTime"); out << (float) m->totalStepBuildTime / m->nrStepsDone;nested2.attr("currentJobs", s->currentJobs);nested2.attr("nrStepsDone", s->nrStepsDone);if (m->state->nrStepsDone) {nested2.attr("totalStepTime", s->totalStepTime);nested2.attr("totalStepBuildTime", s->totalStepBuildTime);nested2.attr("avgStepTime"); out << (float) s->totalStepTime / s->nrStepsDone;nested2.attr("avgStepBuildTime"); out << (float) s->totalStepBuildTime / s->nrStepsDone; - replacement in src/hydra-queue-runner/hydra-queue-runner.cc at line 1711
loadMachines();loadMachinesFile(); - edit in src/hydra-queue-runner/hydra-queue-runner.cc at line 1713
std::thread(&State::monitorMachinesFile, this).detach();