Beispiel #1
0
        internal async Task ProcessDownloadJobAsync()
        {
            while (true)
            {
                var chain = await _blockchainService.GetChainAsync();

                var jobInfo = await GetFirstAvailableWaitingJobAsync(chain);

                try
                {
                    if (!ValidateBeforeDownload(jobInfo))
                    {
                        return;
                    }

                    if (jobInfo.IsFinished)
                    {
                        await RemoveJobAndTargetStateAsync(jobInfo);

                        continue;
                    }

                    Logger.LogDebug(
                        $"Execute download job: CurrentTargetBlockHeight: {jobInfo.CurrentTargetBlockHeight}, TargetBlockHeight:{jobInfo.TargetBlockHeight}, SuggestedPeerPubkey:{jobInfo.SuggestedPeerPubkey}.");

                    var downloadResult = await DownloadBlocksAsync(chain, jobInfo);

                    if (downloadResult.DownloadBlockCount == 0)
                    {
                        Logger.LogDebug(
                            $"Download block job finished: CurrentTargetBlockHeight: {jobInfo.CurrentTargetBlockHeight}, TargetBlockHeight:{jobInfo.TargetBlockHeight}.");
                        await RemoveJobAndTargetStateAsync(jobInfo);

                        continue;
                    }

                    _blockDownloadService.RemoveDownloadJobTargetState(jobInfo.CurrentTargetBlockHash);

                    jobInfo.Deadline = TimestampHelper.GetUtcNow().AddMilliseconds(downloadResult.DownloadBlockCount * 300);
                    jobInfo.CurrentTargetBlockHash   = downloadResult.LastDownloadBlockHash;
                    jobInfo.CurrentTargetBlockHeight = downloadResult.LastDownloadBlockHeight;
                    jobInfo.IsFinished = downloadResult.DownloadBlockCount < _blockSyncOptions.MaxBlockDownloadCount;
                    await _blockDownloadJobStore.UpdateAsync(jobInfo);

                    Logger.LogDebug(
                        $"Current download block job finished: CurrentTargetBlockHeight: {jobInfo.CurrentTargetBlockHeight}.");
                    return;
                }
                catch (Exception e)
                {
                    await RemoveJobAndTargetStateAsync(jobInfo);

                    Logger.LogError(e, "Handle download job failed.");
                    throw;
                }
            }
        }
Beispiel #2
0
        public void RemoveDownloadJobTargetState_Test()
        {
            var targetHash = HashHelper.ComputeFrom("TargetHash");

            _blockSyncStateProvider.SetDownloadJobTargetState(targetHash, true);

            _blockDownloadService.RemoveDownloadJobTargetState(null);
            _blockSyncStateProvider.TryGetDownloadJobTargetState(targetHash, out _).ShouldBeTrue();

            _blockDownloadService.RemoveDownloadJobTargetState(targetHash);
            _blockSyncStateProvider.TryGetDownloadJobTargetState(targetHash, out _).ShouldBeFalse();
        }
Beispiel #3
0
        internal async Task ProcessDownloadJobAsync()
        {
            while (true)
            {
                var chain = await _blockchainService.GetChainAsync();

                var jobInfo = await GetFirstAvailableWaitingJobAsync(chain);

                if (!ValidateBeforeDownload(jobInfo))
                {
                    return;
                }

                var downloadResult = await DownloadBlocksAsync(chain, jobInfo);

                if (downloadResult.DownloadBlockCount == 0)
                {
                    Logger.LogDebug(
                        $"Download block job finished: CurrentTargetBlockHeight: {jobInfo.CurrentTargetBlockHeight}, TargetBlockHeight:{jobInfo.TargetBlockHeight}.");
                    await RemoveJobAndTargetStateAsync(jobInfo);

                    continue;
                }

                _blockDownloadService.RemoveDownloadJobTargetState(jobInfo.CurrentTargetBlockHash);

                jobInfo.Deadline = TimestampHelper.GetUtcNow().AddMilliseconds(downloadResult.DownloadBlockCount * 300);
                jobInfo.CurrentTargetBlockHash   = downloadResult.LastDownloadBlockHash;
                jobInfo.CurrentTargetBlockHeight = downloadResult.LastDownloadBlockHeight;
                await _blockDownloadJobStore.UpdateAsync(jobInfo);

                Logger.LogDebug(
                    $"Current download block job finished: CurrentTargetBlockHeight: {jobInfo.CurrentTargetBlockHeight}.");
                return;
            }
        }