private async Task <DownloadBlocksResult> DownloadBlocksAsync(Chain chain, BlockDownloadJobInfo jobInfo) { var downloadResult = new DownloadBlocksResult(); if (jobInfo.CurrentTargetBlockHeight > 0) { if (jobInfo.CurrentTargetBlockHeight <= chain.BestChainHeight || await BlockIsInBestChain(chain, jobInfo.CurrentTargetBlockHash, jobInfo.CurrentTargetBlockHeight)) { downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = jobInfo.CurrentTargetBlockHash, PreviousBlockHeight = jobInfo.CurrentTargetBlockHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount }); } } else { // Download blocks from longest chain downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.LongestChainHash, PreviousBlockHeight = chain.LongestChainHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount }); // Download blocks from best chain if (downloadResult.DownloadBlockCount == 0) { downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.BestChainHash, PreviousBlockHeight = chain.BestChainHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount }); } // Download blocks from LIB if (downloadResult.DownloadBlockCount == 0) { Logger.LogDebug($"Resynchronize from lib, lib height: {chain.LastIrreversibleBlockHeight}."); downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.LastIrreversibleBlockHash, PreviousBlockHeight = chain.LastIrreversibleBlockHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount }); } } return(downloadResult); }
public Task <bool> AddAsync(BlockDownloadJobInfo blockDownloadJobInfo) { if (_jobs.Count > 100) { return(Task.FromResult(false)); } _jobIds.Enqueue(blockDownloadJobInfo.JobId); _jobs[blockDownloadJobInfo.JobId] = blockDownloadJobInfo; return(Task.FromResult(true)); }
public async Task <Hash> EnqueueAsync(Hash syncBlockHash, long syncBlockHeight, int batchRequestBlockCount, string suggestedPeerPubkey) { var blockDownloadJobInfo = new BlockDownloadJobInfo { JobId = syncBlockHash, TargetBlockHash = syncBlockHash, TargetBlockHeight = syncBlockHeight, BatchRequestBlockCount = batchRequestBlockCount, SuggestedPeerPubkey = suggestedPeerPubkey }; var addResult = await _blockDownloadJobStore.AddAsync(blockDownloadJobInfo); return(addResult ? blockDownloadJobInfo.JobId : null); }
private bool ValidateBeforeDownload(BlockDownloadJobInfo blockDownloadJobInfo) { if (blockDownloadJobInfo == null) { return(false); } if (!_blockDownloadService.ValidateQueueAvailabilityBeforeDownload()) { return(false); } if (blockDownloadJobInfo.CurrentTargetBlockHash != null && _blockDownloadService.IsNotReachedDownloadTarget(blockDownloadJobInfo.CurrentTargetBlockHash) && TimestampHelper.GetUtcNow() < blockDownloadJobInfo.Deadline) { return(false); } return(true); }
public Task UpdateAsync(BlockDownloadJobInfo blockDownloadJobInfo) { _jobs[blockDownloadJobInfo.JobId] = blockDownloadJobInfo; return(Task.CompletedTask); }
private async Task RemoveJobAndTargetStateAsync(BlockDownloadJobInfo blockDownloadJobInfo) { await _blockDownloadJobStore.RemoveAsync(blockDownloadJobInfo.JobId); _blockDownloadService.RemoveDownloadJobTargetState(blockDownloadJobInfo.CurrentTargetBlockHash); }
private async Task <DownloadBlocksResult> DownloadBlocksAsync(Chain chain, BlockDownloadJobInfo jobInfo) { var downloadResult = new DownloadBlocksResult(); if (jobInfo.CurrentTargetBlockHeight == 0) { // Download blocks from longest chain downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.LongestChainHash, PreviousBlockHeight = chain.LongestChainHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount, UseSuggestedPeer = true }); // Download blocks from best chain if (downloadResult.Success && downloadResult.DownloadBlockCount == 0) { downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.BestChainHash, PreviousBlockHeight = chain.BestChainHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount, UseSuggestedPeer = true }); } // Download blocks from LIB if (downloadResult.Success && downloadResult.DownloadBlockCount == 0) { Logger.LogDebug($"Resynchronize from lib, lib height: {chain.LastIrreversibleBlockHeight}."); downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = chain.LastIrreversibleBlockHash, PreviousBlockHeight = chain.LastIrreversibleBlockHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount, UseSuggestedPeer = true }); } } // If last target block didn't become the longest chain, stop this job. else if (jobInfo.CurrentTargetBlockHeight <= chain.LongestChainHeight + 8) { downloadResult = await _blockDownloadService.DownloadBlocksAsync(new DownloadBlockDto { PreviousBlockHash = jobInfo.CurrentTargetBlockHash, PreviousBlockHeight = jobInfo.CurrentTargetBlockHeight, BatchRequestBlockCount = jobInfo.BatchRequestBlockCount, SuggestedPeerPubkey = jobInfo.SuggestedPeerPubkey, MaxBlockDownloadCount = _blockSyncOptions.MaxBlockDownloadCount, UseSuggestedPeer = false }); } return(downloadResult); }
public Task UpdateAsync(BlockDownloadJobInfo blockDownloadJobInfo) { _jobs[blockDownloadJobInfo.JobId] = blockDownloadJobInfo; return(Task.FromResult(0)); }