Periodically clear orphaned build steps
These are build steps that remain "busy" in the database even though they have finished, because they couldn't be updated (e.g. due to a PostgreSQL connection problem). To prevent them from showing up as busy in the "Machine status" page, we now periodically purge them.
This commit is contained in:
		| @@ -825,6 +825,39 @@ void State::run(BuildID buildOne) | ||||
|     /* Idem for notification sending. */ | ||||
|     std::thread(&State::notificationSender, this).detach(); | ||||
|  | ||||
|     /* Periodically clean up orphaned busy steps in the database. */ | ||||
|     std::thread([&]() { | ||||
|         while (true) { | ||||
|             sleep(180); | ||||
|  | ||||
|             std::set<std::pair<BuildID, int>> steps; | ||||
|             { | ||||
|                 auto orphanedSteps_(orphanedSteps.lock()); | ||||
|                 if (orphanedSteps_->empty()) continue; | ||||
|                 steps = *orphanedSteps_; | ||||
|                 orphanedSteps_->clear(); | ||||
|             } | ||||
|  | ||||
|             try { | ||||
|                 auto conn(dbPool.get()); | ||||
|                 pqxx::work txn(*conn); | ||||
|                 for (auto & step : steps) { | ||||
|                     printMsg(lvlError, format("cleaning orphaned step %d of build %d") % step.second % step.first); | ||||
|                     txn.parameterized | ||||
|                         ("update BuildSteps set busy = 0, status = $1 where build = $2 and stepnr = $3 and busy = 1") | ||||
|                         ((int) bsAborted) | ||||
|                         (step.first) | ||||
|                         (step.second).exec(); | ||||
|                 } | ||||
|                 txn.commit(); | ||||
|             } catch (std::exception & e) { | ||||
|                 printMsg(lvlError, format("cleanup thread: %1%") % e.what()); | ||||
|                 auto orphanedSteps_(orphanedSteps.lock()); | ||||
|                 orphanedSteps_->insert(steps.begin(), steps.end()); | ||||
|             } | ||||
|         } | ||||
|     }).detach(); | ||||
|  | ||||
|     /* Monitor the database for status dump requests (e.g. from | ||||
|        ‘hydra-queue-runner --status’). */ | ||||
|     while (true) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user