(I.e. taking the jobset scheduling share into account.)
IK2UBDAU6QKUXHJG3SXJKYGIIXRDKI6UVRTFC6ZVDXDCGNCMEWVAC WE5Q2NVIIK4R2DUUZYLJFQVYK5O26EDEJRPK3CPGWHU3SEAC2DQAC MHVIT4JYWUYD4UCGB2AHLXWLX6B5SYE22BREERNGANT7RGGDUFOAC 46ADBTMQAHQAPW3OCI24F4I5DVK5N5QVHUA4TQVB6HFN337CHAVQC 4I2HF4L3JOC6KPYLI2YTEVTHBRRYO5XKXOZ6VQ2SJKSQKAPNQXCQC PLOZBRTR6USSGJX7GR2RZKNPVYG2Q6QM7LW6IA35MKL63ZTQVD7QC RQUAATWBGEP3YT4F555XLJYRRRGHDTEILHFORES7AM2XAOVMVJSAC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC NAYQT2GTCJPBFRSK7CBFX655F2NGTBPICJSCYG2CSCQ5NRDHZG6QC HJOEIMLRDVQ2KZI5HGL2HKGBM3AHP7YIKGKDAGFUNKRUXVRB24NAC /* Account the time we spent building this step by dividing itamong the jobsets that depend on it. */{auto step_(step->state.lock());// FIXME: loss of precision.time_t charge = (result.stopTime - result.startTime) / step_->jobsets.size();for (auto & jobset : step_->jobsets)jobset->addStep(result.startTime, charge);}
/* Prune old historical build step info from the jobsets. */{auto jobsets_(jobsets.lock());for (auto & jobset : *jobsets_) {auto s1 = jobset.second->shareUsed();jobset.second->pruneSteps();auto s2 = jobset.second->shareUsed();if (s1 != s2)printMsg(lvlDebug, format("pruned scheduling window of ‘%1%:%2%’ from %3% to %4%")% jobset.first.first % jobset.first.second % s1 % s2);}}
void Jobset::addStep(time_t startTime, time_t duration){auto steps_(steps.lock());(*steps_)[startTime] = duration;seconds += duration;}void Jobset::pruneSteps(){time_t now = time(0);auto steps_(steps.lock());while (!steps_->empty()) {auto i = steps_->begin();if (i->first > now - schedulingWindow) break;seconds -= i->second;steps_->erase(i);}}
{root.attr("jobsets");JSONObject nested(out);auto jobsets_(jobsets.lock());for (auto & jobset : *jobsets_) {nested.attr(jobset.first.first + ":" + jobset.first.second);JSONObject nested2(out);nested2.attr("shareUsed"); out << jobset.second->shareUsed();nested2.attr("seconds", jobset.second->getSeconds());}}
Jobset::ptr State::createJobset(pqxx::work & txn,const std::string & projectName, const std::string & jobsetName){auto jobsets_(jobsets.lock());auto p = std::make_pair(projectName, jobsetName);auto i = jobsets_->find(p);if (i != jobsets_->end()) return i->second;auto res = txn.parameterized("select schedulingShares from Jobsets where project = $1 and name = $2")(projectName)(jobsetName).exec();if (res.empty()) throw Error("missing jobset - can't happen");auto shares = res[0]["schedulingShares"].as<unsigned int>();if (shares == 0) shares = 1;auto jobset = std::make_shared<Jobset>(shares);/* Load the build steps from the last 24 hours. */res = txn.parameterized("select s.startTime, s.stopTime from BuildSteps s join Builds b on build = id ""where s.startTime is not null and s.stopTime > $1 and project = $2 and jobset = $3")(time(0) - Jobset::schedulingWindow * 10)(projectName)(jobsetName).exec();for (auto const & row : res) {time_t startTime = row["startTime"].as<time_t>();time_t stopTime = row["stopTime"].as<time_t>();jobset->addStep(startTime, stopTime - startTime);}(*jobsets_)[p] = jobset;return jobset;}