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.
7LWB2J2ZFB4XJDN5MBL2WDKVBRYQD7Y6RQU7LUYKH7PZTXK2H7KQC RGCPOSHYTIIRIUSUZ7ABXJHHSAYRUVQXAAEGFKIWKKIGLJERFMSQC MHVIT4JYWUYD4UCGB2AHLXWLX6B5SYE22BREERNGANT7RGGDUFOAC BRAESISHTN4IIWUBVDMPDMY7QLMJDKX7GQ7K6NSJN66L5VPWSX3QC IE2PRAQUCQVFPJ4CAIJRPXXEFC5VBAE3EO5I5FG4XWEDRNONNHKQC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC HJOEIMLRDVQ2KZI5HGL2HKGBM3AHP7YIKGKDAGFUNKRUXVRB24NAC /* 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();