From fa353259c31740898c4454fe70130ddf753ed851 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 13 Sep 2017 16:48:38 -0400 Subject: [PATCH] Process messages in a single transaction (wherever possible). // FREEBIE --- .../ConversationViewController.m | 3 ++- .../src/Devices/OWSRecordTranscriptJob.m | 8 ++++---- .../Attachments/OWSAttachmentsProcessor.h | 4 +++- .../Attachments/OWSAttachmentsProcessor.m | 5 +++++ .../OWSIncomingSentMessageTranscript.h | 4 +++- .../OWSIncomingSentMessageTranscript.m | 16 +++++++--------- SignalServiceKit/src/Messages/OWSMessageSender.m | 1 + .../src/Messages/TSMessagesManager.m | 2 ++ 8 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 37fc15bb1..2ea8bc59a 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -2598,7 +2598,8 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { handler:^(UIAlertAction *_Nonnull action) { OWSAttachmentsProcessor *processor = [[OWSAttachmentsProcessor alloc] initWithAttachmentPointer:attachmentPointer - networkManager:self.networkManager]; + networkManager:self.networkManager + storageManager:self.storageManager]; [processor fetchAttachmentsForMessage:message storageManager:self.storageManager success:^(TSAttachmentStream *_Nonnull attachmentStream) { diff --git a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m index 29e20c273..129f595b9 100644 --- a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m +++ b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m @@ -48,27 +48,27 @@ NS_ASSUME_NONNULL_BEGIN OWSIncomingSentMessageTranscript *transcript = self.incomingSentMessageTranscript; DDLogDebug(@"%@ Recording transcript: %@", self.tag, transcript); + TSThread *thread = [transcript threadWithTransaction:transaction]; if (transcript.isEndSessionMessage) { DDLogInfo(@"%@ EndSession was sent to recipient: %@.", self.tag, transcript.recipientId); - // NOTE: We dispatch_sync() here. - dispatch_sync([OWSDispatch sessionStoreQueue], ^{ + dispatch_async([OWSDispatch sessionStoreQueue], ^{ [self.storageManager deleteAllSessionsForContact:transcript.recipientId]; }); [[[TSInfoMessage alloc] initWithTimestamp:transcript.timestamp - inThread:transcript.thread + inThread:thread messageType:TSInfoMessageTypeSessionDidEnd] saveWithTransaction:transaction]; // Don't continue processing lest we print a bubble for the session reset. return; } - TSThread *thread = transcript.thread; OWSAttachmentsProcessor *attachmentsProcessor = [[OWSAttachmentsProcessor alloc] initWithAttachmentProtos:transcript.attachmentPointerProtos timestamp:transcript.timestamp relay:transcript.relay thread:thread networkManager:self.networkManager + storageManager:self.storageManager transaction:transaction]; // TODO group updates. Currently desktop doesn't support group updates, so not a problem yet. diff --git a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.h b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.h index 4f5a8713a..8fbc928a4 100644 --- a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.h +++ b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.h @@ -34,13 +34,15 @@ extern NSString *const kAttachmentDownloadAttachmentIDKey; relay:(nullable NSString *)relay thread:(TSThread *)thread networkManager:(TSNetworkManager *)networkManager + storageManager:(TSStorageManager *)storageManager transaction:(YapDatabaseReadWriteTransaction *)transaction NS_DESIGNATED_INITIALIZER; /* * Retry fetching failed attachment download */ - (instancetype)initWithAttachmentPointer:(TSAttachmentPointer *)attachmentPointer - networkManager:(TSNetworkManager *)networkManager NS_DESIGNATED_INITIALIZER; + networkManager:(TSNetworkManager *)networkManager + storageManager:(TSStorageManager *)storageManager NS_DESIGNATED_INITIALIZER; - (void)fetchAttachmentsForMessage:(nullable TSMessage *)message storageManager:(TSStorageManager *)storageManager diff --git a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m index 842084e8f..c9e92eec1 100644 --- a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m +++ b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m @@ -32,6 +32,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; @interface OWSAttachmentsProcessor () @property (nonatomic, readonly) TSNetworkManager *networkManager; +@property (nonatomic, readonly) TSStorageManager *storageManager; @property (nonatomic, readonly) NSArray *supportedAttachmentPointers; @end @@ -40,6 +41,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; - (instancetype)initWithAttachmentPointer:(TSAttachmentPointer *)attachmentPointer networkManager:(TSNetworkManager *)networkManager + storageManager:(TSStorageManager *)storageManager { self = [super init]; if (!self) { @@ -47,6 +49,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; } _networkManager = networkManager; + _storageManager = storageManager; _supportedAttachmentPointers = @[ attachmentPointer ]; _supportedAttachmentIds = @[ attachmentPointer.uniqueId ]; @@ -59,6 +62,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; relay:(nullable NSString *)relay thread:(TSThread *)thread networkManager:(TSNetworkManager *)networkManager + storageManager:(TSStorageManager *)storageManager transaction:(YapDatabaseReadWriteTransaction *)transaction { self = [super init]; @@ -67,6 +71,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; } _networkManager = networkManager; + _storageManager = storageManager; NSMutableArray *attachmentIds = [NSMutableArray new]; NSMutableArray *supportedAttachmentPointers = [NSMutableArray new]; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.h index 388a9d3da..2bc67484d 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.h @@ -8,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN @class OWSSignalServiceProtosDataMessage; @class OWSSignalServiceProtosAttachmentPointer; @class TSThread; +@class YapDatabaseReadWriteTransaction; /** * Represents notification of a message sent on our behalf from another device. @@ -23,7 +24,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) uint64_t timestamp; @property (nonatomic, readonly) uint64_t expirationStartedAt; @property (nonatomic, readonly) uint32_t expirationDuration; -@property (nonatomic, readonly) TSThread *thread; @property (nonatomic, readonly) BOOL isGroupUpdate; @property (nonatomic, readonly) BOOL isExpirationTimerUpdate; @property (nonatomic, readonly) BOOL isEndSessionMessage; @@ -31,6 +31,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) NSString *body; @property (nonatomic, readonly) NSArray *attachmentPointerProtos; +- (TSThread *)threadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m index b88a07222..5be228af4 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSIncomingSentMessageTranscript.m @@ -3,16 +3,14 @@ // #import "OWSIncomingSentMessageTranscript.h" -#import "OWSAttachmentsProcessor.h" #import "OWSSignalServiceProtos.pb.h" -#import "TSMessagesManager.h" -#import "TSOutgoingMessage.h" -#import "TSThread.h" - -// Thread finding imports #import "TSContactThread.h" #import "TSGroupModel.h" #import "TSGroupThread.h" +#import "TSMessagesManager.h" +#import "TSOutgoingMessage.h" +#import "TSStorageManager.h" +#import "TSThread.h" NS_ASSUME_NONNULL_BEGIN @@ -49,12 +47,12 @@ NS_ASSUME_NONNULL_BEGIN } } -- (TSThread *)thread +- (TSThread *)threadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { if (self.dataMessage.hasGroup) { - return [TSGroupThread getOrCreateThreadWithGroupIdData:self.dataMessage.group.id]; + return [TSGroupThread getOrCreateThreadWithGroupIdData:self.dataMessage.group.id transaction:transaction]; } else { - return [TSContactThread getOrCreateThreadWithContactId:self.recipientId]; + return [TSContactThread getOrCreateThreadWithContactId:self.recipientId transaction:transaction]; } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 7d008334e..e6d83dafc 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1187,6 +1187,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; encryptionException = exception; } }); + if (encryptionException) { DDLogInfo(@"%@ Exception during encryption: %@", self.tag, encryptionException); @throw encryptionException; diff --git a/SignalServiceKit/src/Messages/TSMessagesManager.m b/SignalServiceKit/src/Messages/TSMessagesManager.m index 1643ceaab..c86afeaeb 100644 --- a/SignalServiceKit/src/Messages/TSMessagesManager.m +++ b/SignalServiceKit/src/Messages/TSMessagesManager.m @@ -678,6 +678,7 @@ NS_ASSUME_NONNULL_BEGIN relay:envelope.relay thread:groupThread networkManager:self.networkManager + storageManager:self.storageManager transaction:transaction]; if (!attachmentsProcessor.hasSupportedAttachments) { @@ -713,6 +714,7 @@ NS_ASSUME_NONNULL_BEGIN relay:envelope.relay thread:thread networkManager:self.networkManager + storageManager:self.storageManager transaction:transaction]; if (!attachmentsProcessor.hasSupportedAttachments) { DDLogWarn(@"%@ received unsupported media envelope", self.tag);