I.e. don't use Nix's failed paths feature anymore. Easier to keep everything in one place.
RYTQLATYOZ6ODIKYVJ63TC4OIQBXHSCV3NA2YD4NFP7443GQVSRQC VHV6GI4L2GEV2PV3AEV4C22O3JB4XUS6WPEBFINYD5CJOBMAESAAC KSBB33RE2PK5SFN7ZMOTZJQHZB4JYIIUUKWDSD3LSZ5GD465AJHQC 6SJQECSC7STXAXOE27JE76O3UYQ3U462K3R3NUVWAEAJQOM7MJXAC LJILHOJ7QYXNTMKDQS6OU4PVCXPQ27C5KMQWHDBELCYP7FG3ZFYAC 5AIYUMTBY6TFQTBRP3MJ2PYWUMRF57I77NIVWYE74UMEVQMBWZVQC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC FQQRJUO4C7655SFAKPRPILALVEVRQSIIVBLMQUFPODUBXPIMWYSAC YZAI5GQU3HNMK5MEGF2Y7WS445AN4YKD3HNJQVQP545ODN3F5DLAC KBZHIGLGHGLST5AZZDEJTYBJSQNE2XYNHEN2FN6XMAMY5BJYZR6QC ENXUSMSVOU3AZFMH2ZXR4ZVPV2LRRQYQJ6IFX33YN6IH2ORSNSAAC ZWCTAZGLJZQNTYWTC2XQUKMILJF6JGDL5IND6QNYWK4FIGMLRFXAC 2GK5DOU7ODF4WBSN3QTD3WIO52VTL2LOAXKGCDEMMAQPTEO4A4HAC UOINKJ2JBCRTZPFTAXDPRJOEUWWPJ43IGVWLRIRLIGHLBMWDOGDQC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC stepNr = createBuildStep(txn, result.startTime, build, step, machine->sshName, bssBusy);txn.parameterized("update Builds set busy = 1 where id = $1")(build->id).exec();txn.commit();
for (auto & path : outputPaths(step->drv))if (!txn.parameterized("select 1 from FailedPaths where path = $1")(path).exec().empty()) {cachedFailure = true;break;}
try {buildRemote(store, machine->sshName, machine->sshKey, step->drvPath, step->drv, logDir, result);} catch (Error & e) {result.status = RemoteResult::rrMiscFailure;result.errorMsg = e.msg();printMsg(lvlError, format("ERROR: %1%") % e.msg());abort();}
if (cachedFailure)result.status = RemoteResult::rrPermanentFailure;else {
if (!result.stopTime) result.stopTime = time(0);
/* Create a build step record indicating that we startedbuilding. Also, mark the selected build as busy. */{pqxx::work txn(*conn);stepNr = createBuildStep(txn, result.startTime, build, step, machine->sshName, bssBusy);txn.parameterized("update Builds set busy = 1 where id = $1")(build->id).exec();txn.commit();}
BuildResult res;if (result.status == RemoteResult::rrSuccess) res = getBuildResult(store, step->drv);
try {buildRemote(store, machine->sshName, machine->sshKey, step->drvPath, step->drv, logDir, result);} catch (Error & e) {result.status = RemoteResult::rrMiscFailure;result.errorMsg = e.msg();printMsg(lvlError, format("ERROR: %1%") % e.msg());abort();}
/* Create failed build steps for every build that dependson this. */for (auto build2 : dependents) {if (build == build2) continue;createBuildStep(txn, result.stopTime, build2, step, machine->sshName, bssFailed, result.errorMsg, build->id);}
/* Failure case. */
finishBuildStep(txn, result.startTime, result.stopTime, build->id, stepNr, machine->sshName, bssFailed, result.errorMsg);
/* For regular failures, we don't care about the errormessage. */if (result.status != RemoteResult::rrMiscFailure) result.errorMsg = "";if (!cachedFailure) {/* Create failed build steps for every build that dependson this. */for (auto build2 : dependents) {if (build == build2) continue;createBuildStep(txn, result.stopTime, build2, step, machine->sshName, bssFailed, result.errorMsg, build->id);}
("update Builds set finished = 1, busy = 0, isCachedBuild = 0, buildStatus = $2, startTime = $3, stopTime = $4 where id = $1")
("update Builds set finished = 1, busy = 0, buildStatus = $2, startTime = $3, stopTime = $4, isCachedBuild = $5 where id = $1")
use utf8;package Hydra::Schema::FailedPaths;# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE=head1 NAMEHydra::Schema::FailedPaths=cutuse strict;use warnings;use base 'DBIx::Class::Core';=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON");=head1 TABLE: C<FailedPaths>=cut__PACKAGE__->table("FailedPaths");=head1 ACCESSORS=head2 pathdata_type: 'text'is_nullable: 0=cut__PACKAGE__->add_columns("path", { data_type => "text", is_nullable => 0 });=head1 PRIMARY KEY=over 4=item * L</path>=back=cut__PACKAGE__->set_primary_key("path");# Created by DBIx::Class::Schema::Loader v0.07033 @ 2015-06-10 14:48:16# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:WFgjfjH+szE6Ntcicmaflw# You can replace this text with custom code or comments, and it will be preserved on regeneration1;