From 9962bf56b1256997def3dd7e4f2da37474dca707 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 26 Mar 2018 13:56:52 -0400 Subject: [PATCH] Fix 'invalid auth can hang on launch' issue. --- .../OWS106EnsureProfileComplete.swift | 58 +++++++------------ .../migrations/OWSDatabaseMigration.m | 7 +++ 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift b/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift index 3e88834b6..5e663255f 100644 --- a/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift +++ b/SignalMessaging/environment/migrations/OWS106EnsureProfileComplete.swift @@ -27,7 +27,7 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration { Logger.info("\(self.TAG) Completed. Saving.") self.save() } else { - Logger.error("\(self.TAG) Failed. Saving.") + Logger.error("\(self.TAG) Failed.") } completion() @@ -48,9 +48,8 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration { let TAG = "[CompleteRegistrationFixerJob]" // Duration between retries if update fails. - static let kRetryInterval: TimeInterval = 5 * 60 + let kRetryInterval: TimeInterval = 5 - var timer: Timer? let completionHandler: (Bool) -> Void init(completionHandler: @escaping (Bool) -> Void) { @@ -58,43 +57,30 @@ public class OWS106EnsureProfileComplete: OWSDatabaseMigration { } func start() { - assert(self.timer == nil) - - let timer = WeakTimer.scheduledTimer(timeInterval: CompleteRegistrationFixerJob.kRetryInterval, target: self, userInfo: nil, repeats: true) { [weak self] aTimer in - guard let strongSelf = self else { - return - } + guard TSAccountManager.isRegistered() else { + self.completionHandler(true) + return + } - var isCompleted = false - strongSelf.ensureProfileComplete().then { _ -> Void in - guard isCompleted == false else { - Logger.info("\(strongSelf.TAG) Already saved. Skipping redundant call.") + self.ensureProfileComplete().then { _ -> Void in + Logger.info("\(self.TAG) complete. Canceling timer and saving.") + self.completionHandler(true) + }.catch { error in + let nserror = error as NSError + if nserror.domain == TSNetworkManagerDomain { + // Don't retry if we had an unrecoverable error. + // In particular, 401 (invalid auth) is unrecoverable. + let isUnrecoverableError = nserror.code == 401 + if isUnrecoverableError { + Logger.error("\(self.TAG) failed due to unrecoverable error: \(error). Aborting.") + self.completionHandler(true) return } - Logger.info("\(strongSelf.TAG) complete. Canceling timer and saving.") - isCompleted = true - aTimer.invalidate() - strongSelf.completionHandler(true) - }.catch { error in - let nserror = error as NSError - if nserror.domain == TSNetworkManagerDomain { - // Don't retry if we had an unrecoverable error. - // In particular, 401 (invalid auth) is unrecoverable. - let isUnrecoverableError = (400 <= nserror.code) && (nserror.code <= 599) - if isUnrecoverableError { - Logger.error("\(strongSelf.TAG) failed due to unrecoverable error: \(error). Aborting.") - aTimer.invalidate() - strongSelf.completionHandler(false) - return - } - } - - Logger.error("\(strongSelf.TAG) failed with \(error). We'll try again in \(CompleteRegistrationFixerJob.kRetryInterval) seconds.") - }.retainUntilComplete() - } - self.timer = timer + } - timer.fire() + Logger.error("\(self.TAG) failed with \(error).") + self.completionHandler(false) + }.retainUntilComplete() } func ensureProfileComplete() -> Promise { diff --git a/SignalMessaging/environment/migrations/OWSDatabaseMigration.m b/SignalMessaging/environment/migrations/OWSDatabaseMigration.m index 85c474a21..7ff231076 100644 --- a/SignalMessaging/environment/migrations/OWSDatabaseMigration.m +++ b/SignalMessaging/environment/migrations/OWSDatabaseMigration.m @@ -9,6 +9,13 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSDatabaseMigration +- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + DDLogInfo(@"%@ marking migration as complete.", self.logTag); + + [super saveWithTransaction:transaction]; +} + - (instancetype)initWithPrimaryStorage:(OWSPrimaryStorage *)primaryStorage { self = [super initWithUniqueId:[self.class migrationId]];