private async Task <FilterLog[]> RetrieveLogsAsync(
            BlockRange range, NewFilterInput filter, uint retryNumber = 0)
        {
            try
            {
                filter.SetBlockRange(range);

                _logger.RetrievingLogs(filter, range, retryNumber);

                return(await _eventLogProxy.SendRequestAsync(filter).ConfigureAwait(false));
            }
            catch (RpcResponseException rpcResponseEx) when(rpcResponseEx.TooManyRecords())
            {
                _logger.TooManyRecords(range, rpcResponseEx);
                throw rpcResponseEx.TooManyRecordsException();
            }
            catch (Exception ex)
            {
                _logger.RetrievalError(range, ex);

                retryNumber++;
                if (retryNumber < MaxRetries)
                {
                    _logger.PausingBeforeRetry(range, retryNumber);
                    await RetryWaitStrategy.Apply(retryNumber).ConfigureAwait(false);

                    return(await RetrieveLogsAsync(range, filter, retryNumber)
                           .ConfigureAwait(false));
                }

                _logger.MaxRetriesExceededSoThrowing(MaxRetries, ex);

                throw;
            }
        }
예제 #2
0
        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));
                }
            }
        }
예제 #3
0
        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));
                }
            }
        }
        private async Task <FilterLog[]> RetrieveLogsAsync(
            BlockRange range, NewFilterInput filter, uint retryNumber = 0)
        {
            try
            {
                filter.SetBlockRange(range);

                _log.LogInformation($"RetrieveLogsAsync - getting logs. RetryNumber:{retryNumber}, from:{range.From}, to:{range.To}.");

                return(await _eventLogProxy.GetLogs(filter).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                _log.LogError("Get Logs Error", ex);

                retryNumber++;
                if (retryNumber < MaxRetries)
                {
                    _log.LogInformation("Pausing before retry get logs");
                    await RetryWaitStrategy.Apply(retryNumber).ConfigureAwait(false);

                    _log.LogInformation("Retrying get logs");
                    return(await RetrieveLogsAsync(range, filter, retryNumber)
                           .ConfigureAwait(false));
                }

                _log.LogError("MaxRetries exceeded when getting logs, throwing exception.", ex);

                throw;
            }
        }