zulip/zerver/actions
Alex Vandiver 003fa7adda message_edit: Lock the Message row in check_update_message.
Fundamentally, we should take a write lock on the message, check its
validity for a change, and then make and commit that change.
Previously, `check_update_message` did not operate in a transaction,
but `do_update_message` did -- which led to the ordering:

 - `check_update_message` reads Message, not in a transaction
 - `check_update_message` verifies properties of the Message
 - `do_update_message` starts a transaction
 - `do_update_message` takes a read lock on UserMessage
 - `do_update_message` writes on UserMessage
 - `do_update_message` writes Message
 - `do_update_message` commits

This leads to race conditions, where the `check_update_message` may
have verified based on stale data, and `do_update_message` may
improperly overwrite it; as well as deadlocks, where
other (properly-written) codepaths take a write lock on Message
_before_ updating UserMessage, and thus deadlock with
`do_update_message`.

Change `check_update_message` to open a transaction, and take the
write lock when first accessing the Message row.  We update the
comment above `do_update_message` to clarify this expectation.

The new ordering is thus:

 - `check_update_message` starts a transaction
 - `check_update_message` takes a write lock on Message
 - `check_update_message` verifies properties of the Message
 - `do_update_message` writes on UserMessage
 - `do_update_message` writes Message
 - `check_update_message` commits
2023-07-17 10:53:38 -07:00
..
__init__.py
alert_words.py actions: Split out zerver.actions.alert_words. 2022-04-14 17:14:31 -07:00
bots.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
create_realm.py create_realm: Remove unused argument from do_create_realm. 2023-05-11 12:13:50 -07:00
create_user.py onboarding: Rename variable to cutoff_date. 2023-07-13 11:46:34 -07:00
custom_profile_fields.py markdown: Pass realm down into render_stream_description. 2022-11-01 08:20:47 -07:00
default_streams.py default stream groups: Make deleting streams efficient. 2023-07-10 13:41:28 -07:00
hotspots.py actions: Split out zerver.actions.hotspots. 2022-04-14 17:14:31 -07:00
invites.py emails: Add corporate_enabled to context for emails. 2023-05-01 10:32:43 -07:00
message_delete.py zerver: Update comments with "private message" or "PM". 2023-06-23 11:24:13 -07:00
message_edit.py message_edit: Lock the Message row in check_update_message. 2023-07-17 10:53:38 -07:00
message_flags.py Remove statsd support. 2023-04-25 19:58:16 -07:00
message_send.py mention: Send notifications for @topic wildcard mentions. 2023-07-17 09:39:24 -07:00
muted_users.py muted users: Make file naming consistent. 2023-02-10 15:39:57 -08:00
presence.py presence: Support null values in UserPresence. 2023-04-26 14:26:47 -07:00
reactions.py emojis: Use get_emoji_data. 2023-07-17 09:35:53 -07:00
realm_domains.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_emoji.py realm emoji: Use a single cache for all lookups. 2023-07-17 09:35:53 -07:00
realm_export.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_icon.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_linkifiers.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_logo.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_playgrounds.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
realm_settings.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
scheduled_messages.py scheduled-messages: Split out edit scheduled message endpoint. 2023-05-26 18:05:55 -07:00
streams.py streams: Send stream creation events when subscribing guests. 2023-07-13 14:04:51 -07:00
submessage.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
typing.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
uploads.py scheduled_message: Handle attachments properly. 2023-05-08 09:56:02 -07:00
user_activity.py Remove statsd support. 2023-04-25 19:58:16 -07:00
user_groups.py user_groups: Audit UserGroup group based setting changes. 2023-07-11 08:56:55 -07:00
user_settings.py django_api: Extract send_event_on_commit helper. 2023-06-19 13:42:40 -07:00
user_status.py user-status: Stop updating the UserStatus model for `away` updates. 2022-09-23 12:27:54 -07:00
user_topics.py user_topics: Update 'set visibility policy' codepath for bulk db operations. 2023-03-29 09:50:06 -07:00
users.py user_groups: Audit UserGroup memberships changes. 2023-07-11 08:56:55 -07:00
video_calls.py