Fix issue where synced media messages weren't downloading.

There was race where the AttachmentDownloadJob was run during a
transaction, which meant that it might not be able to see the message
that was just inserted.

Gotta be more careful now with WAL mode.
fork-5.53.8
Greyson Parrelli 2021-08-23 13:04:27 -04:00 zatwierdzone przez Alex Hart
rodzic dbb1e50d00
commit 29489a664e
1 zmienionych plików z 16 dodań i 11 usunięć

Wyświetl plik

@ -1367,10 +1367,13 @@ public final class MessageContentProcessor {
long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipients); long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipients);
database.beginTransaction(); long messageId;
List<DatabaseAttachment> attachments;
List<DatabaseAttachment> stickerAttachments;
database.beginTransaction();
try { try {
long messageId = database.insertMessageOutbox(mediaMessage, threadId, false, GroupReceiptDatabase.STATUS_UNKNOWN, null); messageId = database.insertMessageOutbox(mediaMessage, threadId, false, GroupReceiptDatabase.STATUS_UNKNOWN, null);
if (recipients.isGroup()) { if (recipients.isGroup()) {
updateGroupReceiptStatus(message, messageId, recipients.requireGroupId()); updateGroupReceiptStatus(message, messageId, recipients.requireGroupId());
@ -1381,14 +1384,9 @@ public final class MessageContentProcessor {
database.markAsSent(messageId, true); database.markAsSent(messageId, true);
List<DatabaseAttachment> allAttachments = DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(messageId); List<DatabaseAttachment> allAttachments = DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(messageId);
List<DatabaseAttachment> stickerAttachments = Stream.of(allAttachments).filter(Attachment::isSticker).toList();
List<DatabaseAttachment> attachments = Stream.of(allAttachments).filterNot(Attachment::isSticker).toList();
forceStickerDownloadIfNecessary(messageId, stickerAttachments); stickerAttachments = Stream.of(allAttachments).filter(Attachment::isSticker).toList();
attachments = Stream.of(allAttachments).filterNot(Attachment::isSticker).toList();
for (DatabaseAttachment attachment : attachments) {
ApplicationDependencies.getJobManager().add(new AttachmentDownloadJob(messageId, attachment.getAttachmentId(), false));
}
if (message.getMessage().getExpiresInSeconds() > 0) { if (message.getMessage().getExpiresInSeconds() > 0) {
database.markExpireStarted(messageId, message.getExpirationStartTimestamp()); database.markExpireStarted(messageId, message.getExpirationStartTimestamp());
@ -1409,6 +1407,13 @@ public final class MessageContentProcessor {
} finally { } finally {
database.endTransaction(); database.endTransaction();
} }
for (DatabaseAttachment attachment : attachments) {
ApplicationDependencies.getJobManager().add(new AttachmentDownloadJob(messageId, attachment.getAttachmentId(), false));
}
forceStickerDownloadIfNecessary(messageId, stickerAttachments);
return threadId; return threadId;
} }