mirror of
https://github.com/zulip/zulip.git
synced 2025-11-01 20:44:04 +00:00
thumbnail: Resolve a race condition when rendering messages.
Messages are rendered outside of a transaction, for performance reasons, and then sent inside of one. This opens thumbnailing up to a race where the thumbnails have not yet been written when the message is rendered, but the message has not been sent when thumbnailing completes, causing `rewrite_thumbnailed_images` to be a no-op and the message being left with a spinner which never resolves. Explicitly lock and use he ImageAttachment data inside the message-sending transaction, to rewrite the message content with the latest information about the existing thumbnails. Despite the thumbnailing worker taking a lock on Message rows to update them, this does not lead to deadlocks -- the INSERT of the Message rows happens in a transaction, ensuring that either the message rending blocks the thumbnailing until the Message row is created, or that the `rewrite_thumbnailed_images` and Message INSERT waits until thumbnailing is complete (and updated no Message rows).
This commit is contained in:
committed by
Tim Abbott
parent
2a14a08e63
commit
6f20c15ae9
@@ -170,7 +170,7 @@ def update_message_rendered_content(
|
||||
message.rendered_content,
|
||||
{} if image_data is None else {path_id: image_data},
|
||||
{path_id} if image_data is None else set(),
|
||||
)
|
||||
)[0]
|
||||
if rendered_content is None:
|
||||
# There were no updates -- for instance, if we re-run
|
||||
# ensure_thumbnails on an ImageAttachment we already
|
||||
|
||||
Reference in New Issue
Block a user