From 5d627ee89ff0e392ca9144423b8bc3102295cc9f Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 18 Apr 2018 15:37:32 -0400 Subject: [PATCH] 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