Kill active build steps when builds are cancelled
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.
This commit is contained in:
		| @@ -224,25 +224,25 @@ void State::clearBusy(Connection & conn, time_t stopTime) | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned int State::allocBuildStep(pqxx::work & txn, Build::ptr build) | ||||
| unsigned int State::allocBuildStep(pqxx::work & txn, BuildID buildId) | ||||
| { | ||||
|     /* Acquire an exclusive lock on BuildSteps to ensure that we don't | ||||
|        race with other threads creating a step of the same build. */ | ||||
|     txn.exec("lock table BuildSteps in exclusive mode"); | ||||
|  | ||||
|     auto res = txn.parameterized("select max(stepnr) from BuildSteps where build = $1")(build->id).exec(); | ||||
|     auto res = txn.parameterized("select max(stepnr) from BuildSteps where build = $1")(buildId).exec(); | ||||
|     return res[0][0].is_null() ? 1 : res[0][0].as<int>() + 1; | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned int State::createBuildStep(pqxx::work & txn, time_t startTime, Build::ptr build, Step::ptr step, | ||||
| unsigned int State::createBuildStep(pqxx::work & txn, time_t startTime, BuildID buildId, Step::ptr step, | ||||
|     const std::string & machine, BuildStatus status, const std::string & errorMsg, BuildID propagatedFrom) | ||||
| { | ||||
|     unsigned int stepNr = allocBuildStep(txn, build); | ||||
|     auto stepNr = allocBuildStep(txn, buildId); | ||||
|  | ||||
|     txn.parameterized | ||||
|         ("insert into BuildSteps (build, stepnr, type, drvPath, busy, startTime, system, status, propagatedFrom, errorMsg, stopTime, machine) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)") | ||||
|         (build->id) | ||||
|         (buildId) | ||||
|         (stepNr) | ||||
|         (0) // == build | ||||
|         (step->drvPath) | ||||
| @@ -258,7 +258,7 @@ unsigned int State::createBuildStep(pqxx::work & txn, time_t startTime, Build::p | ||||
|     for (auto & output : step->drv.outputs) | ||||
|         txn.parameterized | ||||
|             ("insert into BuildStepOutputs (build, stepnr, name, path) values ($1, $2, $3, $4)") | ||||
|             (build->id)(stepNr)(output.first)(output.second.path).exec(); | ||||
|             (buildId)(stepNr)(output.first)(output.second.path).exec(); | ||||
|  | ||||
|     return stepNr; | ||||
| } | ||||
| @@ -284,7 +284,7 @@ void State::finishBuildStep(pqxx::work & txn, time_t startTime, time_t stopTime, | ||||
| int State::createSubstitutionStep(pqxx::work & txn, time_t startTime, time_t stopTime, | ||||
|     Build::ptr build, const Path & drvPath, const string & outputName, const Path & storePath) | ||||
| { | ||||
|     int stepNr = allocBuildStep(txn, build); | ||||
|     auto stepNr = allocBuildStep(txn, build->id); | ||||
|  | ||||
|     txn.parameterized | ||||
|         ("insert into BuildSteps (build, stepnr, type, drvPath, busy, status, startTime, stopTime) values ($1, $2, $3, $4, $5, $6, $7, $8)") | ||||
| @@ -574,7 +574,7 @@ void State::dumpStatus(Connection & conn, bool log) | ||||
|                 if (i->lock()) ++i; else i = runnable_->erase(i); | ||||
|             root.attr("nrRunnableSteps", runnable_->size()); | ||||
|         } | ||||
|         root.attr("nrActiveSteps", nrActiveSteps); | ||||
|         root.attr("nrActiveSteps", activeSteps_.lock()->size()); | ||||
|         root.attr("nrStepsBuilding", nrStepsBuilding); | ||||
|         root.attr("nrStepsCopyingTo", nrStepsCopyingTo); | ||||
|         root.attr("nrStepsCopyingFrom", nrStepsCopyingFrom); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user