From 16555b93bbe4ef69dbbce8085bb366134f8a5654 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 11 Jan 2023 16:34:23 +0000 Subject: fix race conditions when processing multiple choice polls --- Zotlabs/Lib/Activity.php | 28 ++++++++++++++++++++++++---- include/items.php | 2 +- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php index 8f4e0444c..4a14b1ba1 100644 --- a/Zotlabs/Lib/Activity.php +++ b/Zotlabs/Lib/Activity.php @@ -2081,16 +2081,29 @@ class Activity { } - static function update_poll($item, $post) { + static function update_poll($item_id, $post) { $multi = false; $mid = $post['mid']; $content = $post['title']; + if (!$item_id) { + return false; + } + + dbq("START TRANSACTION"); + + $item = q("SELECT * FROM item WHERE id = %d FOR UPDATE", + intval($item_id) + ); + if (!$item) { + dbq("COMMIT"); return false; } + $item = $item[0]; + $o = json_decode($item['obj'], true); if ($o && array_key_exists('anyOf', $o)) { $multi = true; @@ -2162,16 +2175,23 @@ class Activity { } logger('updated_poll: ' . print_r($o, true), LOGGER_DATA); if ($answer_found && !$found) { - q("update item set obj = '%s', edited = '%s' where id = %d", + $u = q("update item set obj = '%s', edited = '%s' where id = %d", dbesc(json_encode($o)), dbesc(datetime_convert()), intval($item['id']) ); - Master::Summon(['Notifier', 'wall-new', $item['id'], $post['mid'] /* trick queueworker de-duplication */ ]); - return true; + if ($u) { + dbq("COMMIT"); + Master::Summon(['Notifier', 'wall-new', $item['id']/* , $post['mid'] trick queueworker de-duplication */ ]); + return true; + } + + dbq("ROLLBACK"); + } + dbq("COMMIT"); return false; } diff --git a/include/items.php b/include/items.php index 891f16b7f..900ffe2fa 100644 --- a/include/items.php +++ b/include/items.php @@ -1834,7 +1834,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) { $arr['item_private'] = 0; if(in_array($arr['obj_type'], ['Note','Answer']) && $r[0]['obj_type'] === 'Question' && intval($r[0]['item_wall'])) { - Activity::update_poll($r[0],$arr); + Activity::update_poll($r[0]['id'], $arr); } } -- cgit v1.2.3