From 6760341a2e7a56348828c2d1808088d75ca42b40 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 19 May 2021 08:49:20 +1000 Subject: [PATCH] Add missing retry --- Session/Utilities/BackgroundPoller.swift | 31 +++++++++++------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/Session/Utilities/BackgroundPoller.swift b/Session/Utilities/BackgroundPoller.swift index 4ce1f8147..3a79a7450 100644 --- a/Session/Utilities/BackgroundPoller.swift +++ b/Session/Utilities/BackgroundPoller.swift @@ -13,12 +13,6 @@ public final class BackgroundPoller : NSObject { promises = [] promises.append(pollForMessages()) promises.append(contentsOf: pollForClosedGroupMessages()) - let openGroups: [String:OpenGroup] = Storage.shared.getAllUserOpenGroups() - openGroups.values.forEach { openGroup in - let poller = OpenGroupPoller(for: openGroup) - poller.stop() - promises.append(poller.pollForNewMessages(isBackgroundPoll: true)) - } let v2OpenGroupServers = Set(Storage.shared.getAllV2OpenGroups().values.map { $0.server }) v2OpenGroupServers.forEach { server in let poller = OpenGroupPollerV2(for: server) @@ -27,7 +21,8 @@ public final class BackgroundPoller : NSObject { } when(resolved: promises).done { _ in completionHandler(.newData) - }.catch { _ in + }.catch { error in + SNLog("Background poll failed due to error: \(error)") completionHandler(.failed) } } @@ -45,17 +40,19 @@ public final class BackgroundPoller : NSObject { private static func getMessages(for publicKey: String) -> Promise { return SnodeAPI.getSwarm(for: publicKey).then(on: DispatchQueue.main) { swarm -> Promise in guard let snode = swarm.randomElement() else { throw SnodeAPI.Error.generic } - return SnodeAPI.getRawMessages(from: snode, associatedWith: publicKey).then(on: DispatchQueue.main) { rawResponse -> Promise in - let messages = SnodeAPI.parseRawMessagesResponse(rawResponse, from: snode, associatedWith: publicKey) - let promises = messages.compactMap { json -> Promise? in - // Use a best attempt approach here; we don't want to fail the entire process if one of the - // messages failed to parse. - guard let envelope = SNProtoEnvelope.from(json), - let data = try? envelope.serializedData() else { return nil } - let job = MessageReceiveJob(data: data, isBackgroundPoll: true) - return job.execute() + return attempt(maxRetryCount: 4, recoveringOn: DispatchQueue.main) { + return SnodeAPI.getRawMessages(from: snode, associatedWith: publicKey).then(on: DispatchQueue.main) { rawResponse -> Promise in + let messages = SnodeAPI.parseRawMessagesResponse(rawResponse, from: snode, associatedWith: publicKey) + let promises = messages.compactMap { json -> Promise? in + // Use a best attempt approach here; we don't want to fail the entire process if one of the + // messages failed to parse. + guard let envelope = SNProtoEnvelope.from(json), + let data = try? envelope.serializedData() else { return nil } + let job = MessageReceiveJob(data: data, isBackgroundPoll: true) + return job.execute() + } + return when(fulfilled: promises) // The promise returned by MessageReceiveJob never rejects } - return when(fulfilled: promises) // The promise returned by MessageReceiveJob never rejects } } }