From 8ef9e96b91dad2cd1eeb7f22e15c8fe7a969a285 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 6 Nov 2017 11:26:04 -0500 Subject: [PATCH] Avoid group-sync deadlock by making post-upload save async // FREEBIE --- SignalServiceKit/src/Network/API/OWSUploadingService.m | 4 +--- SignalServiceKit/src/Storage/TSYapDatabaseObject.h | 3 ++- SignalServiceKit/src/Storage/TSYapDatabaseObject.m | 8 ++++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Network/API/OWSUploadingService.m b/SignalServiceKit/src/Network/API/OWSUploadingService.m index 97127bdb2..3cc067802 100644 --- a/SignalServiceKit/src/Network/API/OWSUploadingService.m +++ b/SignalServiceKit/src/Network/API/OWSUploadingService.m @@ -107,9 +107,7 @@ static const CGFloat kAttachmentUploadProgressTheta = 0.001f; DDLogInfo(@"%@ Uploaded attachment: %p.", self.tag, attachmentStream); attachmentStream.serverId = serverId; attachmentStream.isUploaded = YES; - [attachmentStream save]; - - successHandlerWrapper(); + [attachmentStream saveAsyncWithCompletionBlock:successHandlerWrapper]; } failure:failureHandlerWrapper]; diff --git a/SignalServiceKit/src/Storage/TSYapDatabaseObject.h b/SignalServiceKit/src/Storage/TSYapDatabaseObject.h index 07dbcc6f8..f77f36b29 100644 --- a/SignalServiceKit/src/Storage/TSYapDatabaseObject.h +++ b/SignalServiceKit/src/Storage/TSYapDatabaseObject.h @@ -81,9 +81,10 @@ + (instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID NS_SWIFT_NAME(fetch(uniqueId:)); /** - * Saves the object with a new YapDatabaseConnection + * Saves the object with shared readWrite connection. */ - (void)save; +- (void)saveAsyncWithCompletionBlock:(void (^_Nullable)(void))completionBlock; /** * Saves the object with the provided transaction diff --git a/SignalServiceKit/src/Storage/TSYapDatabaseObject.m b/SignalServiceKit/src/Storage/TSYapDatabaseObject.m index 032d55b48..ec392ccde 100644 --- a/SignalServiceKit/src/Storage/TSYapDatabaseObject.m +++ b/SignalServiceKit/src/Storage/TSYapDatabaseObject.m @@ -37,6 +37,14 @@ }]; } +- (void)saveAsyncWithCompletionBlock:(void (^_Nullable)(void))completionBlock +{ + [[self dbReadWriteConnection] asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { + [self saveWithTransaction:transaction]; + } + completionBlock:completionBlock]; +} + - (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { [transaction touchObjectForKey:self.uniqueId inCollection:[self.class collection]];