From dff71f807062cf9df4fb82342e78fe3cc86236f4 Mon Sep 17 00:00:00 2001 From: Vadim Smal Date: Thu, 14 Jul 2022 16:59:40 +0100 Subject: [PATCH] Add a delay between upload retries --- .../XCRemoteCache/Commands/Postbuild/XCPostbuild.swift | 1 + Sources/XCRemoteCache/Commands/Prebuild/XCPrebuild.swift | 1 + Sources/XCRemoteCache/Commands/Prepare/XCPrepare.swift | 1 + .../XCRemoteCache/Commands/Prepare/XCPrepareMark.swift | 1 + Sources/XCRemoteCache/Config/XCRemoteCacheConfig.swift | 2 ++ Sources/XCRemoteCache/Network/NetworkClientImpl.swift | 8 ++++---- .../Network/NetworkClientImplTests.swift | 8 ++++---- 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Sources/XCRemoteCache/Commands/Postbuild/XCPostbuild.swift b/Sources/XCRemoteCache/Commands/Postbuild/XCPostbuild.swift index ea40dc5..418c9a4 100644 --- a/Sources/XCRemoteCache/Commands/Postbuild/XCPostbuild.swift +++ b/Sources/XCRemoteCache/Commands/Postbuild/XCPostbuild.swift @@ -123,6 +123,7 @@ public class XCPostbuild { let networkClient = NetworkClientImpl( session: sessionFactory.build(), retries: config.uploadRetries, + retryDelay: config.retryDelay, fileManager: fileManager, awsV4Signature: awsV4Signature ) diff --git a/Sources/XCRemoteCache/Commands/Prebuild/XCPrebuild.swift b/Sources/XCRemoteCache/Commands/Prebuild/XCPrebuild.swift index 21f5904..0813ace 100644 --- a/Sources/XCRemoteCache/Commands/Prebuild/XCPrebuild.swift +++ b/Sources/XCRemoteCache/Commands/Prebuild/XCPrebuild.swift @@ -109,6 +109,7 @@ public class XCPrebuild { let networkClient = NetworkClientImpl( session: sessionFactory.build(), retries: config.downloadRetries, + retryDelay: config.retryDelay, fileManager: fileManager, awsV4Signature: awsV4Signature ) diff --git a/Sources/XCRemoteCache/Commands/Prepare/XCPrepare.swift b/Sources/XCRemoteCache/Commands/Prepare/XCPrepare.swift index b604650..bef8c17 100644 --- a/Sources/XCRemoteCache/Commands/Prepare/XCPrepare.swift +++ b/Sources/XCRemoteCache/Commands/Prepare/XCPrepare.swift @@ -87,6 +87,7 @@ public class XCPrepare { let networkClient = NetworkClientImpl( session: sessionFactory.build(), retries: config.downloadRetries, + retryDelay: config.retryDelay, fileManager: fileManager, awsV4Signature: awsV4Signature ) diff --git a/Sources/XCRemoteCache/Commands/Prepare/XCPrepareMark.swift b/Sources/XCRemoteCache/Commands/Prepare/XCPrepareMark.swift index 4351bf6..f2b9836 100644 --- a/Sources/XCRemoteCache/Commands/Prepare/XCPrepareMark.swift +++ b/Sources/XCRemoteCache/Commands/Prepare/XCPrepareMark.swift @@ -69,6 +69,7 @@ public class XCPrepareMark { let networkClient = NetworkClientImpl( session: sessionFactory.build(), retries: config.uploadRetries, + retryDelay: config.retryDelay, fileManager: fileManager, awsV4Signature: awsV4Signature ) diff --git a/Sources/XCRemoteCache/Config/XCRemoteCacheConfig.swift b/Sources/XCRemoteCache/Config/XCRemoteCacheConfig.swift index 80ab797..29afdd8 100644 --- a/Sources/XCRemoteCache/Config/XCRemoteCacheConfig.swift +++ b/Sources/XCRemoteCache/Config/XCRemoteCacheConfig.swift @@ -83,6 +83,8 @@ public struct XCRemoteCacheConfig: Encodable { var downloadRetries: Int = 0 /// Number of retries for upload requests var uploadRetries: Int = 3 + /// Delay between retries + var retryDelay: Double = 10.0 /// Extra headers appended to all remote HTTP(S) requests var requestCustomHeaders: [String: String] = [:] /// Filename (without an extension) of the compilation input file that is used diff --git a/Sources/XCRemoteCache/Network/NetworkClientImpl.swift b/Sources/XCRemoteCache/Network/NetworkClientImpl.swift index fcc8b2d..625ba6e 100644 --- a/Sources/XCRemoteCache/Network/NetworkClientImpl.swift +++ b/Sources/XCRemoteCache/Network/NetworkClientImpl.swift @@ -29,15 +29,15 @@ class NetworkClientImpl: NetworkClient { private let session: URLSession private let fileManager: FileManager private let maxRetries: Int - private let awsV4Signature: AWSV4Signature? private let retryDelay: TimeInterval + private let awsV4Signature: AWSV4Signature? - init(session: URLSession, retries: Int, fileManager: FileManager, awsV4Signature: AWSV4Signature?, retryDelay: TimeInterval = 30.0) { + init(session: URLSession, retries: Int, retryDelay: TimeInterval, fileManager: FileManager, awsV4Signature: AWSV4Signature?) { self.session = session self.fileManager = fileManager - maxRetries = retries - self.awsV4Signature = awsV4Signature + self.maxRetries = retries self.retryDelay = retryDelay + self.awsV4Signature = awsV4Signature } func fileExists(_ url: URL, completion: @escaping (Result) -> Void) { diff --git a/Tests/XCRemoteCacheTests/Network/NetworkClientImplTests.swift b/Tests/XCRemoteCacheTests/Network/NetworkClientImplTests.swift index eb51ba3..6099b00 100644 --- a/Tests/XCRemoteCacheTests/Network/NetworkClientImplTests.swift +++ b/Tests/XCRemoteCacheTests/Network/NetworkClientImplTests.swift @@ -72,7 +72,7 @@ class NetworkClientImplTests: XCTestCase { configuration.protocolClasses = [URLProtocolStub.self] session = URLSession(configuration: configuration) fileManager = FileManager.default - client = NetworkClientImpl(session: session, retries: 0, fileManager: fileManager, awsV4Signature: nil) + client = NetworkClientImpl(session: session, retries: 0, retryDelay: 0, fileManager: fileManager, awsV4Signature: nil) } override func tearDown() { @@ -141,7 +141,7 @@ class NetworkClientImplTests: XCTestCase { } func testUploadFilureWith400Retries() throws { - client = NetworkClientImpl(session: session, retries: 2, fileManager: fileManager, awsV4Signature: nil, retryDelay: 0.1) + client = NetworkClientImpl(session: session, retries: 2, retryDelay: 0.1, fileManager: fileManager, awsV4Signature: nil) responses[url] = .success(failureResponse, Data()) _ = try waitForResponse({ client.upload(fileURL, as: url, completion: $0) }, timeout: 0.5) @@ -153,7 +153,7 @@ class NetworkClientImplTests: XCTestCase { } func testUploadSuccessDoesntRetry() throws { - client = NetworkClientImpl(session: session, retries: 0, fileManager: fileManager, awsV4Signature: nil) + client = NetworkClientImpl(session: session, retries: 0, retryDelay: 0.1, fileManager: fileManager, awsV4Signature: nil) responses[url] = .success(successResponse, Data()) _ = try waitForResponse { client.upload(fileURL, as: url, completion: $0) } @@ -208,7 +208,7 @@ class NetworkClientImplTests: XCTestCase { service: "iam", date: Date(timeIntervalSince1970: 1_440_938_160) ) - client = NetworkClientImpl(session: session, retries: 0, fileManager: fileManager, awsV4Signature: signature) + client = NetworkClientImpl(session: session, retries: 0, retryDelay: 0.1, fileManager: fileManager, awsV4Signature: signature) responses[url] = .success(successResponse, Data()) _ = try waitForResponse { client.fetch(url, completion: $0) }