From 29f159845d55abaefe4aabdb9886dc7d4badd340 Mon Sep 17 00:00:00 2001 From: Lukas Korba Date: Tue, 30 Aug 2022 15:56:39 +0200 Subject: [PATCH] [#471] CompactBlockValidationOperation to async (#515) - CompactBlockValidationOperation wrapped to Task --- .../CompactBlockValidationInformation.swift | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/Sources/ZcashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift b/Sources/ZcashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift index fdcf11cc..b778bcdb 100644 --- a/Sources/ZcashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift +++ b/Sources/ZcashLightClientKit/Block/Processor/CompactBlockValidationInformation.swift @@ -22,7 +22,9 @@ class CompactBlockValidationOperation: ZcashOperation { private var cacheDb: URL private var dataDb: URL private var network: NetworkType - + private var cancelableTask: Task? + 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() + } }