From 502ba665e90b1e3ae8c79f1c8170532f11bf116d Mon Sep 17 00:00:00 2001 From: Riedler Date: Thu, 13 Nov 2025 13:28:25 +0100 Subject: [PATCH] fix: less flaky kanban_helper::set_entry() this should be less susceptible to race conditions during high load --- lbplanner/classes/helpers/kanban_helper.php | 24 +++++++++------------ 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/lbplanner/classes/helpers/kanban_helper.php b/lbplanner/classes/helpers/kanban_helper.php index 182b73e3..90843051 100644 --- a/lbplanner/classes/helpers/kanban_helper.php +++ b/lbplanner/classes/helpers/kanban_helper.php @@ -69,22 +69,18 @@ public static function get_entry(int $userid, int $cmid): ?kanbanentry { * @param kanbanentry $entry the entry to set */ public static function set_entry(kanbanentry $entry): void { - global $DB, $CFG; + global $DB; - try { + if ($entry->column === KANBANCOL_TYPE_NUMERIC::BACKLOG) { $DB->delete_records(self::TABLE, ['userid' => $entry->userid, 'cmid' => $entry->cmid]); - } catch (\dml_exception $e) { - // Needed for low-reporting contexts such as a prod server. - echo 'error while trying to delete preexisting kanban entries: ' - . $e->getMessage() - . "\nFurther info:\n" - . $e->debuginfo; - var_dump($entry); - throw $e; - } - if ($entry->column !== KANBANCOL_TYPE_NUMERIC::BACKLOG) { - $newid = $DB->insert_record(self::TABLE, $entry->prepare_for_db(), true); - $entry->set_fresh($newid); + } else { + $id = $DB->get_field(self::TABLE, 'id', ['userid' => $entry->userid, 'cmid' => $entry->cmid], IGNORE_MISSING); + if ($id === false) { + $id = $DB->insert_record(self::TABLE, $entry->prepare_for_db(), true); + } else { + $DB->set_field(self::TABLE, 'selectedcolumn', $entry->column, ['id' => $id]); + } + $entry->set_fresh($id); } } }