We now kill active build steps when there are no more referring builds. This is useful e.g. for preventing cancelled multi-hour TPC-H benchmark runs from hogging build machines.
LVQXQIYA7QMLVYOANYEFHDBTFAOSE3D2IYAVOG2DXURTASRCUNYQC TTBLPQAJKPRC6W23QIFTPI2MM4VYR3D3CR6F7U53WU5GJDAYJW4AC OTNJLJHAUQCGSA2FWDASTXAR6XBNHRW7SLXLDGGT7WVCEDDZLMHQC UYUVQWXQZUOEM2DIUIS2XMC6I6FUNUCAI6VRUH6XDIO6BOD6L7EQC KQ3EGUQYAFZ25JSZCY4RI554LJ3ZWACBQFHL2HTYVXIVTBEJPMGAC UNVLTCV4FDU6ZQRIA7OG7LDI3ADMDSZ27NTR6JBV7JPKNTLA7P3QC EHEQ4AY3JT6CTIANKZMMS5MZ5P5BFC7GWYN4VMSYY2FR3PW4UL7AC OPN3PED2P6WD54C53IAGD7IZUFSTJ6ZBHTKQ6L7MBKGSTMCQ55UAC 3BKPZ52C6FZZSVYTHLH6DF45P5AW35ROXCFMIGC5I56THD6B5LPQC YTAYNN7VNYZNLGUSGY3EF33MGQWMJW76FKV657SBKASQFQC7EB3AC NTEDD7T4M7XXYCWNZN57EJOEH3KI3UYMHOANV4MY2LSUPWX3JRDQC OBOTGFG63VKMKWE7AGSTNPDCJ42FGFDIVY6XYLJLS275Y7OE3FSQC MHVIT4JYWUYD4UCGB2AHLXWLX6B5SYE22BREERNGANT7RGGDUFOAC EYR3EW6JVHNVLXMI57FUVPHQAHPETBML4H44OGJFHUT54KTTHIGQC FCTX433OH7QIVWHXL23DKVSUKBQSLQTRK3PFCKKSMLX6A634456QC 7LWB2J2ZFB4XJDN5MBL2WDKVBRYQD7Y6RQU7LUYKH7PZTXK2H7KQC UNVMKJV5VX74A2MLS42AP3SY25HKQSH4S27Y44QFKRQRKPU2MV6QC 73YR46NJNYZQKHA3QDJCAZYAKC2CGEF5LIS44NOIPDZU6FX6BDPQC BG6PEOB2M2Y56QPVMELU7VNNCGNMSQ2K6ATBUCPJLKPLTDWNJQ5AC FITVNQ2SVM6KSOF5P3HHWJYQ3WMQYDJGAONCBIZ7OF7CPXGMA36QC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC LJILHOJ7QYXNTMKDQS6OU4PVCXPQ27C5KMQWHDBELCYP7FG3ZFYAC VQISTKOPNAEUS2K2F73CMNNLGZATWUYIURD5CSVNBNF7Q5ZF4PXQC KBZHIGLGHGLST5AZZDEJTYBJSQNE2XYNHEN2FN6XMAMY5BJYZR6QC PLOZBRTR6USSGJX7GR2RZKNPVYG2Q6QM7LW6IA35MKL63ZTQVD7QC WE5Q2NVIIK4R2DUUZYLJFQVYK5O26EDEJRPK3CPGWHU3SEAC2DQAC HJOEIMLRDVQ2KZI5HGL2HKGBM3AHP7YIKGKDAGFUNKRUXVRB24NAC 5JB5DKQLDAGGNLQ6CDWVYRMT4KWCKXWKE6CBDU7C7Q3JMUNQHAYAC PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC TPNHTE5VJ36IPKMFENDERDBFBHLYFXOVNDLV2QSC4G5STPPMBLMAC 2GUAKGTBTNFFER343SQWSLFYIXXHJLDSGH5JHF7QMC3AVZB7Q3TQC OCZ4LSGGSCMSLGC3C32D5JUYYHS5CIPOKOAMADEFAFZOFXJ3YY3AC JGLE5BRNJTMCZFZ33G2SGOQ4F3CIZAPMU3IXCNMR5NNSG5EJLX6QC R7MDDCB2Y5KQVSRQR6FISMVYUIED5SHXTHZGKWCRQTX7NOAEPRDQC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC thousands of builds), so we don't. */Build::ptr build;
thousands of builds), so we don't.We don't keep a Build::ptr here to allowState::processQueueChange() to detect whether a step can becancelled (namely if there are no more Builds referring toit). */BuildID buildId;Path buildDrvPath;unsigned int maxSilentTime, buildTimeout;
} catch (__cxxabiv1::__forced_unwind & e) {/* The queue monitor thread cancelled this step. */try {printInfo("marking step %d of build %d as succeeded", stepNr, buildId);pqxx::work txn(*conn);finishBuildStep(txn, result.startTime, time(0), result.overhead, buildId,stepNr, machine->sshName, bsCancelled, "");txn.commit();stepFinished = true;} catch (...) {ignoreException();}throw;
createBuildStep(txn, 0, build2, step, machine->sshName,result.stepStatus, result.errorMsg, build == build2 ? 0 : build->id);
createBuildStep(txn, 0, build2->id, step, machine->sshName,result.stepStatus, result.errorMsg, buildId == build2->id ? 0 : buildId);
for (auto i = builds_->begin(); i != builds_->end(); ) {auto b = currentIds.find(i->first);if (b == currentIds.end()) {printMsg(lvlInfo, format("discarding cancelled build %1%") % i->first);i = builds_->erase(i);// FIXME: ideally we would interrupt active build steps here.continue;
for (auto i = builds_->begin(); i != builds_->end(); ) {auto b = currentIds.find(i->first);if (b == currentIds.end()) {printMsg(lvlInfo, format("discarding cancelled build %1%") % i->first);i = builds_->erase(i);// FIXME: ideally we would interrupt active build steps here.continue;}if (i->second->globalPriority < b->second) {printMsg(lvlInfo, format("priority of build %1% increased") % i->first);i->second->globalPriority = b->second;i->second->propagatePriorities();}++i;
if (i->second->globalPriority < b->second) {printMsg(lvlInfo, format("priority of build %1% increased") % i->first);i->second->globalPriority = b->second;i->second->propagatePriorities();
}{auto activeSteps(activeSteps_.lock());for (auto & activeStep : *activeSteps) {auto threadId = activeStep->threadId; // FIXME: use Sync or atomic?if (threadId == 0) continue;std::set<Build::ptr> dependents;std::set<Step::ptr> steps;getDependents(activeStep->step, dependents, steps);if (!dependents.empty()) continue;printInfo("cancelling thread for build step ‘%s’", activeStep->step->drvPath);int err = pthread_cancel(threadId);if (err)printError("error cancelling thread for build step ‘%s’: %s",activeStep->step->drvPath, strerror(err));
[% IF ( type == "All" ) || ( type == "Failed" && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) %]
[% IF ( type == "All" ) || ( type == "Failed" && step.busy == 0 && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) %]
<td>[% IF step.busy == 1 || ((step.machine || step.starttime) && (step.status == 0 || step.status == 1 || step.status == 3 || step.status == 7)); INCLUDE renderMachineName machine=step.machine; ELSE; "<em>n/a</em>"; END %]</td>
<td>[% IF step.busy == 1 || ((step.machine || step.starttime) && (step.status == 0 || step.status == 1 || step.status == 3 || step.status == 4 || step.status == 7)); INCLUDE renderMachineName machine=step.machine; ELSE; "<em>n/a</em>"; END %]</td>