[#472] CompactBlockBatchScanningOperation to async (#505)

- CompactBlockBatchScanningOperation operation's main reimplemented to be Task based

[472] CompactBlockBatchScanningOperation to async

cleanup

[472] CompactBlockBatchScanningOperation to async (505)

- CompactBlockBatchScanningOperation wrapped to Task
This commit is contained in:
Lukas Korba 2022-08-30 16:28:00 +02:00 committed by GitHub
parent 87f50a796c
commit 7b90e598ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 140 additions and 112 deletions

View File

@ -194,10 +194,11 @@ class CompactBlockBatchDownloadOperation: ZcashOperation {
override var isAsynchronous: Bool { false }
private var batch: Int
private var done = false
private var maxRetries: Int
private var storage: CompactBlockStorage
private var service: LightWalletService
private var cancelable: CancellableCall?
private var cancelableTask: Task<Void, Error>?
private var startHeight: BlockHeight
private var targetHeight: BlockHeight
@ -229,8 +230,10 @@ class CompactBlockBatchDownloadOperation: ZcashOperation {
return
}
self.startedHandler?()
cancelableTask = Task {
do {
let localDownloadedHeight = try self.storage.latestHeight()
let localDownloadedHeight = try await self.storage.latestHeightAsync()
if localDownloadedHeight != BlockHeight.empty() && localDownloadedHeight > startHeight {
LoggerProxy.warn("provided startHeight (\(startHeight)) differs from local latest downloaded height (\(localDownloadedHeight))")
@ -257,7 +260,12 @@ class CompactBlockBatchDownloadOperation: ZcashOperation {
repeat {
do {
let blocks = try service.blockRange(range)
let stream: AsyncThrowingStream<ZcashCompactBlock, Error> = service.blockRange(range)
var blocks: [ZcashCompactBlock] = []
for try await compactBlock in stream {
blocks.append(compactBlock)
}
try storage.insert(blocks)
success = true
} catch {
@ -283,18 +291,24 @@ class CompactBlockBatchDownloadOperation: ZcashOperation {
currentHeight = range.upperBound + 1
}
self.done = true
} catch {
self.fail(error: error)
}
}
while !done && !isCancelled {
sleep(1)
}
}
override func fail(error: Error? = nil) {
self.cancelable?.cancel()
self.cancelableTask?.cancel()
super.fail(error: error)
}
override func cancel() {
self.cancelable?.cancel()
self.cancelableTask?.cancel()
super.cancel()
}

View File

@ -125,6 +125,8 @@ class CompactBlockBatchScanningOperation: ZcashOperation {
private var blockRange: CompactBlockRange
private var transactionRepository: TransactionRepository
private var network: NetworkType
private var cancelableTask: Task<Void, Error>?
private var done = false
private weak var progressDelegate: CompactBlockProgressDelegate?
@ -157,6 +159,7 @@ class CompactBlockBatchScanningOperation: ZcashOperation {
self.startedHandler?()
cancelableTask = Task {
do {
if batchSize == 0 {
let scanStartTime = Date()
@ -224,15 +227,26 @@ class CompactBlockBatchScanningOperation: ZcashOperation {
LoggerProxy.debug("Scanned \(heightCount) blocks in \(seconds) seconds")
}
} while !self.isCancelled && scannedNewBlocks && lastScannedHeight < targetScanHeight
self.done = true
}
} catch {
scanFailed(error)
}
}
while !done && !isCancelled {
sleep(1)
}
}
func scanFailed(_ error: Error) {
self.error = error
self.cancelableTask?.cancel()
LoggerProxy.debug("block scanning failed with error: \(String(describing: self.error))")
self.fail()
super.fail(error: error)
}
override func cancel() {
self.cancelableTask?.cancel()
super.cancel()
}
}