We now take the machine speed factor into account, just like build-remote.pl.
NNOCZ4ROWC64ZKSAE2MPHZ3LGLI34C5TJJFW4MHXN6OELK6VMWOQC OCZ4LSGGSCMSLGC3C32D5JUYYHS5CIPOKOAMADEFAFZOFXJ3YY3AC NJJ7H64SZOX5EGACDCQAUQ7R6UEWD5IIC35A2MWFOOJV55DJYPHAC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC 5AIYUMTBY6TFQTBRP3MJ2PYWUMRF57I77NIVWYE74UMEVQMBWZVQC N5O7VEEOY2IE27VCOYRBG7YCY3K7JMQEDEMRT4OQ2MUE3NWULHHQC ENXUSMSVOU3AZFMH2ZXR4ZVPV2LRRQYQJ6IFX33YN6IH2ORSNSAAC GKZN4UV75GV7GEHQGBM2O6UHN6CVSHA7BMASCUQSDIDYVUKKZL7AC RQUAATWBGEP3YT4F555XLJYRRRGHDTEILHFORES7AM2XAOVMVJSAC /* FIXME: we're holding the runnable lock too longhere. This could be more efficient. */
do {/* Bail out when there are no slots left. */std::vector<Machine::ptr> machinesSorted;{auto machines_(machines.lock());machinesSorted.insert(machinesSorted.end(),machines_->begin(), machines_->end());}
for (auto i = runnable_->begin(); i != runnable_->end(); ) {auto step = i->lock();
- First by load divided by speed factor, rounded to thenearest integer. This causes fast machines to bepreferred over slow machines with similar loads.
auto step_(step->state.lock());if (step_->tries > 0 && step_->after > now) {if (step_->after < sleepUntil)sleepUntil = step_->after;
float ta = roundf(a->currentJobs / a->speedFactor);float tb = roundf(b->currentJobs / b->speedFactor);returnta != tb ? ta > tb :a->speedFactor != b->speedFactor ? a->speedFactor > b->speedFactor :a->maxJobs > b->maxJobs;});/* Find a machine with a free slot and find a step to runon it. Once we find such a pair, we restart the outerloop because the machine sorting will have changed. */keepGoing = false;system_time now = std::chrono::system_clock::now();for (auto & machine : machinesSorted) {// FIXME: can we lose a wakeup if a builder exits concurrently?if (machine->currentJobs >= machine->maxJobs) continue;auto runnable_(runnable.lock());printMsg(lvlDebug, format("%1% runnable builds") % runnable_->size());/* FIXME: we're holding the runnable lock too longhere. This could be more efficient. */for (auto i = runnable_->begin(); i != runnable_->end(); ) {auto step = i->lock();/* Delete dead steps. */if (!step) {i = runnable_->erase(i);continue;}/* Can this machine do this step? */if (!machine->supportsStep(step)) {
}
/* Skip previously failed steps that aren't readyto be retried. */{auto step_(step->state.lock());if (step_->tries > 0 && step_->after > now) {if (step_->after < sleepUntil)sleepUntil = step_->after;++i;continue;}}/* Make a slot reservation and start a thread todo the build. */auto reservation = std::make_shared<MachineReservation>(machine);i = runnable_->erase(i);auto builderThread = std::thread(&State::builder, this, step, reservation);builderThread.detach(); // FIXME?
auto reservation = findMachine(step);if (!reservation) {printMsg(lvlDebug, format("cannot execute step ‘%1%’ right now") % step->drvPath);++i;continue;
keepGoing = true;break;
}MachineReservation::ptr State::findMachine(Step::ptr step){auto machines_(machines.lock());for (auto & machine : *machines_) {if (!machine->supportsStep(step)) continue;{auto currentJobs_(machine->currentJobs.lock());if (*currentJobs_ >= machine->maxJobs) continue;}return std::make_shared<MachineReservation>(machine);}return 0;