tart push: re-try when encountering errors when pushing disk layers (#888)

* tart push: re-try when encountering errors when pushing disk layers

* Only re-try on URLError
This commit is contained in:
Nikolay Edigaryev 2024-08-10 21:06:39 +04:00 committed by GitHub
parent 10bf706653
commit 106eb5a2c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 8 deletions

View File

@ -1,6 +1,7 @@
import Foundation
import Compression
import System
import Retry
class DiskV2: Disk {
private static let bufferSizeBytes = 4 * 1024 * 1024
@ -28,8 +29,19 @@ class DiskV2: Disk {
let compressedData = try (data as NSData).compressed(using: .lz4) as Data
let compressedDataDigest = Digest.hash(compressedData)
if try await !registry.blobExists(compressedDataDigest) {
_ = try await registry.pushBlob(fromData: compressedData, chunkSizeMb: chunkSizeMb, digest: compressedDataDigest)
try await retry(maxAttempts: 5, backoff: .exponentialWithFullJitter(baseDelay: .seconds(5), maxDelay: .seconds(60))) {
if try await !registry.blobExists(compressedDataDigest) {
_ = try await registry.pushBlob(fromData: compressedData, chunkSizeMb: chunkSizeMb, digest: compressedDataDigest)
}
} recoverFromFailure: { error in
if error is URLError {
print("Error: \(error.localizedDescription)")
print("Attempting to re-try...")
return .retry
}
return .throw
}
// Update progress using a relative value

View File

@ -208,14 +208,14 @@ class VMStorageOCI: PrunableStorage {
try await tmpVMDir.pullFromRegistry(registry: registry, manifest: manifest, concurrency: concurrency, localLayerCache: localLayerCache)
} recoverFromFailure: { error in
if error is RuntimeError {
return .throw
if error is Retryable {
print("Error: \(error.localizedDescription)")
print("Attempting to re-try...")
return .retry
}
print("Error: \(error.localizedDescription)")
print("Attempting to re-try...")
return .retry
return .throw
}
try move(digestName, from: tmpVMDir)
transaction.finish()