zulip/zerver/actions
Christopher Chong 28173cafc8 message_flags: Fix deadlocks when updating message flags.
Previously, an active production Zulip server would experience a class
of deadlocks caused by two or more concurrent bulk update operations
on the UserMessage table.

This is because UPDATE ... SET ... WHERE statements that execute in
parallel take row-level UPDATE locks as they get results; since the
query plans may result in getting rows in different orders between two
queries, this can result in deadlocks.

Some databases allow ORDER BY on their UPDATE ... WHERE statements;
PostgreSQL does not. In PostgreSQL, the answer is to do a sub-select
with an ORDER BY ... FOR UPDATE to ensure consistent ordering on row
locks.

We do this all code paths using bitand or bitor as part of bulk
editing message flags, which should ensure that these concurrent
operations obtain row level locks on the table in the same order.

Fixes #19054.
2022-09-06 16:06:58 -07:00
..
__init__.py
alert_words.py actions: Split out zerver.actions.alert_words. 2022-04-14 17:14:31 -07:00
bots.py bots: Allow changing bot owner without an acting_user. 2022-08-12 17:08:04 -07:00
create_realm.py read_receipts: Add support for displaying read receipts. 2022-08-12 13:16:35 -07:00
create_user.py user_groups: Add FULL_MEMBERS_GROUP_NAME constant. 2022-08-11 04:38:36 -07:00
custom_profile_fields.py custom_profile_fields: Delete invalid values for select-type fields. 2022-07-15 16:33:15 -07:00
default_streams.py typing: Broaden type annotations for QuerySet compatibility. 2022-07-07 11:27:42 -07:00
hotspots.py actions: Split out zerver.actions.hotspots. 2022-04-14 17:14:31 -07:00
invites.py billing: Fix licenses amount check during user signup/invitation. 2022-08-18 11:56:54 -07:00
message_delete.py actions: Create a separate message_delete.py file. 2022-09-01 14:18:38 -07:00
message_edit.py actions: Create a separate message_delete.py file. 2022-09-01 14:18:38 -07:00
message_flags.py message_flags: Fix deadlocks when updating message flags. 2022-09-06 16:06:58 -07:00
message_send.py internal_prep_private_message: Remove redundant realm arg. 2022-09-06 15:03:17 -07:00
muted_users.py actions: Split out zerver.actions.muted_users. 2022-04-14 17:14:36 -07:00
presence.py settings: Send presence update event toggling presence_enabled. 2022-08-25 12:30:12 -07:00
reactions.py actions: Split out zerver.actions.reactions. 2022-04-14 17:14:35 -07:00
realm_domains.py realm_domains: Type QuerySet.values as RealmDomainDict. 2022-07-07 11:27:42 -07:00
realm_emoji.py actions: Use transaction.atomic for do_remove_realm_emoji. 2022-07-31 18:32:28 -07:00
realm_export.py actions: Split out zerver.actions.realm_export. 2022-04-14 17:14:31 -07:00
realm_icon.py realm_audit_log: Explicitly stringify dict before insertion. 2022-07-26 09:48:33 -07:00
realm_linkifiers.py actions: Use transaction.atomic for do_remove_linkifier. 2022-07-31 18:32:28 -07:00
realm_logo.py actions: Split out zerver.actions.realm_logo. 2022-04-14 17:14:31 -07:00
realm_playgrounds.py actions: Split out zerver.actions.realm_playgrounds. 2022-04-14 17:14:30 -07:00
realm_settings.py actions: Create a separate message_delete.py file. 2022-09-01 14:18:38 -07:00
streams.py i18n: Deal with lazy strings more carefully. 2022-08-29 10:52:45 -07:00
submessage.py actions: Split out zerver.actions.submessage. 2022-04-14 17:14:30 -07:00
typing.py actions: Split out zerver.actions.typing. 2022-04-14 17:14:30 -07:00
uploads.py uploads: Avoid redefinition of a variable. 2022-07-26 18:00:24 -07:00
user_activity.py actions: Split out zerver.actions.user_activity. 2022-04-14 17:14:32 -07:00
user_groups.py user_groups: Add MEMBERS_GROUP_NAME constant. 2022-08-11 04:38:36 -07:00
user_settings.py typing: Broaden parameter type for bulk_regenerate_api_keys. 2022-08-29 11:06:41 -07:00
user_topics.py muted_topics: Clean up unmute topic event code duplication. 2022-08-04 17:44:00 -07:00
users.py python: Use a real parser for email addresses. 2022-07-29 15:47:33 -07:00
video_calls.py