in Sources/XCMetricsClient/Network/MetricsPublisherServiceHTTP.swift [38:81]
func uploadMetrics(
serviceURL: URL,
additionalHeaders: [String: String],
projectName: String,
isCI: Bool,
skipNotes: Bool,
truncLargeIssues: Bool,
uploadRequests: Set<MetricsUploadRequest>,
completion: @escaping (_ successfulURLs: Set<URL>, _ failedURLs: [URL: Data]) -> Void
) {
var successfulURLs = Set<URL>()
var failedURLs = [URL: Data]()
let successfulURLsLock = NSLock()
let failedURLsLock = NSLock()
for uploadRequest in uploadRequests {
self.dispatchGroup.enter()
self.uploadLog(uploadRequest, to: serviceURL, additionalHeaders: additionalHeaders, projectName: projectName, isCI: isCI, skipNotes: skipNotes, truncLargeIssues: truncLargeIssues) { (result: Result<Void, LogUploadError>) in
switch result {
case .success:
successfulURLsLock.lock()
successfulURLs.insert(uploadRequest.fileURL)
successfulURLsLock.unlock()
case .failure(let error):
// If the failed request was for an already failed request, skip writing it to disk since it's
// already saved.
guard uploadRequest.fileURL.isRequestFile == false else {
return
}
log("Error (\(error.error)) in uploading metrics.")
failedURLsLock.lock()
failedURLs[uploadRequest.fileURL] = error.body
failedURLsLock.unlock()
}
}
}
dispatchGroup.wait()
dispatchGroup.notify(queue: dispatchQueue) {
log("Completed uploading metrics with \(successfulURLs.count) successful and \(failedURLs.count) failed uploads.")
completion(successfulURLs, failedURLs)
}
}