diff options
author | Mario <mario@mariovavti.com> | 2023-01-11 16:34:23 +0000 |
---|---|---|
committer | Mario <mario@mariovavti.com> | 2023-01-11 16:34:23 +0000 |
commit | 16555b93bbe4ef69dbbce8085bb366134f8a5654 (patch) | |
tree | cf9364844857cef0c9e246eed7aa913a2a097ac1 | |
parent | 2eb4f093be868ef6ce8372de0375b2e9a2685791 (diff) | |
download | volse-hubzilla-16555b93bbe4ef69dbbce8085bb366134f8a5654.tar.gz volse-hubzilla-16555b93bbe4ef69dbbce8085bb366134f8a5654.tar.bz2 volse-hubzilla-16555b93bbe4ef69dbbce8085bb366134f8a5654.zip |
fix race conditions when processing multiple choice polls
-rw-r--r-- | Zotlabs/Lib/Activity.php | 28 | ||||
-rw-r--r-- | 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); } } |