[#471] CompactBlockValidationOperation to async (#515)

- CompactBlockValidationOperation wrapped to Task
This commit is contained in:
Lukas Korba 2022-08-30 15:56:39 +02:00 committed by GitHub
parent be24044b51
commit 29f159845d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 36 additions and 17 deletions

View File

@ -22,7 +22,9 @@ class CompactBlockValidationOperation: ZcashOperation {
private var cacheDb: URL
private var dataDb: URL
private var network: NetworkType
private var cancelableTask: Task<Void, Error>?
private var done = false
init(
rustWelding: ZcashRustBackendWelding.Type,
cacheDb: URL,
@ -44,23 +46,40 @@ class CompactBlockValidationOperation: ZcashOperation {
self.startedHandler?()
let result = self.rustBackend.validateCombinedChain(dbCache: cacheDb, dbData: dataDb, networkType: self.network)
switch result {
case 0:
let error = CompactBlockValidationError.failedWithError(rustBackend.lastError())
self.error = error
LoggerProxy.debug("block scanning failed with error: \(String(describing: self.error))")
self.fail(error: error)
cancelableTask = Task {
let result = self.rustBackend.validateCombinedChain(dbCache: cacheDb, dbData: dataDb, networkType: self.network)
case ZcashRustBackendWeldingConstants.validChain:
break
default:
let error = CompactBlockValidationError.validationFailed(height: BlockHeight(result))
self.error = error
LoggerProxy.debug("block scanning failed with error: \(String(describing: self.error))")
self.fail(error: error)
switch result {
case 0:
let error = CompactBlockValidationError.failedWithError(rustBackend.lastError())
self.error = error
LoggerProxy.debug("block scanning failed with error: \(String(describing: self.error))")
self.fail(error: error)
case ZcashRustBackendWeldingConstants.validChain:
self.done = true
break
default:
let error = CompactBlockValidationError.validationFailed(height: BlockHeight(result))
self.error = error
LoggerProxy.debug("block scanning failed with error: \(String(describing: self.error))")
self.fail(error: error)
}
}
while !done && !isCancelled {
sleep(1)
}
}
override func fail(error: Error? = nil) {
self.cancelableTask?.cancel()
super.fail(error: error)
}
override func cancel() {
self.cancelableTask?.cancel()
super.cancel()
}
}