[#1047] Implement ScanAction
- scan action with the proper ranges computed [#1047] Implement ScanAction (#1085) - fixed logger message
This commit is contained in:
parent
0fee045ca9
commit
16fb61c774
|
@ -13,6 +13,7 @@ class ComputeSyncRangesAction {
|
||||||
let internalSyncProgress: InternalSyncProgress
|
let internalSyncProgress: InternalSyncProgress
|
||||||
let latestBlocksDataProvider: LatestBlocksDataProvider
|
let latestBlocksDataProvider: LatestBlocksDataProvider
|
||||||
let logger: Logger
|
let logger: Logger
|
||||||
|
|
||||||
init(container: DIContainer, config: CompactBlockProcessorNG.Configuration) {
|
init(container: DIContainer, config: CompactBlockProcessorNG.Configuration) {
|
||||||
self.config = config
|
self.config = config
|
||||||
downloaderService = container.resolve(BlockDownloaderService.self)
|
downloaderService = container.resolve(BlockDownloaderService.self)
|
||||||
|
|
|
@ -11,10 +11,13 @@ class DownloadAction {
|
||||||
let config: CompactBlockProcessorNG.Configuration
|
let config: CompactBlockProcessorNG.Configuration
|
||||||
let downloader: BlockDownloader
|
let downloader: BlockDownloader
|
||||||
let transactionRepository: TransactionRepository
|
let transactionRepository: TransactionRepository
|
||||||
|
let logger: Logger
|
||||||
|
|
||||||
init(container: DIContainer, config: CompactBlockProcessorNG.Configuration) {
|
init(container: DIContainer, config: CompactBlockProcessorNG.Configuration) {
|
||||||
self.config = config
|
self.config = config
|
||||||
downloader = container.resolve(BlockDownloader.self)
|
downloader = container.resolve(BlockDownloader.self)
|
||||||
transactionRepository = container.resolve(TransactionRepository.self)
|
transactionRepository = container.resolve(TransactionRepository.self)
|
||||||
|
logger = container.resolve(Logger.self)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func update(context: ActionContext) async -> ActionContext {
|
private func update(context: ActionContext) async -> ActionContext {
|
||||||
|
@ -38,6 +41,7 @@ extension DownloadAction: Action {
|
||||||
let batchRange = batchRangeStart...batchRangeStart + config.batchSize
|
let batchRange = batchRangeStart...batchRangeStart + config.batchSize
|
||||||
let downloadLimit = batchRange.upperBound + (2 * config.batchSize)
|
let downloadLimit = batchRange.upperBound + (2 * config.batchSize)
|
||||||
|
|
||||||
|
logger.debug("Starting download with range: \(batchRange.lowerBound)...\(batchRange.upperBound)")
|
||||||
try await downloader.setSyncRange(downloadRange)
|
try await downloader.setSyncRange(downloadRange)
|
||||||
await downloader.setDownloadLimit(downloadLimit)
|
await downloader.setDownloadLimit(downloadLimit)
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,11 @@ import Foundation
|
||||||
|
|
||||||
class FetchUTXOsAction {
|
class FetchUTXOsAction {
|
||||||
let utxoFetcher: UTXOFetcher
|
let utxoFetcher: UTXOFetcher
|
||||||
|
let logger: Logger
|
||||||
|
|
||||||
init(container: DIContainer) {
|
init(container: DIContainer) {
|
||||||
utxoFetcher = container.resolve(UTXOFetcher.self)
|
utxoFetcher = container.resolve(UTXOFetcher.self)
|
||||||
|
logger = container.resolve(Logger.self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +22,7 @@ extension FetchUTXOsAction: Action {
|
||||||
|
|
||||||
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
||||||
if let range = await context.syncRanges.fetchUTXORange {
|
if let range = await context.syncRanges.fetchUTXORange {
|
||||||
|
logger.debug("Fetching UTXO with range: \(range.lowerBound)...\(range.upperBound)")
|
||||||
let result = try await utxoFetcher.fetch(at: range)
|
let result = try await utxoFetcher.fetch(at: range)
|
||||||
await didUpdate(.storedUTXOs(result))
|
await didUpdate(.storedUTXOs(result))
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,11 @@ import Foundation
|
||||||
|
|
||||||
class SaplingParamsAction {
|
class SaplingParamsAction {
|
||||||
let saplingParametersHandler: SaplingParametersHandler
|
let saplingParametersHandler: SaplingParametersHandler
|
||||||
|
let logger: Logger
|
||||||
|
|
||||||
init(container: DIContainer) {
|
init(container: DIContainer) {
|
||||||
saplingParametersHandler = container.resolve(SaplingParametersHandler.self)
|
saplingParametersHandler = container.resolve(SaplingParametersHandler.self)
|
||||||
|
logger = container.resolve(Logger.self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +21,7 @@ extension SaplingParamsAction: Action {
|
||||||
var removeBlocksCacheWhenFailed: Bool { false }
|
var removeBlocksCacheWhenFailed: Bool { false }
|
||||||
|
|
||||||
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
||||||
|
logger.debug("Fetching sapling parameters")
|
||||||
try await saplingParametersHandler.handleIfNeeded()
|
try await saplingParametersHandler.handleIfNeeded()
|
||||||
await context.update(state: .scanDownloaded)
|
await context.update(state: .scanDownloaded)
|
||||||
return context
|
return context
|
||||||
|
|
|
@ -8,15 +8,49 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class ScanAction {
|
class ScanAction {
|
||||||
init(container: DIContainer) { }
|
let config: CompactBlockProcessorNG.Configuration
|
||||||
|
let blockScanner: BlockScanner
|
||||||
|
let logger: Logger
|
||||||
|
let transactionRepository: TransactionRepository
|
||||||
|
|
||||||
|
init(container: DIContainer, config: CompactBlockProcessorNG.Configuration) {
|
||||||
|
self.config = config
|
||||||
|
blockScanner = container.resolve(BlockScanner.self)
|
||||||
|
transactionRepository = container.resolve(TransactionRepository.self)
|
||||||
|
logger = container.resolve(Logger.self)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func update(context: ActionContext) async -> ActionContext {
|
||||||
|
await context.update(state: .clearAlreadyScannedBlocks)
|
||||||
|
return context
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ScanAction: Action {
|
extension ScanAction: Action {
|
||||||
var removeBlocksCacheWhenFailed: Bool { true }
|
var removeBlocksCacheWhenFailed: Bool { true }
|
||||||
|
|
||||||
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
func run(with context: ActionContext, didUpdate: @escaping (CompactBlockProcessorNG.Event) async -> Void) async throws -> ActionContext {
|
||||||
// Scan in range latestScannedHeight...latestScannedHeight+batchSize.
|
guard let scanRange = await context.syncRanges.downloadAndScanRange else {
|
||||||
|
return await update(context: context)
|
||||||
|
}
|
||||||
|
|
||||||
|
let lastScannedHeight = try await transactionRepository.lastScannedHeight()
|
||||||
|
// This action is executed for each batch (batch size is 100 blocks by default) until all the blocks in whole `scanRange` are scanned.
|
||||||
|
// So the right range for this batch must be computed.
|
||||||
|
let batchRangeStart = max(scanRange.lowerBound, lastScannedHeight)
|
||||||
|
let batchRange = batchRangeStart...batchRangeStart + config.batchSize
|
||||||
|
|
||||||
|
logger.debug("Starting scan blocks with range: \(batchRange.lowerBound)...\(batchRange.upperBound)")
|
||||||
|
let totalProgressRange = await context.totalProgressRange
|
||||||
|
try await blockScanner.scanBlocks(at: batchRange, totalProgressRange: totalProgressRange) { [weak self] lastScannedHeight in
|
||||||
|
let progress = BlockProgress(
|
||||||
|
startHeight: totalProgressRange.lowerBound,
|
||||||
|
targetHeight: totalProgressRange.upperBound,
|
||||||
|
progressHeight: lastScannedHeight
|
||||||
|
)
|
||||||
|
self?.logger.debug("progress: \(progress)")
|
||||||
|
await didUpdate(.progressUpdated(.syncing(progress)))
|
||||||
|
}
|
||||||
await context.update(state: .clearAlreadyScannedBlocks)
|
await context.update(state: .clearAlreadyScannedBlocks)
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import Foundation
|
||||||
|
|
||||||
class ValidateAction {
|
class ValidateAction {
|
||||||
let validator: BlockValidator
|
let validator: BlockValidator
|
||||||
|
|
||||||
init(container: DIContainer) {
|
init(container: DIContainer) {
|
||||||
validator = container.resolve(BlockValidator.self)
|
validator = container.resolve(BlockValidator.self)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue