Refine error retry handling.

This commit is contained in:
Matthew Chen 2020-08-12 16:39:40 -03:00
parent debfabda42
commit c846da367c
8 changed files with 18 additions and 40 deletions

View File

@ -51,8 +51,7 @@ class ConversationConfigurationSyncOperation: OWSOperation {
}
private func reportAssertionError(description: String) {
let error: NSError = ColorSyncOperationError.assertionError(description: description) as NSError
error.isRetryable = false
let error = ColorSyncOperationError.assertionError(description: description).asRetryableError
self.reportError(error)
}

View File

@ -259,9 +259,7 @@ public extension GroupsV2Impl {
}.catch(on: .global()) { (error) in
// tryToRestoreNextGroup() should never fail.
owsFailDebug("Group restore failed: \(error)")
let nsError: NSError = error as NSError
nsError.isRetryable = false
self.reportError(nsError)
self.reportError(error.asUnretryableError)
}
}

View File

@ -568,8 +568,7 @@ public extension OWSProfileManager {
error: &requestError)
if let error = requestError {
owsFailDebug("Could not create request failed: \(error)")
error.isRetryable = false
throw error
throw error.asUnretryableError
}
let (promise, resolver) = Promise<Data>.pending()
@ -583,9 +582,7 @@ public extension OWSProfileManager {
completionHandler: { (_, completionUrl, error) in
if let error = error {
Logger.warn("Download failed: \(error)")
let errorCopy = error as NSError
errorCopy.isRetryable = error.isNetworkFailureOrTimeout
return resolver.reject(errorCopy)
return resolver.reject(error.withDefaultRetry)
}
guard completionUrl == tempFileURL else {
return resolver.reject(OWSAssertionError("Unexpected file URL."))
@ -594,11 +591,10 @@ public extension OWSProfileManager {
do {
let data = try Data(contentsOf: tempFileURL)
resolver.fulfill(data)
} catch let error as NSError {
} catch {
owsFailDebug("Could not load data failed: \(error)")
// Fail immediately; do not retry.
error.isRetryable = false
return resolver.reject(error)
return resolver.reject(error.asUnretryableError)
}
})
task.resume()

View File

@ -60,16 +60,14 @@ class LegacyContactDiscoveryOperation: ContactDiscovering {
if IsNetworkConnectivityFailure(error) {
responseResolver.reject(error)
} else {
let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError
responseError.isRetryable = true
let responseError = OWSErrorMakeUnableToProcessServerResponseError().asRetryableError
responseResolver.reject(responseError)
}
return
}
guard response.statusCode != 413 else {
let nsError = OWSErrorWithCodeDescription(OWSErrorCode.contactDiscoveryRateLimit, "Contacts Intersection Rate Limit") as NSError
nsError.isRetryable = false
let nsError = OWSErrorWithCodeDescription(OWSErrorCode.contactDiscoveryRateLimit, "Contacts Intersection Rate Limit").asUnretryableError
responseResolver.reject(nsError)
return
}
@ -80,17 +78,11 @@ class LegacyContactDiscoveryOperation: ContactDiscovering {
private func parse(response: Any?, phoneNumbersByHashes: [String: String]) throws -> Set<String> {
guard let responseDict = response as? [String: AnyObject] else {
let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError
responseError.isRetryable = true
throw responseError
throw OWSErrorMakeUnableToProcessServerResponseError().asRetryableError
}
guard let contactDicts = responseDict["contacts"] as? [[String: AnyObject]] else {
let responseError: NSError = OWSErrorMakeUnableToProcessServerResponseError() as NSError
responseError.isRetryable = true
throw responseError
throw OWSErrorMakeUnableToProcessServerResponseError().asRetryableError
}
var registeredRecipientIds: Set<String> = Set()

View File

@ -58,8 +58,7 @@ open class CDNDownloadOperation: OWSOperation {
error: &requestError)
if let error = requestError {
owsFailDebug("Could not create request failed: \(error)")
error.isRetryable = false
throw error
throw error.asUnretryableError
}
request.setValue(OWSMimeTypeApplicationOctetStream, forHTTPHeaderField: "Content-Type")
@ -165,12 +164,10 @@ open class CDNDownloadOperation: OWSOperation {
do {
let data = try Data(contentsOf: tempFileURL)
resolver.fulfill(data)
} catch let error as NSError {
} catch {
owsFailDebug("Could not load data failed: \(error)")
// Fail immediately; do not retry.
error.isRetryable = false
return resolver.reject(error)
return resolver.reject(error.asUnretryableError)
}
})
self.task = task

View File

@ -92,14 +92,13 @@ class DownloadStickerOperation: CDNDownloadOperation {
self.success(plaintext)
self.reportSuccess()
} catch let error as NSError {
} catch {
owsFailDebug("Decryption failed: \(error)")
self.markUrlPathAsCorrupt(urlPath)
// Fail immediately; do not retry.
error.isRetryable = false
return self.reportError(error)
return self.reportError(error.asUnretryableError)
}
}.catch(on: DispatchQueue.global()) { [weak self] error in
guard let self = self else {

View File

@ -53,14 +53,13 @@ class DownloadStickerPackOperation: CDNDownloadOperation {
self.success(stickerPack)
self.reportSuccess()
} catch let error as NSError {
} catch {
owsFailDebug("Decryption failed: \(error)")
self.markUrlPathAsCorrupt(urlPath)
// Fail immediately; do not retry.
error.isRetryable = false
return self.reportError(error)
return self.reportError(error.asUnretryableError)
}
}.catch(on: DispatchQueue.global()) { [weak self] error in
guard let self = self else {

View File

@ -496,9 +496,7 @@ public class ProfileFetcherJob: NSObject {
// To avoid these conflicts we treat "partial"
// profile fetches (where we download the profile
// but not the associated avatar) as failures.
let nsError = error as NSError
nsError.isRetryable = false
throw nsError
throw error.asUnretryableError
}
} else {
// This should be very rare. It might reflect: