From 4f1f1a107f82b837c58f608e3a82209327b3856c Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 15:33:17 -0400 Subject: [PATCH 1/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.m | 74 +++++++++++-------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 307ebe66c..0885c8f95 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -138,36 +138,50 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); - // Block until all async registrations are complete. - // - // NOTE: This has to happen on the "registration connections" for this - // database. - NSMutableSet *pendingRegistrationConnectionSet = - [[((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; - DDLogVerbose(@"%@ flushing registration connections: %zd.", self.logTag, pendingRegistrationConnectionSet.count); - - dispatch_async(dispatch_get_main_queue(), ^{ - for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { - [dbConnection - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssertIsOnMainThread(); - OWSAssert(!self.areAsyncRegistrationsComplete); - - [pendingRegistrationConnectionSet removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count > 0) { - DDLogVerbose(@"%@ registration connection flushed.", self.logTag); - return; - } - - DDLogVerbose(@"%@ async registrations complete.", self.logTag); - - self.areAsyncRegistrationsComplete = YES; - - completion(); - }]; - } - }); + [[self registrationConnection] asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + // Block until all async registrations are complete. + // + // NOTE: This has to happen on the "registration connections" for this + // database. + NSMutableSet *pendingRegistrationConnectionSet = + [[((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; + DDLogVerbose(@"%@ flushing registration connections: %zd.", self.logTag, pendingRegistrationConnectionSet.count); + + dispatch_async(dispatch_get_main_queue(), ^{ + if (pendingRegistrationConnectionSet.count > 0) { + for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { + [dbConnection + flushTransactionsWithCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + OWSAssertIsOnMainThread(); + + [pendingRegistrationConnectionSet removeObject:dbConnection]; + if (pendingRegistrationConnectionSet.count > 0) { + DDLogVerbose(@"%@ registration connection flushed.", self.logTag); + return; + } + + [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; + }]; + } + } else { + [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; + } + }); + }]; +} + +- (void)markAsyncRegistrationsAsCompleteWithCompletion:(void (^_Nonnull)(void))completion +{ + OWSAssertIsOnMainThread(); + OWSAssert(!self.areAsyncRegistrationsComplete); + OWSAssert(completion); + + DDLogVerbose(@"%@ async registrations complete.", self.logTag); + + self.areAsyncRegistrationsComplete = YES; + + completion(); } + (void)protectFiles From 5d627ee89ff0e392ca9144423b8bc3102295cc9f Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 15:37:32 -0400 Subject: [PATCH 2/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.m | 73 +++++++++++-------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 0885c8f95..5e182ec88 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -138,37 +138,48 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); - [[self registrationConnection] asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - // Block until all async registrations are complete. - // - // NOTE: This has to happen on the "registration connections" for this - // database. - NSMutableSet *pendingRegistrationConnectionSet = - [[((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; - DDLogVerbose(@"%@ flushing registration connections: %zd.", self.logTag, pendingRegistrationConnectionSet.count); - - dispatch_async(dispatch_get_main_queue(), ^{ - if (pendingRegistrationConnectionSet.count > 0) { - for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { - [dbConnection - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssertIsOnMainThread(); - - [pendingRegistrationConnectionSet removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count > 0) { - DDLogVerbose(@"%@ registration connection flushed.", self.logTag); - return; - } - - [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; - }]; - } - } else { - [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; - } - }); - }]; + // Flush the write queue to ensure all async registrations have begun. + [[self registrationConnection] + flushTransactionsWithCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + // Block until all async registrations are complete. + // + // NOTE: This has to happen on the "registration connections" for this + // database. + NSMutableSet *pendingRegistrationConnectionSet = [ + [((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; + DDLogVerbose(@"%@ flushing registration connections: %zd.", + self.logTag, + pendingRegistrationConnectionSet.count); + + dispatch_async(dispatch_get_main_queue(), ^{ + if (pendingRegistrationConnectionSet.count > 0) { + for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { + [dbConnection + flushTransactionsWithCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + OWSAssertIsOnMainThread(); + + [pendingRegistrationConnectionSet + removeObject:dbConnection]; + if (pendingRegistrationConnectionSet.count + > 0) { + DDLogVerbose(@"%@ registration " + @"connection flushed.", + self.logTag); + return; + } + + [self + markAsyncRegistrationsAsCompleteWithCompletion: + completion]; + }]; + } + } else { + [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; + } + }); + }]; } - (void)markAsyncRegistrationsAsCompleteWithCompletion:(void (^_Nonnull)(void))completion From 5bbce14020248ca9f2a7963615c2e70085267f8d Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 15:53:12 -0400 Subject: [PATCH 3/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.m | 60 +++++++------------ 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 5e182ec88..b15cbdc9f 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -153,48 +153,34 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) pendingRegistrationConnectionSet.count); dispatch_async(dispatch_get_main_queue(), ^{ - if (pendingRegistrationConnectionSet.count > 0) { - for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { - [dbConnection - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssertIsOnMainThread(); - - [pendingRegistrationConnectionSet - removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count - > 0) { - DDLogVerbose(@"%@ registration " - @"connection flushed.", - self.logTag); - return; - } - - [self - markAsyncRegistrationsAsCompleteWithCompletion: - completion]; - }]; - } - } else { - [self markAsyncRegistrationsAsCompleteWithCompletion:completion]; + for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { + [dbConnection + flushTransactionsWithCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + OWSAssertIsOnMainThread(); + OWSAssert(!self.areAsyncRegistrationsComplete); + + [pendingRegistrationConnectionSet + removeObject:dbConnection]; + if (pendingRegistrationConnectionSet.count > 0) { + DDLogVerbose(@"%@ registration " + @"connection flushed.", + self.logTag); + return; + } + + DDLogVerbose(@"%@ async registrations complete.", + self.logTag); + + self.areAsyncRegistrationsComplete = YES; + + completion(); + }]; } }); }]; } -- (void)markAsyncRegistrationsAsCompleteWithCompletion:(void (^_Nonnull)(void))completion -{ - OWSAssertIsOnMainThread(); - OWSAssert(!self.areAsyncRegistrationsComplete); - OWSAssert(completion); - - DDLogVerbose(@"%@ async registrations complete.", self.logTag); - - self.areAsyncRegistrationsComplete = YES; - - completion(); -} - + (void)protectFiles { DDLogInfo( From e1138df771045c682c4041cc8f43781b535638bd Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 16:24:18 -0400 Subject: [PATCH 4/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.m | 52 ++++++------------- SignalServiceKit/src/Storage/OWSStorage.h | 6 --- SignalServiceKit/src/Storage/OWSStorage.m | 22 -------- 3 files changed, 17 insertions(+), 63 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index b15cbdc9f..5a2701434 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -132,52 +132,34 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) { OWSAssert(completion); - [((OWSDatabase *)self.database)collectRegistrationConnections]; - runAsyncRegistrationsForStorage(self); DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); // Flush the write queue to ensure all async registrations have begun. - [[self registrationConnection] + [[self newDatabaseConnection] flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ // Block until all async registrations are complete. // // NOTE: This has to happen on the "registration connections" for this // database. - NSMutableSet *pendingRegistrationConnectionSet = [ - [((OWSDatabase *)self.database)clearCollectedRegistrationConnections] mutableCopy]; - DDLogVerbose(@"%@ flushing registration connections: %zd.", - self.logTag, - pendingRegistrationConnectionSet.count); - - dispatch_async(dispatch_get_main_queue(), ^{ - for (YapDatabaseConnection *dbConnection in pendingRegistrationConnectionSet) { - [dbConnection - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssertIsOnMainThread(); - OWSAssert(!self.areAsyncRegistrationsComplete); - - [pendingRegistrationConnectionSet - removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count > 0) { - DDLogVerbose(@"%@ registration " - @"connection flushed.", - self.logTag); - return; - } - - DDLogVerbose(@"%@ async registrations complete.", - self.logTag); - - self.areAsyncRegistrationsComplete = YES; - - completion(); - }]; - } - }); + + OWSAssert(!self.areAsyncRegistrationsComplete); + + [pendingRegistrationConnectionSet removeObject:dbConnection]; + if (pendingRegistrationConnectionSet.count > 0) { + DDLogVerbose(@"%@ registration " + @"connection flushed.", + self.logTag); + return; + } + + DDLogVerbose(@"%@ async registrations complete.", self.logTag); + + self.areAsyncRegistrationsComplete = YES; + + completion(); }]; } diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 5beab984e..bff225e68 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -44,12 +44,6 @@ extern NSString *const StorageIsReadyNotification; options:(YapDatabaseOptions *)inOptions delegate:(id)delegate NS_DESIGNATED_INITIALIZER; -// Starts collecting references to the registration connections. -- (void)collectRegistrationConnections; -// Stops collecting references to the registration connections and returns -// all collected connections. -- (NSSet *)clearCollectedRegistrationConnections; - @end #pragma mark - diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index e79cc8069..c3a3418c0 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -134,8 +134,6 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); @property (atomic, weak) id delegate; -@property (nonatomic, readonly, nullable) NSMutableSet *registrationConnectionSet; - @end #pragma mark - @@ -185,29 +183,9 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); ((OWSDatabaseConnection *)connection).canWriteBeforeStorageReady = YES; #endif - [self.registrationConnectionSet addObject:connection]; - return connection; } -- (void)collectRegistrationConnections -{ - OWSAssert(!self.registrationConnectionSet); - - _registrationConnectionSet = [NSMutableSet set]; -} - -- (NSSet *)clearCollectedRegistrationConnections -{ - OWSAssert(self.registrationConnectionSet); - - NSSet *registrationConnectionSetCopy = [self.registrationConnectionSet copy]; - - _registrationConnectionSet = nil; - - return registrationConnectionSetCopy; -} - @end #pragma mark - From a264268253327012b1008f4f5c92e9796a212789 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 16:28:15 -0400 Subject: [PATCH 5/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.m | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 5a2701434..9a182e0b6 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -136,31 +136,23 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); - // Flush the write queue to ensure all async registrations have begun. - [[self newDatabaseConnection] - flushTransactionsWithCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ - // Block until all async registrations are complete. - // - // NOTE: This has to happen on the "registration connections" for this - // database. - - OWSAssert(!self.areAsyncRegistrationsComplete); - - [pendingRegistrationConnectionSet removeObject:dbConnection]; - if (pendingRegistrationConnectionSet.count > 0) { - DDLogVerbose(@"%@ registration " - @"connection flushed.", - self.logTag); - return; - } - - DDLogVerbose(@"%@ async registrations complete.", self.logTag); - - self.areAsyncRegistrationsComplete = YES; - - completion(); - }]; + // Use an empty read/write transaction to to ensure all async registrations have completed. + [[self newDatabaseConnection] asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + // Do nothing. + // + // We can't use flushTransactionsWithCompletionQueue because it + // doesn't flush the YapDatabase.writeQueue. + } + completionQueue:dispatch_get_main_queue() + completionBlock:^{ + OWSAssert(!self.areAsyncRegistrationsComplete); + + DDLogVerbose(@"%@ async registrations complete.", self.logTag); + + self.areAsyncRegistrationsComplete = YES; + + completion(); + }]; } + (void)protectFiles From 35ee8c1a0da46da122e86261b1e3353a79f3bea7 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 16:44:47 -0400 Subject: [PATCH 6/6] Rework flush of registration connection(s). --- .../src/Storage/OWSPrimaryStorage.h | 3 -- .../src/Storage/OWSPrimaryStorage.m | 31 ++++++++----------- SignalServiceKit/src/Storage/OWSStorage.h | 3 ++ SignalServiceKit/src/Storage/OWSStorage.m | 13 ++++++++ SignalServiceKit/src/Storage/TSDatabaseView.h | 3 +- SignalServiceKit/src/Storage/TSDatabaseView.m | 5 ++- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.h b/SignalServiceKit/src/Storage/OWSPrimaryStorage.h index 39cc94af2..64c68ba8d 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.h +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.h @@ -6,9 +6,6 @@ NS_ASSUME_NONNULL_BEGIN -void runSyncRegistrationsForStorage(OWSStorage *storage); -void runAsyncRegistrationsForStorage(OWSStorage *storage); - @interface OWSPrimaryStorage : OWSStorage - (instancetype)init NS_UNAVAILABLE; diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index 9a182e0b6..3329e494b 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -30,9 +30,10 @@ void runSyncRegistrationsForStorage(OWSStorage *storage) [TSDatabaseView registerCrossProcessNotifier:storage]; } -void runAsyncRegistrationsForStorage(OWSStorage *storage) +void runAsyncRegistrationsForStorage(OWSStorage *storage, dispatch_block_t completion) { OWSCAssert(storage); + OWSCAssert(completion); // Asynchronously register other extensions. // @@ -57,7 +58,9 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) [OWSFailedMessagesJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; [OWSFailedAttachmentDownloadsJob asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; [OWSMediaGalleryFinder asyncRegisterDatabaseExtensionsWithPrimaryStorage:storage]; - [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:storage]; + // NOTE: Always pass the completion to the _LAST_ of the async database + // view registrations. + [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:storage completion:completion]; } #pragma mark - @@ -132,27 +135,19 @@ void runAsyncRegistrationsForStorage(OWSStorage *storage) { OWSAssert(completion); - runAsyncRegistrationsForStorage(self); + DDLogVerbose(@"%@ async registrations enqueuing.", self.logTag); - DDLogVerbose(@"%@ async registrations enqueued.", self.logTag); + runAsyncRegistrationsForStorage(self, ^{ + OWSAssertIsOnMainThread(); - // Use an empty read/write transaction to to ensure all async registrations have completed. - [[self newDatabaseConnection] asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - // Do nothing. - // - // We can't use flushTransactionsWithCompletionQueue because it - // doesn't flush the YapDatabase.writeQueue. - } - completionQueue:dispatch_get_main_queue() - completionBlock:^{ - OWSAssert(!self.areAsyncRegistrationsComplete); + OWSAssert(!self.areAsyncRegistrationsComplete); - DDLogVerbose(@"%@ async registrations complete.", self.logTag); + DDLogVerbose(@"%@ async registrations complete.", self.logTag); - self.areAsyncRegistrationsComplete = YES; + self.areAsyncRegistrationsComplete = YES; - completion(); - }]; + completion(); + }); } + (void)protectFiles diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index bff225e68..12198be48 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -71,6 +71,9 @@ extern NSString *const StorageIsReadyNotification; #endif - (void)asyncRegisterExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName; +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completion:(nullable dispatch_block_t)completion; - (nullable id)registeredExtension:(NSString *)extensionName; diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index c3a3418c0..75e97c45e 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -487,6 +487,13 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); - (void)asyncRegisterExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName +{ + [self asyncRegisterExtension:extension withName:extensionName completion:nil]; +} + +- (void)asyncRegisterExtension:(YapDatabaseExtension *)extension + withName:(NSString *)extensionName + completion:(nullable dispatch_block_t)completion { [self.database asyncRegisterExtension:extension withName:extensionName @@ -496,6 +503,12 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); } else { DDLogVerbose(@"%@ asyncRegisterExtension succeeded: %@", self.logTag, extensionName); } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (completion) { + completion(); + } + }); }]; } diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.h b/SignalServiceKit/src/Storage/TSDatabaseView.h index 3e83d174b..9954804a6 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.h +++ b/SignalServiceKit/src/Storage/TSDatabaseView.h @@ -58,6 +58,7 @@ extern NSString *const TSLazyRestoreAttachmentsDatabaseViewExtensionName; + (void)asyncRegisterSecondaryDevicesDatabaseView:(OWSStorage *)storage; -+ (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage; ++ (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage + completion:(nullable dispatch_block_t)completion; @end diff --git a/SignalServiceKit/src/Storage/TSDatabaseView.m b/SignalServiceKit/src/Storage/TSDatabaseView.m index 9e5098b61..c73cf8426 100644 --- a/SignalServiceKit/src/Storage/TSDatabaseView.m +++ b/SignalServiceKit/src/Storage/TSDatabaseView.m @@ -343,6 +343,7 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" } + (void)asyncRegisterLazyRestoreAttachmentsDatabaseView:(OWSStorage *)storage + completion:(nullable dispatch_block_t)completion { YapDatabaseViewGrouping *viewGrouping = [YapDatabaseViewGrouping withObjectBlock:^NSString *_Nullable( YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id object) { @@ -391,7 +392,9 @@ NSString *const TSLazyRestoreAttachmentsGroup = @"TSLazyRestoreAttachmentsGroup" [[YapWhitelistBlacklist alloc] initWithWhitelist:[NSSet setWithObject:[TSAttachment collection]]]; YapDatabaseView *view = [[YapDatabaseAutoView alloc] initWithGrouping:viewGrouping sorting:viewSorting versionTag:@"3" options:options]; - [storage asyncRegisterExtension:view withName:TSLazyRestoreAttachmentsDatabaseViewExtensionName]; + [storage asyncRegisterExtension:view + withName:TSLazyRestoreAttachmentsDatabaseViewExtensionName + completion:completion]; } + (id)unseenDatabaseViewExtension:(YapDatabaseReadTransaction *)transaction