From 32a4a112b1bf27f586848e8b3ac252b43d2a3c43 Mon Sep 17 00:00:00 2001 From: Prakhar Pratyush Date: Fri, 16 Aug 2024 17:35:27 +0530 Subject: [PATCH] message_flags: Update do_mark_muted_user...read to send event on commit. Earlier, we were using 'send_event' in 'do_mark_muted_user_messages_as_read' which can lead to a situation where we enqueue events but the function fails at a later stage. Events should not be sent until we know we're not rolling back. Fixes part of #30489. --- zerver/actions/message_flags.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/zerver/actions/message_flags.py b/zerver/actions/message_flags.py index f1faf374cf..ed1a6421e5 100644 --- a/zerver/actions/message_flags.py +++ b/zerver/actions/message_flags.py @@ -155,24 +155,24 @@ def do_mark_stream_messages_as_read( return count +@transaction.atomic(savepoint=False) def do_mark_muted_user_messages_as_read( user_profile: UserProfile, muted_user: UserProfile, ) -> int: - with transaction.atomic(savepoint=False): - query = ( - UserMessage.select_for_update_query() - .filter(user_profile=user_profile, message__sender=muted_user) - .extra(where=[UserMessage.where_unread()]) # noqa: S610 - ) - message_ids = list(query.values_list("message_id", flat=True)) + query = ( + UserMessage.select_for_update_query() + .filter(user_profile=user_profile, message__sender=muted_user) + .extra(where=[UserMessage.where_unread()]) # noqa: S610 + ) + message_ids = list(query.values_list("message_id", flat=True)) - if len(message_ids) == 0: - return 0 + if len(message_ids) == 0: + return 0 - count = query.update( - flags=F("flags").bitor(UserMessage.flags.read), - ) + count = query.update( + flags=F("flags").bitor(UserMessage.flags.read), + ) event = asdict( ReadMessagesEvent( @@ -182,7 +182,7 @@ def do_mark_muted_user_messages_as_read( ) event_time = timezone_now() - send_event(user_profile.realm, event, [user_profile.id]) + send_event_on_commit(user_profile.realm, event, [user_profile.id]) do_clear_mobile_push_notifications_for_ids([user_profile.id], message_ids) do_increment_logging_stat(