Make jobstatus_map a shared pointer, hopefully resolving nullptr issues

main
Simon Quigley 2 weeks ago
parent a43739dfeb
commit 27da8b7df0

@ -312,7 +312,7 @@ PackageConf::PackageConf(int id, std::shared_ptr<Package> package, std::shared_p
std::shared_ptr<GitCommit> packaging_commit, std::shared_ptr<GitCommit> upstream_commit)
: id(id), package(package), release(release), branch(branch), packaging_commit(packaging_commit), upstream_commit(upstream_commit) {}
std::vector<std::shared_ptr<PackageConf>> PackageConf::get_package_confs(std::map<std::string, std::shared_ptr<JobStatus>> jobstatus_map) {
std::vector<std::shared_ptr<PackageConf>> PackageConf::get_package_confs(std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> jobstatus_map) {
Branch _tmp_brch = Branch();
Package _tmp_pkg = Package();
Release _tmp_rel = Release();
@ -443,7 +443,7 @@ std::vector<std::shared_ptr<PackageConf>> PackageConf::get_package_confs(std::ma
// Find the matching JobStatus
std::shared_ptr<JobStatus> jobstatus_ptr;
for (const auto &kv : jobstatus_map) {
for (const auto &kv : *jobstatus_map) {
if (kv.second && kv.second->id == jsid) {
jobstatus_ptr = kv.second;
break;
@ -1180,7 +1180,7 @@ bool Task::compare(const std::shared_ptr<Task>& lhs, const std::shared_ptr<Task>
return lhs->id < rhs->id; // Earlier id first
}
std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::map<std::string, std::shared_ptr<JobStatus>> job_statuses, int page, int per_page) {
std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses, int page, int per_page) {
std::set<std::shared_ptr<Task>> result;
if (per_page < 1) { per_page = 1; }
@ -1206,7 +1206,7 @@ std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::share
break;
}
}
for (auto status : job_statuses) {
for (auto status : *job_statuses) {
if (status.second->id == query.value("jobstatus_id").toInt()) {
this_task.jobstatus = status.second;
break;

@ -157,7 +157,7 @@ public:
PackageConf(int id = 0, std::shared_ptr<Package> package = NULL, std::shared_ptr<Release> release = NULL, std::shared_ptr<Branch> branch = NULL,
std::shared_ptr<GitCommit> packaging_commit = NULL, std::shared_ptr<GitCommit> upstream_commit = NULL);
std::vector<std::shared_ptr<PackageConf>> get_package_confs(std::map<std::string, std::shared_ptr<JobStatus>> jobstatus_map);
std::vector<std::shared_ptr<PackageConf>> get_package_confs(std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> jobstatus_map);
std::vector<std::shared_ptr<PackageConf>> get_package_confs_by_package_name(std::vector<std::shared_ptr<PackageConf>> packageconfs,
const std::string& package_name);
void assign_task(std::shared_ptr<JobStatus> jobstatus, std::shared_ptr<Task> task_ptr, std::weak_ptr<PackageConf> packageconf_ptr);
@ -212,7 +212,7 @@ public:
Task(std::shared_ptr<JobStatus> jobstatus, std::int64_t time, std::shared_ptr<PackageConf> packageconf);
Task();
std::set<std::shared_ptr<Task>> get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::map<std::string, std::shared_ptr<JobStatus>> job_statuses, int page, int per_page);
std::set<std::shared_ptr<Task>> get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses, int page, int per_page);
void save(int _packageconf_id = 0);
std::shared_ptr<PackageConf> get_parent_packageconf() const {

@ -1121,7 +1121,7 @@ std::vector<std::shared_ptr<PackageConf>> CiLogic::get_config(const std::string
std::string CiLogic::queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue,
const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses) {
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses) {
std::string msg;
std::map<std::string, std::shared_ptr<package_conf_item>> encountered_items;
std::mutex task_assignment_mutex;
@ -1137,8 +1137,8 @@ std::string CiLogic::queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>
std::lock_guard<std::mutex> lock(task_assignment_mutex);
is_ghost_pull = true;
r->assign_task(job_statuses.at("pull"), found_it->second->first_pull_task, r);
r->assign_task(job_statuses.at("tarball"), found_it->second->first_tarball_task, r);
r->assign_task(job_statuses->at("pull"), found_it->second->first_pull_task, r);
r->assign_task(job_statuses->at("tarball"), found_it->second->first_tarball_task, r);
r->packaging_commit = found_it->second->packaging_commit;
r->upstream_commit = found_it->second->upstream_commit;
sync(r);
@ -1148,24 +1148,24 @@ std::string CiLogic::queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>
std::shared_ptr<Task> tarball_task = std::make_shared<Task>();
task_queue->enqueue(
job_statuses.at("pull"),
job_statuses->at("pull"),
[this, r, &task_queue, tarball_task, job_statuses](std::shared_ptr<Log> log) mutable {
std::shared_ptr<PackageConf> pkgconf = log->get_task_context()->get_parent_packageconf();
if (pull_project(pkgconf, log)) {
task_queue->enqueue(
job_statuses.at("tarball"),
job_statuses->at("tarball"),
[this, r](std::shared_ptr<Log> log) mutable {
bool tarball_ok = create_project_tarball(r, log);
},
r
);
tarball_task = r->get_task_by_jobstatus(job_statuses.at("tarball"));
tarball_task = r->get_task_by_jobstatus(job_statuses->at("tarball"));
}
},
r
);
new_item->first_pull_task = r->get_task_by_jobstatus(job_statuses.at("pull"));
new_item->first_pull_task = r->get_task_by_jobstatus(job_statuses->at("pull"));
new_item->first_tarball_task = tarball_task;
new_item->first_pkgconf = r;
@ -1183,18 +1183,18 @@ std::string CiLogic::queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>
std::string CiLogic::queue_build_upload(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue,
const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses) {
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses) {
std::string msg;
try {
for (auto r : repos) {
task_queue->enqueue(
job_statuses.at("source_build"),
job_statuses->at("source_build"),
[this, r, &task_queue, job_statuses](std::shared_ptr<Log> log) mutable {
auto [build_ok, changes_files] = build_project(r, log);
if (build_ok) {
task_queue->enqueue(
job_statuses.at("upload"),
job_statuses->at("upload"),
[this, r, changes_files](std::shared_ptr<Log> log) mutable {
bool upload_ok = upload_and_lint(r, changes_files, false, log);
(void)upload_ok;
@ -1214,19 +1214,22 @@ std::string CiLogic::queue_build_upload(std::vector<std::shared_ptr<PackageConf>
return msg;
}
std::map<std::string, std::shared_ptr<JobStatus>> CiLogic::get_job_statuses() {
if (!_cached_job_statuses.empty()) { return _cached_job_statuses; }
static const std::map<std::string, std::shared_ptr<JobStatus>> statuses = {
{"pull", std::make_shared<JobStatus>(JobStatus(1))},
{"tarball", std::make_shared<JobStatus>(JobStatus(2))},
{"source_build", std::make_shared<JobStatus>(JobStatus(3))},
{"upload", std::make_shared<JobStatus>(JobStatus(4))},
{"source_check", std::make_shared<JobStatus>(JobStatus(5))},
{"build_check", std::make_shared<JobStatus>(JobStatus(6))},
{"lintian", std::make_shared<JobStatus>(JobStatus(7))},
{"britney", std::make_shared<JobStatus>(JobStatus(8))}
};
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> CiLogic::get_job_statuses() {
if (_cached_job_statuses != nullptr) { return _cached_job_statuses; }
static const auto statuses = std::make_shared<std::map<std::string, std::shared_ptr<JobStatus>>>(
std::map<std::string, std::shared_ptr<JobStatus>>{
{"pull", std::make_shared<JobStatus>(JobStatus(1))},
{"tarball", std::make_shared<JobStatus>(JobStatus(2))},
{"source_build", std::make_shared<JobStatus>(JobStatus(3))},
{"upload", std::make_shared<JobStatus>(JobStatus(4))},
{"source_check", std::make_shared<JobStatus>(JobStatus(5))},
{"build_check", std::make_shared<JobStatus>(JobStatus(6))},
{"lintian", std::make_shared<JobStatus>(JobStatus(7))},
{"britney", std::make_shared<JobStatus>(JobStatus(8))}
}
);
_cached_job_statuses = statuses;
return statuses;
}

@ -87,7 +87,7 @@ class CiLogic {
// Fetch logs for a specific PackageConf ID
std::string get_logs_for_repo_conf(int package_conf_id);
std::map<std::string, std::shared_ptr<JobStatus>> get_job_statuses();
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> get_job_statuses();
std::vector<std::shared_ptr<PackageConf>> get_packageconfs();
std::shared_ptr<PackageConf> get_packageconf_by_id(int id);
std::vector<std::shared_ptr<PackageConf>> get_packageconfs_by_ids(std::set<int> ids);
@ -96,10 +96,10 @@ class CiLogic {
std::string queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue,
const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses);
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses);
std::string queue_build_upload(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue,
const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses);
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses);
std::vector<Release> releases;
std::vector<Package> packages;
@ -112,7 +112,7 @@ class CiLogic {
mutable std::mutex packageconfs_mutex_;
std::vector<std::shared_ptr<PackageConf>> packageconfs;
std::map<std::string, std::shared_ptr<JobStatus>> _cached_job_statuses;
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> _cached_job_statuses;
struct package_conf_item {
std::shared_ptr<PackageConf> first_pkgconf;

@ -176,7 +176,7 @@ bool WebServer::start_server(quint16 port) {
std::shared_ptr<LubuntuCI> lubuntuci = std::make_shared<LubuntuCI>();
std::vector<std::shared_ptr<PackageConf>> all_repos = lubuntuci->list_known_repos();
task_queue = std::make_unique<TaskQueue>(10);
std::map<std::string, std::shared_ptr<JobStatus>> job_statuses = lubuntuci->cilogic.get_job_statuses();
std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses = lubuntuci->cilogic.get_job_statuses();
task_queue->start();
// Load initial tokens
@ -219,7 +219,7 @@ bool WebServer::start_server(quint16 port) {
if (!pkgconf->can_check_source_upload()) { continue; }
task_queue->enqueue(
job_statuses.at("source_check"),
job_statuses->at("source_check"),
[this, proposed](std::shared_ptr<Log> log) mutable {
std::shared_ptr<PackageConf> pkgconf = log->get_task_context()->get_parent_packageconf();
std::string package_version = pkgconf->upstream_version + "-0ubuntu0~ppa" + std::to_string(pkgconf->ppa_revision);
@ -524,7 +524,7 @@ bool WebServer::start_server(quint16 port) {
item["upstream_commit_url"] = upstream_commit_url_str;
// For each job in the map, fetch the real task and set a CSS class accordingly.
for (auto const & [job_name, job_ptr] : job_statuses) {
for (auto const & [job_name, job_ptr] : *job_statuses) {
auto t = r->get_task_by_jobstatus(job_ptr);
if (t) {
std::string css_class = "bg-secondary"; // default
@ -901,8 +901,6 @@ bool WebServer::start_server(quint16 port) {
std::set<std::shared_ptr<Task>, Task::TaskComparator> final_tasks;
std::string title_prefix;
static const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses = lubuntuci->cilogic.get_job_statuses();
if (type.empty()) {
// default to 'running'
title_prefix = "Running";
@ -916,7 +914,7 @@ bool WebServer::start_server(quint16 port) {
std::vector<std::shared_ptr<Task>> tasks_vector;
auto pkgconfs = lubuntuci->cilogic.get_packageconfs();
for (auto &pkgconf : pkgconfs) {
for (auto &j : job_statuses) {
for (auto &j : *job_statuses) {
if (!j.second) {
continue;
}

Loading…
Cancel
Save