From b09da45672dff482ebf82d475e6bb907e58bfbba Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 19 Sep 2019 13:34:43 -0300 Subject: [PATCH] Rework isStorageReady. --- Signal/src/AppDelegate.m | 2 +- Signal/src/util/Backup/OWSBackupJob.m | 12 ++++++++- SignalMessaging/environment/AppSetup.m | 4 +-- .../migrations/YDBToGRDBMigration.swift | 6 +++-- SignalMessaging/utils/OWSScreenLock.swift | 12 ++++++--- .../src/Storage/StorageCoordinator.h | 4 ++- .../src/Storage/StorageCoordinator.m | 26 ++++++++++++++++++- .../src/TestUtils/MockSSKEnvironment.m | 7 +++++ .../ShareViewController.swift | 6 ++++- 9 files changed, 66 insertions(+), 13 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index be3f0f8085..9a6c9b4185 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1231,7 +1231,7 @@ static NSTimeInterval launchStartedAt; if (!self.areVersionMigrationsComplete) { return; } - if (![OWSStorage isStorageReady]) { + if (![self.storageCoordinator isStorageReady]) { return; } if ([AppReadiness isAppReady]) { diff --git a/Signal/src/util/Backup/OWSBackupJob.m b/Signal/src/util/Backup/OWSBackupJob.m index 860d593a85..2d7f9a4aac 100644 --- a/Signal/src/util/Backup/OWSBackupJob.m +++ b/Signal/src/util/Backup/OWSBackupJob.m @@ -7,6 +7,7 @@ #import "Signal-Swift.h" #import #import +#import #import NS_ASSUME_NONNULL_BEGIN @@ -46,6 +47,15 @@ NSString *const kOWSBackup_KeychainService = @"kOWSBackup_KeychainService"; @implementation OWSBackupJob +#pragma mark - Dependencies + +- (StorageCoordinator *)storageCoordinator +{ + return SSKEnvironment.shared.storageCoordinator; +} + +#pragma mark - + - (instancetype)initWithDelegate:(id)delegate recipientId:(NSString *)recipientId { self = [super init]; @@ -55,7 +65,7 @@ NSString *const kOWSBackup_KeychainService = @"kOWSBackup_KeychainService"; } OWSAssertDebug(recipientId.length > 0); - OWSAssertDebug([OWSStorage isStorageReady]); + OWSAssertDebug([self.storageCoordinator isStorageReady]); self.delegate = delegate; self.recipientId = recipientId; diff --git a/SignalMessaging/environment/AppSetup.m b/SignalMessaging/environment/AppSetup.m index 01d37bc388..f4589ca0cf 100644 --- a/SignalMessaging/environment/AppSetup.m +++ b/SignalMessaging/environment/AppSetup.m @@ -102,7 +102,7 @@ NS_ASSUME_NONNULL_BEGIN OWSSounds *sounds = [OWSSounds new]; id proximityMonitoringManager = [OWSProximityMonitoringManagerImpl new]; OWSWindowManager *windowManager = [[OWSWindowManager alloc] initDefault]; - + [Environment setShared:[[Environment alloc] initWithAudioSession:audioSession preferences:preferences proximityMonitoringManager:proximityMonitoringManager @@ -167,7 +167,7 @@ NS_ASSUME_NONNULL_BEGIN migrationCompletion(); - [StorageCoordinator postStorageIsReadyNotification]; + [storageCoordinator storageSetupDidComplete]; OWSAssertDebug(backgroundTask); backgroundTask = nil; diff --git a/SignalMessaging/environment/migrations/YDBToGRDBMigration.swift b/SignalMessaging/environment/migrations/YDBToGRDBMigration.swift index 9c0487dbbb..32d8329582 100644 --- a/SignalMessaging/environment/migrations/YDBToGRDBMigration.swift +++ b/SignalMessaging/environment/migrations/YDBToGRDBMigration.swift @@ -112,6 +112,10 @@ extension YDBToGRDBMigration { return SSKEnvironment.shared.primaryStorage } + private var storageCoordinator: StorageCoordinator { + return SSKEnvironment.shared.storageCoordinator + } + // MARK: - func run() throws { @@ -176,8 +180,6 @@ extension YDBToGRDBMigration { } func migrate(migratorGroups: [GRDBMigratorGroup]) throws { - assert(OWSStorage.isStorageReady()) - Logger.info("") // We can't nest ydbTransactions in GRDB and vice-versa diff --git a/SignalMessaging/utils/OWSScreenLock.swift b/SignalMessaging/utils/OWSScreenLock.swift index 04760b778a..3ff6fb5b15 100644 --- a/SignalMessaging/utils/OWSScreenLock.swift +++ b/SignalMessaging/utils/OWSScreenLock.swift @@ -14,6 +14,10 @@ public class OWSScreenLock: NSObject { return SDSDatabaseStorage.shared } + private var storageCoordinator: StorageCoordinator { + return SSKEnvironment.shared.storageCoordinator + } + // MARK: - public enum OWSScreenLockOutcome { @@ -63,7 +67,7 @@ public class OWSScreenLock: NSObject { public func isScreenLockEnabled() -> Bool { AssertIsOnMainThread() - if !OWSStorage.isStorageReady() { + if !storageCoordinator.isStorageReady { owsFailDebug("accessed screen lock state before storage is ready.") return false } @@ -78,7 +82,7 @@ public class OWSScreenLock: NSObject { @objc public func setIsScreenLockEnabled(_ value: Bool) { AssertIsOnMainThread() - assert(OWSStorage.isStorageReady()) + assert(storageCoordinator.isStorageReady) databaseStorage.write { transaction in self.keyValueStore.setBool(value, @@ -93,7 +97,7 @@ public class OWSScreenLock: NSObject { public func screenLockTimeout() -> TimeInterval { AssertIsOnMainThread() - if !OWSStorage.isStorageReady() { + if !storageCoordinator.isStorageReady { owsFailDebug("accessed screen lock state before storage is ready.") return 0 } @@ -108,7 +112,7 @@ public class OWSScreenLock: NSObject { @objc public func setScreenLockTimeout(_ value: TimeInterval) { AssertIsOnMainThread() - assert(OWSStorage.isStorageReady()) + assert(storageCoordinator.isStorageReady) databaseStorage.write { transaction in self.keyValueStore.setDouble(value, diff --git a/SignalServiceKit/src/Storage/StorageCoordinator.h b/SignalServiceKit/src/Storage/StorageCoordinator.h index dd2dca947c..d233666f52 100644 --- a/SignalServiceKit/src/Storage/StorageCoordinator.h +++ b/SignalServiceKit/src/Storage/StorageCoordinator.h @@ -27,6 +27,8 @@ NSString *NSStringFromStorageCoordinatorState(StorageCoordinatorState value); @property (atomic, readonly) BOOL isMigrating; +@property (atomic, readonly) BOOL isStorageReady; + - (instancetype)init; // These methods should only be called by the migration itself. @@ -43,7 +45,7 @@ NSString *NSStringFromStorageCoordinatorState(StorageCoordinatorState value); - (void)useYDBForTests; #endif -+ (void)postStorageIsReadyNotification; +- (void)storageSetupDidComplete; @end diff --git a/SignalServiceKit/src/Storage/StorageCoordinator.m b/SignalServiceKit/src/Storage/StorageCoordinator.m index 403f67391a..1550f08938 100644 --- a/SignalServiceKit/src/Storage/StorageCoordinator.m +++ b/SignalServiceKit/src/Storage/StorageCoordinator.m @@ -35,6 +35,8 @@ NSString *NSStringFromStorageCoordinatorState(StorageCoordinatorState value) @property (atomic) StorageCoordinatorState state; +@property (atomic) BOOL isStorageSetupComplete; + @end #pragma mark - @@ -191,7 +193,14 @@ NSString *NSStringFromStorageCoordinatorState(StorageCoordinatorState value) [OWSStorage deleteDBKeys]; } -+ (void)postStorageIsReadyNotification +- (void)storageSetupDidComplete +{ + self.isStorageSetupComplete = YES; + + [self postStorageIsReadyNotification]; +} + +- (void)postStorageIsReadyNotification { OWSLogInfo(@""); @@ -203,6 +212,21 @@ NSString *NSStringFromStorageCoordinatorState(StorageCoordinatorState value) }); } +- (BOOL)isStorageReady +{ + switch (self.state) { + case StorageCoordinatorStateYDB: + case StorageCoordinatorStateYDBTests: + return [OWSStorage isStorageReady] && self.isStorageSetupComplete; + case StorageCoordinatorStateBeforeYDBToGRDBMigration: + case StorageCoordinatorStateDuringYDBToGRDBMigration: + return NO; + case StorageCoordinatorStateGRDB: + case StorageCoordinatorStateGRDBTests: + return self.isStorageSetupComplete; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m b/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m index 380d1d8d28..7eb82e7f14 100644 --- a/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m +++ b/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m @@ -26,6 +26,7 @@ #import "StorageCoordinator.h" #import "TSAccountManager.h" #import "TSSocketManager.h" +#import #import #import @@ -57,6 +58,9 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init { + // Ensure that OWSBackgroundTaskManager is created now. + [OWSBackgroundTaskManager sharedManager]; + StorageCoordinator *storageCoordinator = [StorageCoordinator new]; SDSDatabaseStorage *databaseStorage = storageCoordinator.databaseStorage; // Unlike AppSetup, we always load YDB in the tests. @@ -136,6 +140,7 @@ NS_ASSUME_NONNULL_BEGIN self.callMessageHandler = [OWSFakeCallMessageHandler new]; self.notificationsManager = [NoopNotificationsManager new]; + return self; } @@ -144,6 +149,8 @@ NS_ASSUME_NONNULL_BEGIN if (self.databaseStorage.canLoadYdb) { __block dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [OWSStorage registerExtensionsWithCompletionBlock:^() { + [self.storageCoordinator storageSetupDidComplete]; + dispatch_semaphore_signal(semaphore); }]; diff --git a/SignalShareExtension/ShareViewController.swift b/SignalShareExtension/ShareViewController.swift index c6bc1b9e32..e4e434f3c9 100644 --- a/SignalShareExtension/ShareViewController.swift +++ b/SignalShareExtension/ShareViewController.swift @@ -30,6 +30,10 @@ public class ShareViewController: UIViewController, ShareViewDelegate, SAEFailed return SSKEnvironment.shared.syncManager } + private var storageCoordinator: StorageCoordinator { + return SSKEnvironment.shared.storageCoordinator + } + // MARK: - enum ShareViewControllerError: Error { @@ -257,7 +261,7 @@ public class ShareViewController: UIViewController, ShareViewDelegate, SAEFailed guard areVersionMigrationsComplete else { return } - guard OWSStorage.isStorageReady() else { + guard storageCoordinator.isStorageReady else { return } guard !AppReadiness.isAppReady() else {