Make jobstatus_map a shared pointer, hopefully resolving nullptr issues

This commit is contained in:
Simon Quigley 2025-01-25 17:01:10 -06:00
parent a43739dfeb
commit 27da8b7df0
5 changed files with 39 additions and 38 deletions

View File

@ -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) 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) {} : 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(); Branch _tmp_brch = Branch();
Package _tmp_pkg = Package(); Package _tmp_pkg = Package();
Release _tmp_rel = Release(); Release _tmp_rel = Release();
@ -443,7 +443,7 @@ std::vector<std::shared_ptr<PackageConf>> PackageConf::get_package_confs(std::ma
// Find the matching JobStatus // Find the matching JobStatus
std::shared_ptr<JobStatus> jobstatus_ptr; 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) { if (kv.second && kv.second->id == jsid) {
jobstatus_ptr = kv.second; jobstatus_ptr = kv.second;
break; 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 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; std::set<std::shared_ptr<Task>> result;
if (per_page < 1) { per_page = 1; } 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; break;
} }
} }
for (auto status : job_statuses) { for (auto status : *job_statuses) {
if (status.second->id == query.value("jobstatus_id").toInt()) { if (status.second->id == query.value("jobstatus_id").toInt()) {
this_task.jobstatus = status.second; this_task.jobstatus = status.second;
break; break;

View File

@ -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, 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::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, std::vector<std::shared_ptr<PackageConf>> get_package_confs_by_package_name(std::vector<std::shared_ptr<PackageConf>> packageconfs,
const std::string& package_name); 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); 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::shared_ptr<JobStatus> jobstatus, std::int64_t time, std::shared_ptr<PackageConf> packageconf);
Task(); 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); void save(int _packageconf_id = 0);
std::shared_ptr<PackageConf> get_parent_packageconf() const { std::shared_ptr<PackageConf> get_parent_packageconf() const {

View File

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

View File

@ -87,7 +87,7 @@ class CiLogic {
// Fetch logs for a specific PackageConf ID // Fetch logs for a specific PackageConf ID
std::string get_logs_for_repo_conf(int package_conf_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::vector<std::shared_ptr<PackageConf>> get_packageconfs();
std::shared_ptr<PackageConf> get_packageconf_by_id(int id); std::shared_ptr<PackageConf> get_packageconf_by_id(int id);
std::vector<std::shared_ptr<PackageConf>> get_packageconfs_by_ids(std::set<int> ids); 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::string queue_pull_tarball(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue, 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::string queue_build_upload(std::vector<std::shared_ptr<PackageConf>> repos,
std::unique_ptr<TaskQueue>& task_queue, 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<Release> releases;
std::vector<Package> packages; std::vector<Package> packages;
@ -112,7 +112,7 @@ class CiLogic {
mutable std::mutex packageconfs_mutex_; mutable std::mutex packageconfs_mutex_;
std::vector<std::shared_ptr<PackageConf>> packageconfs; 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 { struct package_conf_item {
std::shared_ptr<PackageConf> first_pkgconf; std::shared_ptr<PackageConf> first_pkgconf;

View File

@ -176,7 +176,7 @@ bool WebServer::start_server(quint16 port) {
std::shared_ptr<LubuntuCI> lubuntuci = std::make_shared<LubuntuCI>(); std::shared_ptr<LubuntuCI> lubuntuci = std::make_shared<LubuntuCI>();
std::vector<std::shared_ptr<PackageConf>> all_repos = lubuntuci->list_known_repos(); std::vector<std::shared_ptr<PackageConf>> all_repos = lubuntuci->list_known_repos();
task_queue = std::make_unique<TaskQueue>(10); 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(); task_queue->start();
// Load initial tokens // Load initial tokens
@ -219,7 +219,7 @@ bool WebServer::start_server(quint16 port) {
if (!pkgconf->can_check_source_upload()) { continue; } if (!pkgconf->can_check_source_upload()) { continue; }
task_queue->enqueue( task_queue->enqueue(
job_statuses.at("source_check"), job_statuses->at("source_check"),
[this, proposed](std::shared_ptr<Log> log) mutable { [this, proposed](std::shared_ptr<Log> log) mutable {
std::shared_ptr<PackageConf> pkgconf = log->get_task_context()->get_parent_packageconf(); 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); 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; 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 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); auto t = r->get_task_by_jobstatus(job_ptr);
if (t) { if (t) {
std::string css_class = "bg-secondary"; // default 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::set<std::shared_ptr<Task>, Task::TaskComparator> final_tasks;
std::string title_prefix; std::string title_prefix;
static const std::map<std::string, std::shared_ptr<JobStatus>> job_statuses = lubuntuci->cilogic.get_job_statuses();
if (type.empty()) { if (type.empty()) {
// default to 'running' // default to 'running'
title_prefix = "Running"; title_prefix = "Running";
@ -916,7 +914,7 @@ bool WebServer::start_server(quint16 port) {
std::vector<std::shared_ptr<Task>> tasks_vector; std::vector<std::shared_ptr<Task>> tasks_vector;
auto pkgconfs = lubuntuci->cilogic.get_packageconfs(); auto pkgconfs = lubuntuci->cilogic.get_packageconfs();
for (auto &pkgconf : pkgconfs) { for (auto &pkgconf : pkgconfs) {
for (auto &j : job_statuses) { for (auto &j : *job_statuses) {
if (!j.second) { if (!j.second) {
continue; continue;
} }