private void EnqueueFetchBlockJob(SyncAnnouncementDto syncAnnouncementDto, int retryTimes) { _blockSyncQueueService.Enqueue(async() => { Logger.LogTrace( $"Block sync: Fetch block, block height: {syncAnnouncementDto.SyncBlockHeight}, block hash: {syncAnnouncementDto.SyncBlockHash}."); var fetchResult = false; if (ValidateQueueAvailability()) { fetchResult = await _blockFetchService.FetchBlockAsync(syncAnnouncementDto.SyncBlockHash, syncAnnouncementDto.SyncBlockHeight, syncAnnouncementDto.SuggestedPeerPubkey); } if (fetchResult) { return; } if (retryTimes > 1) { EnqueueFetchBlockJob(syncAnnouncementDto, retryTimes - 1); } else if (_announcementCacheProvider.TryGetAnnouncementNextSender(syncAnnouncementDto.SyncBlockHash, out var senderPubKey)) { syncAnnouncementDto.SuggestedPeerPubkey = senderPubKey; EnqueueFetchBlockJob(syncAnnouncementDto, BlockSyncConstants.FetchBlockRetryTimes); } }, OSConstants.BlockFetchQueueName); }
public async Task SyncByAnnouncementAsync(Chain chain, SyncAnnouncementDto syncAnnouncementDto) { if (syncAnnouncementDto.SyncBlockHash != null && syncAnnouncementDto.SyncBlockHeight <= chain.LongestChainHeight + BlockSyncConstants.BlockSyncModeHeightOffset) { if (!_blockSyncQueueService.ValidateQueueAvailability(OSConstants.BlockFetchQueueName)) { Logger.LogWarning("Block sync fetch queue is too busy."); return; } EnqueueFetchBlockJob(syncAnnouncementDto, BlockSyncConstants.FetchBlockRetryTimes); } else { await _blockDownloadJobManager.EnqueueAsync(syncAnnouncementDto.SyncBlockHash, syncAnnouncementDto .SyncBlockHeight, syncAnnouncementDto.BatchRequestBlockCount, syncAnnouncementDto.SuggestedPeerPubkey); } }