private async Task <GetLogsResponse?> GetLogsAsync(OrchestrationProgress progress, BigInteger fromBlock, BigInteger toBlock, int retryRequestNumber = 0) { try { var adjustedToBlock = _blockRangeRequestStrategy.GeBlockNumberToRequestTo(fromBlock, toBlock, retryRequestNumber); _filterInput.SetBlockRange(fromBlock, adjustedToBlock); var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput).ConfigureAwait(false); return(new GetLogsResponse(fromBlock, adjustedToBlock, logs)); } catch (Exception ex) { if (retryRequestNumber >= MaxGetLogsRetries) { progress.Exception = ex; return(null); } else { return(await GetLogsAsync(progress, fromBlock, toBlock, retryRequestNumber + 1).ConfigureAwait(false)); } } }
public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber, CancellationToken cancellationToken = default(CancellationToken)) { var progress = new OrchestrationProgress(); var nextBlockNumberFrom = fromNumber; while (!progress.HasErrored && progress.BlockNumberProcessTo != toNumber) { if (progress.BlockNumberProcessTo != null) { nextBlockNumberFrom = progress.BlockNumberProcessTo.Value + 1; } var getLogsResponse = await GetLogsAsync(progress, nextBlockNumberFrom, toNumber).ConfigureAwait(false); if (getLogsResponse == null) { return(progress); } var logs = getLogsResponse.Value.Logs; if (!cancellationToken.IsCancellationRequested) //allowing all the logs to be processed if not cancelled before hand { logs = logs.Sort(); await InvokeLogProcessors(logs).ConfigureAwait(false); progress.BlockNumberProcessTo = getLogsResponse.Value.To; } } return(progress); }
public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber) { var progress = new OrchestrationProgress(); try { _filterInput.FromBlock = new BlockParameter(fromNumber.ToHexBigInteger()); _filterInput.ToBlock = new BlockParameter(toNumber.ToHexBigInteger()); //TODO: add retry strategy on too many records. var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput); if (logs == null) { return(progress); } logs = logs.Sort(); //TODO: Add paralell execution strategy foreach (var logProcessor in _logProcessors) { foreach (var log in logs) { await logProcessor.ExecuteAsync(log); } } } catch (Exception ex) { progress.Exception = ex; } return(progress); }
public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber, CancellationToken cancellationToken = default(CancellationToken), IBlockProgressRepository blockProgressRepository = null) { var progress = new OrchestrationProgress(); try { var currentBlockNumber = fromNumber; while (currentBlockNumber <= toNumber && !cancellationToken.IsCancellationRequested) { await CrawlBlockAsync(currentBlockNumber).ConfigureAwait(false); progress.BlockNumberProcessTo = currentBlockNumber; if (blockProgressRepository != null) { await blockProgressRepository.UpsertProgressAsync(progress.BlockNumberProcessTo.Value); } currentBlockNumber = currentBlockNumber + 1; } } catch (Exception ex) { progress.Exception = ex; } return(progress); }
private async Task <GetLogsResponse?> GetLogsAsync(OrchestrationProgress progress, BigInteger fromBlock, BigInteger toBlock, int retryRequestNumber = 0, int retryNullLogsRequestNumber = 0) { try { var adjustedToBlock = _blockRangeRequestStrategy.GeBlockNumberToRequestTo(fromBlock, toBlock, retryRequestNumber); _filterInput.SetBlockRange(fromBlock, adjustedToBlock); var logs = await EthApi.Filters.GetLogs.SendRequestAsync(_filterInput).ConfigureAwait(false); //If we don't get any, lets retry in case there is an issue with the node. if (logs == null && retryNullLogsRequestNumber < MaxGetLogsNullRetries) { return(await GetLogsAsync(progress, fromBlock, toBlock, 0, retryNullLogsRequestNumber + 1).ConfigureAwait(false)); } retryRequestNumber = 0; retryNullLogsRequestNumber = 0; return(new GetLogsResponse(fromBlock, adjustedToBlock, logs)); } catch (Exception ex) { if (retryRequestNumber >= MaxGetLogsRetries) { progress.Exception = ex; return(null); } else { return(await GetLogsAsync(progress, fromBlock, toBlock, retryRequestNumber + 1).ConfigureAwait(false)); } } }
public async Task <OrchestrationProgress> ProcessAsync(BigInteger fromNumber, BigInteger toNumber, CancellationToken cancellationToken = default(CancellationToken)) { var progress = new OrchestrationProgress(); try { var currentBlockNumber = fromNumber; while (currentBlockNumber <= toNumber && !cancellationToken.IsCancellationRequested) { await CrawlBlock(currentBlockNumber); progress.BlockNumberProcessTo = currentBlockNumber; currentBlockNumber = currentBlockNumber + 1; } } catch (Exception ex) { progress.Exception = ex; } return(progress); }