private void LoadScenario(Scenario scenario, ISyncConfig syncConfig)
        {
            _syncConfig             = syncConfig;
            _syncConfig.PivotNumber = _pivotNumber.ToString();
            _syncConfig.PivotHash   = scenario.Blocks.Last().Hash.ToString();

            _feed = new FastReceiptsSyncFeed(
                _selector,
                _specProvider,
                _blockTree,
                _receiptStorage,
                _syncPeerPool,
                _syncConfig,
                _syncReport,
                LimboLogs.Instance);

            _feed.LagBehindBodies = 0;

            _blockTree.Genesis.Returns(scenario.Blocks[0].Header);
            _blockTree.FindBlock(Keccak.Zero, BlockTreeLookupOptions.None)
            .ReturnsForAnyArgs(ci =>
                               scenario.BlocksByHash.ContainsKey(ci.Arg <Keccak>())
                        ? scenario.BlocksByHash[ci.Arg <Keccak>()]
                        : null);

            _receiptStorage.LowestInsertedReceiptBlock.Returns((long?)null);
            _blockTree.LowestInsertedBody.Returns(scenario.LowestInsertedBody);
        }
        public void Setup()
        {
            _receiptStorage = Substitute.For <IReceiptStorage>();
            _blockTree      = Substitute.For <IBlockTree>();

            _syncConfig = new SyncConfig {
                FastBlocks = true
            };
            _syncConfig.PivotNumber = _pivotNumber.ToString();
            _syncConfig.PivotHash   = Keccak.Zero.ToString();

            _syncPeerPool = Substitute.For <ISyncPeerPool>();
            _syncReport   = Substitute.For <ISyncReport>();

            _measuredProgress      = new MeasuredProgress();
            _measuredProgressQueue = new MeasuredProgress();
            _syncReport.FastBlocksReceipts.Returns(_measuredProgress);
            _syncReport.ReceiptsInQueue.Returns(_measuredProgressQueue);

            _selector = Substitute.For <ISyncModeSelector>();

            _feed = new FastReceiptsSyncFeed(
                _selector,
                _specProvider,
                _blockTree,
                _receiptStorage,
                _syncPeerPool,
                _syncConfig,
                _syncReport,
                LimboLogs.Instance);
        }
 public void Should_throw_when_fast_blocks_not_enabled()
 {
     _syncConfig = new SyncConfig {
         FastBlocks = false
     };
     Assert.Throws <InvalidOperationException>(
         () => _feed = new FastReceiptsSyncFeed(
             _selector,
             _specProvider,
             _blockTree,
             _receiptStorage,
             _syncPeerPool,
             _syncConfig,
             _syncReport,
             LimboLogs.Instance));
 }
예제 #4
0
        private void StartFastBlocksComponents()
        {
            FastBlocksPeerAllocationStrategyFactory fastFactory = new FastBlocksPeerAllocationStrategyFactory();

            _headersFeed = new FastHeadersSyncFeed(_blockTree, _syncPeerPool, _syncConfig, _syncReport, _logManager);
            HeadersSyncDispatcher headersDispatcher = new HeadersSyncDispatcher(_headersFeed, _syncPeerPool, fastFactory, _logManager);
            Task headersTask = headersDispatcher.Start(_syncCancellation.Token).ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    if (_logger.IsError)
                    {
                        _logger.Error("Fast blocks headers downloader failed", t.Exception);
                    }
                }
                else
                {
                    if (_logger.IsInfo)
                    {
                        _logger.Info("Fast blocks headers task completed.");
                    }
                }
            });

            if (_syncConfig.DownloadHeadersInFastSync)
            {
                if (_syncConfig.DownloadBodiesInFastSync)
                {
                    _bodiesFeed = new FastBodiesSyncFeed(_blockTree, _syncPeerPool, _syncConfig, _syncReport, _logManager);
                    BodiesSyncDispatcher bodiesDispatcher = new BodiesSyncDispatcher(_bodiesFeed, _syncPeerPool, fastFactory, _logManager);
                    Task bodiesTask = bodiesDispatcher.Start(_syncCancellation.Token).ContinueWith(t =>
                    {
                        if (t.IsFaulted)
                        {
                            if (_logger.IsError)
                            {
                                _logger.Error("Fast bodies sync failed", t.Exception);
                            }
                        }
                        else
                        {
                            if (_logger.IsInfo)
                            {
                                _logger.Info("Fast blocks bodies task completed.");
                            }
                        }
                    });
                }

                if (_syncConfig.DownloadReceiptsInFastSync)
                {
                    FastReceiptsSyncFeed   receiptsFeed       = new FastReceiptsSyncFeed(_specProvider, _blockTree, _receiptStorage, _syncPeerPool, _syncConfig, _syncReport, _logManager);
                    ReceiptsSyncDispatcher receiptsDispatcher = new ReceiptsSyncDispatcher(receiptsFeed, _syncPeerPool, fastFactory, _logManager);
                    Task receiptsTask = receiptsDispatcher.Start(_syncCancellation.Token).ContinueWith(t =>
                    {
                        if (t.IsFaulted)
                        {
                            if (_logger.IsError)
                            {
                                _logger.Error("Fast receipts sync failed", t.Exception);
                            }
                        }
                        else
                        {
                            if (_logger.IsInfo)
                            {
                                _logger.Info("Fast blocks receipts task completed.");
                            }
                        }
                    });
                }
            }
        }