pull/124/head
Niels Andriesse 5 years ago
parent 6ecbc755ea
commit c0dda78e52

@ -32,6 +32,7 @@ public extension LokiAPI {
// MARK: Internal API // MARK: Internal API
internal static func getRandomSnode() -> Promise<LokiAPITarget> { internal static func getRandomSnode() -> Promise<LokiAPITarget> {
// All of this has to happen on DispatchQueue.global() due to the way OWSMessageManager works
if randomSnodePool.isEmpty { if randomSnodePool.isEmpty {
let target = seedNodePool.randomElement()! let target = seedNodePool.randomElement()!
let url = URL(string: "\(target)/json_rpc")! let url = URL(string: "\(target)/json_rpc")!
@ -49,7 +50,7 @@ public extension LokiAPI {
] ]
]) ])
print("[Loki] Invoking get_n_service_nodes on \(target).") print("[Loki] Invoking get_n_service_nodes on \(target).")
return TSNetworkManager.shared().perform(request).map(on: DispatchQueue.global()) { intermediate in return TSNetworkManager.shared().perform(request, withCompletionQueue: DispatchQueue.global()).map(on: DispatchQueue.global()) { intermediate in
let rawResponse = intermediate.responseObject let rawResponse = intermediate.responseObject
guard let json = rawResponse as? JSON, let intermediate = json["result"] as? JSON, let rawTargets = intermediate["service_node_states"] as? [JSON] else { throw LokiAPIError.randomSnodePoolUpdatingFailed } guard let json = rawResponse as? JSON, let intermediate = json["result"] as? JSON, let rawTargets = intermediate["service_node_states"] as? [JSON] else { throw LokiAPIError.randomSnodePoolUpdatingFailed }
randomSnodePool = try Set(rawTargets.flatMap { rawTarget in randomSnodePool = try Set(rawTargets.flatMap { rawTarget in
@ -61,7 +62,7 @@ public extension LokiAPI {
}) })
// randomElement() uses the system's default random generator, which is cryptographically secure // randomElement() uses the system's default random generator, which is cryptographically secure
return randomSnodePool.randomElement()! return randomSnodePool.randomElement()!
}.recover { error -> Promise<LokiAPITarget> in }.recover(on: DispatchQueue.global()) { error -> Promise<LokiAPITarget> in
print("[Loki] Failed to contact seed node at: \(target).") print("[Loki] Failed to contact seed node at: \(target).")
throw error throw error
}.retryingIfNeeded(maxRetryCount: 16) // The seed nodes have historically been unreliable }.retryingIfNeeded(maxRetryCount: 16) // The seed nodes have historically been unreliable

@ -44,6 +44,7 @@ internal class LokiFileServerProxy : LokiHTTPClient {
} }
internal func performLokiFileServerNSURLRequest(_ request: NSURLRequest, withCompletionQueue queue: DispatchQueue = DispatchQueue.main) -> LokiAPI.RawResponsePromise { internal func performLokiFileServerNSURLRequest(_ request: NSURLRequest, withCompletionQueue queue: DispatchQueue = DispatchQueue.main) -> LokiAPI.RawResponsePromise {
// All of this has to happen on DispatchQueue.global() due to the way OWSMessageManager works
var headers = getCanonicalHeaders(for: request) var headers = getCanonicalHeaders(for: request)
return Promise<LokiAPI.RawResponse> { [server = self.server, keyPair = self.keyPair, httpSession = self.httpSession] seal in return Promise<LokiAPI.RawResponse> { [server = self.server, keyPair = self.keyPair, httpSession = self.httpSession] seal in
DispatchQueue.global().async { DispatchQueue.global().async {
@ -116,9 +117,9 @@ internal class LokiFileServerProxy : LokiHTTPClient {
let uncheckedJSON = try? JSONSerialization.jsonObject(with: uncheckedJSONAsData, options: .allowFragments) as? JSON let uncheckedJSON = try? JSONSerialization.jsonObject(with: uncheckedJSONAsData, options: .allowFragments) as? JSON
guard let json = uncheckedJSON else { throw HTTPError.networkError(code: -1, response: nil, underlyingError: Error.proxyResponseParsingFailed) } guard let json = uncheckedJSON else { throw HTTPError.networkError(code: -1, response: nil, underlyingError: Error.proxyResponseParsingFailed) }
return json return json
}.done { rawResponse in }.done(on: DispatchQueue.global()) { rawResponse in
seal.fulfill(rawResponse) seal.fulfill(rawResponse)
}.catch { error in }.catch(on: DispatchQueue.global()) { error in
print("[Loki] File server proxy request failed with error: \(error.localizedDescription).") print("[Loki] File server proxy request failed with error: \(error.localizedDescription).")
seal.reject(HTTPError.from(error: error) ?? error) seal.reject(HTTPError.from(error: error) ?? error)
} }

@ -10,6 +10,7 @@ internal class LokiHTTPClient {
securityPolicy.validatesDomainName = false securityPolicy.validatesDomainName = false
result.securityPolicy = securityPolicy result.securityPolicy = securityPolicy
result.responseSerializer = AFHTTPResponseSerializer() result.responseSerializer = AFHTTPResponseSerializer()
result.completionQueue = DispatchQueue.global() // All of this has to happen on DispatchQueue.global() due to the way OWSMessageManager works
return result return result
}() }()

@ -1406,7 +1406,7 @@ NS_ASSUME_NONNULL_BEGIN
}).catchOn(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(NSError *error) { }).catchOn(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(NSError *error) {
dispatch_semaphore_signal(semaphore); dispatch_semaphore_signal(semaphore);
}) retainUntilComplete]; }) retainUntilComplete];
dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC)); dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC));
} }
if (groupId.length > 0) { if (groupId.length > 0) {

Loading…
Cancel
Save