From 12cf91e4b29d4e801710dd7ed654b69f76af7f55 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Mon, 27 Jan 2025 17:42:37 -0600 Subject: [PATCH] Add a task save lock --- cpp/ci_database_objs.cpp | 15 +++++++++------ cpp/ci_database_objs.h | 3 +++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cpp/ci_database_objs.cpp b/cpp/ci_database_objs.cpp index 8308269..297b5a7 100644 --- a/cpp/ci_database_objs.cpp +++ b/cpp/ci_database_objs.cpp @@ -882,12 +882,12 @@ void PackageConf::sync() { { std::lock_guard lock(*task_mutex_); for (auto [job_status, task] : jobstatus_task_map_) { - if (task) { - auto sync_func = [this, task]() mutable { - if (task->jobstatus != nullptr) task->save(id); - }; - sync_func(); - } + if (!task) continue; + + auto sync_func = [this, task]() mutable { + if (task->jobstatus != nullptr) task->save(id); + }; + sync_func(); } } } @@ -1148,6 +1148,7 @@ JobStatus::JobStatus(int id) : id(id) { Task::Task(std::shared_ptr jobstatus, std::int64_t time, std::shared_ptr packageconf) : jobstatus(jobstatus), queue_time(time), is_running(false), log(std::make_shared()), parent_packageconf(packageconf) { + std::lock_guard sync_lock(*sync_mutex_); assert(log != nullptr && "Log pointer should never be null"); QSqlQuery insert_query(get_thread_connection()); insert_query.prepare("INSERT INTO task (packageconf_id, jobstatus_id, queue_time) VALUES (?, ?, ?)"); @@ -1207,6 +1208,7 @@ bool Task::compare(const std::shared_ptr& lhs, const std::shared_ptr } std::set> Task::get_completed_tasks(std::vector> packageconfs, std::shared_ptr>> job_statuses, int page, int per_page) { + std::lock_guard sync_lock(*sync_mutex_); std::set> result; if (per_page < 1) { per_page = 1; } @@ -1251,6 +1253,7 @@ std::set> Task::get_completed_tasks(std::vector sync_lock(*sync_mutex_); QSqlQuery query(get_thread_connection()); query.prepare("UPDATE task SET jobstatus_id = ?, queue_time = ?, start_time = ?, finish_time = ?, successful = ?, log = ? WHERE id = ?"); query.addBindValue(jobstatus->id); diff --git a/cpp/ci_database_objs.h b/cpp/ci_database_objs.h index 41930da..dc31ca4 100644 --- a/cpp/ci_database_objs.h +++ b/cpp/ci_database_objs.h @@ -255,6 +255,9 @@ public: } static bool compare(const std::shared_ptr& lhs, const std::shared_ptr& rhs); + +private: + std::shared_ptr sync_mutex_ = std::make_shared(); }; inline size_t qHash(const PackageConf::PackageConfPlain& key, size_t seed = 0) {