mirror of
https://github.com/zulip/zulip.git
synced 2025-11-18 04:43:58 +00:00
Only clear_scheduled_emails previously took a lock on the users before removing them; make deliver_scheduled_emails do so as well, by using prefetch_related to ensure that the table appears in the SELECT. This is not necessary for correctness, since all accesses of ScheduledEmailUser first access the ScheduledEmail and lock it; it is merely for consistency. Since SELECT ... FOR UPDATE takes an UPDATE lock on all tables mentioned in the SELECT, merely doing the prefetch is sufficient to lock both tables; no `on=(...)` is needed to `select_for_update`. This also does not address the pre-existing potential deadlock from these two use cases, where both try to lock the same ScheduledEmail rows in opposite orders.
1.8 KiB
1.8 KiB