From 620a0932143b6bd438e77615a53ad7288bd04b16 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Thu, 11 Jun 2020 17:05:41 +1000 Subject: [PATCH] Use higher priority queues for message sending --- SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift | 1 - .../Loki/Protocol/Multi Device/MultiDeviceProtocol.swift | 6 ++---- .../src/Loki/Utilities/Promise+Retrying.swift | 2 -- SignalServiceKit/src/Messages/OWSMessageSender.m | 2 +- SignalServiceKit/src/Network/MessageSenderJobQueue.swift | 1 + SignalServiceKit/src/Util/JobQueue.swift | 8 ++++---- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index 4b6a5548d..010cf5e78 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -5,7 +5,6 @@ public extension LokiAPI { fileprivate static let seedNodePool: Set = [ "https://storage.seed1.loki.network", "https://storage.seed3.loki.network", "https://public.loki.foundation" ] - /// Only ever modified from `LokiAPI.errorHandlingQueue` to avoid race conditions. internal static var snodeFailureCount: [LokiAPITarget:UInt] = [:] internal static var snodePool: Set = [] internal static var swarmCache: [String:[LokiAPITarget]] = [:] // TODO: Make this set based? diff --git a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift index a768283db..e45c1f323 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift @@ -18,8 +18,6 @@ public final class MultiDeviceProtocol : NSObject { /// A mapping from hex encoded public key to date updated. public static var lastDeviceLinkUpdate: [String:Date] = [:] - // TODO: I don't think stateQueue actually helps avoid race conditions - internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } // MARK: - Settings @@ -317,10 +315,10 @@ public extension MultiDeviceProtocol { } if timeSinceLastUpdate > deviceLinkUpdateInterval { let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey - LokiFileServerAPI.getDeviceLinks(associatedWith: masterHexEncodedPublicKey).done(on: DispatchQueue.global()) { _ in + LokiFileServerAPI.getDeviceLinks(associatedWith: masterHexEncodedPublicKey).done2 { _ in getDestinations() lastDeviceLinkUpdate[hexEncodedPublicKey] = Date() - }.catch(on: DispatchQueue.global()) { error in + }.catch2 { error in if (error as? LokiDotNetAPI.LokiDotNetAPIError) == LokiDotNetAPI.LokiDotNetAPIError.parsingFailed { // Don't immediately re-fetch in case of failure due to a parsing error lastDeviceLinkUpdate[hexEncodedPublicKey] = Date() diff --git a/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift b/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift index b5c023487..558620895 100644 --- a/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift +++ b/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift @@ -1,8 +1,6 @@ import PromiseKit /// Retry the promise constructed in `body` up to `maxRetryCount` times. -/// -/// - Note: Intentionally explicit about the recovery queue at the call site. internal func attempt(maxRetryCount: UInt, recoveringOn queue: DispatchQueue = .global(qos: .userInitiated), body: @escaping () -> Promise) -> Promise { var retryCount = 0 func attempt() -> Promise { diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index a47de736e..12fd71a34 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -373,7 +373,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } error:nil]; } - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSMutableArray *allAttachmentIds = [NSMutableArray new]; // This method will use a read/write transaction. This transaction diff --git a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift index 1ce758e63..f049bf23b 100644 --- a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift +++ b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift @@ -147,6 +147,7 @@ public class MessageSenderJobQueue: NSObject, JobQueue { let operationQueue = OperationQueue() operationQueue.name = "SendingQueue:\(threadId)" operationQueue.maxConcurrentOperationCount = 1 + operationQueue.qualityOfService = .userInitiated senderQueues[threadId] = operationQueue diff --git a/SignalServiceKit/src/Util/JobQueue.swift b/SignalServiceKit/src/Util/JobQueue.swift index 608001877..e305e69f3 100644 --- a/SignalServiceKit/src/Util/JobQueue.swift +++ b/SignalServiceKit/src/Util/JobQueue.swift @@ -126,21 +126,21 @@ public extension JobQueue { jobRecord.save(with: transaction) - transaction.addCompletionQueue(.global()) { + transaction.addCompletionQueue(DispatchQueue.global(qos: .userInitiated)) { self.startWorkWhenAppIsReady() } } func startWorkWhenAppIsReady() { guard !CurrentAppContext().isRunningTests else { - DispatchQueue.global().async { + DispatchQueue.global(qos: .userInitiated).async { self.workStep() } return } AppReadiness.runNowOrWhenAppDidBecomeReady { - DispatchQueue.global().async { + DispatchQueue.global(qos: .userInitiated).async { self.workStep() } } @@ -190,7 +190,7 @@ public extension JobQueue { owsFailDebug("unexpected error") } - DispatchQueue.global().async { + DispatchQueue.global(qos: .userInitiated).async { self.workStep() } }