public void Map(long deltaNumber, Cid deltaHash) { if (!_repository.TryGet(DeltaIndexDao.BuildDocumentId((ulong)deltaNumber), out _)) { _repository.Add(new DeltaIndexDao { Height = (ulong)deltaNumber, Cid = deltaHash }); } }
public bool TryFind(long deltaNumber, out Cid deltaHash) { if (_repository.TryGet(DeltaIndexDao.BuildDocumentId((ulong)deltaNumber), out var delta)) { deltaHash = delta.Cid; return(true); } deltaHash = default; return(false); }
/// <param name="deltaHeightRequest"></param> /// <param name="channelHandlerContext"></param> /// <param name="senderPeerId"></param> /// <param name="correlationId"></param> /// <returns></returns> protected override LatestDeltaHashResponse HandleRequest(LatestDeltaHashRequest deltaHeightRequest, IChannelHandlerContext channelHandlerContext, PeerId senderPeerId, ICorrelationId correlationId) { Guard.Argument(deltaHeightRequest, nameof(deltaHeightRequest)).NotNull(); Guard.Argument(channelHandlerContext, nameof(channelHandlerContext)).NotNull(); Guard.Argument(senderPeerId, nameof(senderPeerId)).NotNull(); Logger.Debug("PeerId: {0} wants to know your current chain height", senderPeerId); var deltaIndexDao = _deltaIndexService.LatestDeltaIndex(); var deltaIndex = DeltaIndexDao.ToProtoBuff <DeltaIndex>(deltaIndexDao, _mapperProvider); return(new LatestDeltaHashResponse { IsSync = _syncState.IsSynchronized, DeltaIndex = deltaIndex }); }
/// <param name="deltaHeightRequest"></param> /// <param name="channelHandlerContext"></param> /// <param name="senderPeerId"></param> /// <param name="correlationId"></param> /// <returns></returns> protected override DeltaHistoryResponse HandleRequest(DeltaHistoryRequest deltaHeightRequest, IChannelHandlerContext channelHandlerContext, PeerId senderPeerId, ICorrelationId correlationId) { Guard.Argument(deltaHeightRequest, nameof(deltaHeightRequest)).NotNull(); Guard.Argument(channelHandlerContext, nameof(channelHandlerContext)).NotNull(); Guard.Argument(senderPeerId, nameof(senderPeerId)).NotNull(); Logger.Debug("PeerId: {0} requests: {1} deltas from height: {2}", senderPeerId, deltaHeightRequest.Range, deltaHeightRequest.Height); var rangeDao = _deltaIndexService.GetRange(deltaHeightRequest.Height, deltaHeightRequest.Range) .ToList(); var range = rangeDao.Select(x => DeltaIndexDao.ToProtoBuff <DeltaIndex>(x, _mapperProvider)).ToList(); var response = new DeltaHistoryResponse(); response.DeltaIndex.Add(range); return(response); }
private void ProcessDeltaIndexRange(IEnumerable <DeltaIndex> deltaIndexRange) { var deltaIndexRangeDao = deltaIndexRange.Select(x => DeltaIndexDao.ToDao <DeltaIndex>(x, _mapperProvider)).ToList(); var firstDeltaIndex = deltaIndexRangeDao.FirstOrDefault(); if (firstDeltaIndex == null || firstDeltaIndex.Cid != _previousHash) { _logger.Error($"Sync Error - Previous delta({_previousHash}) does not match next delta({firstDeltaIndex.Cid})"); return; } deltaIndexRangeDao.Remove(firstDeltaIndex); DownloadDeltas(deltaIndexRangeDao); UpdateState(deltaIndexRangeDao); CheckSyncProgressAsync().ConfigureAwait(false).GetAwaiter().GetResult(); Progress(CurrentHighestDeltaIndexStored, _rangeSize); }
public void Add(DeltaIndexDao deltaIndex) { _repository.Add(deltaIndex); }
public async Task Sync_Can_Add_DeltaIndexRange_To_Repository() { _syncTestHeight = 10; var expectedData = GenerateSampleData(0, _syncTestHeight, _syncTestHeight); var sync = new Synchroniser(new SyncState(), _peerSyncManager, _deltaCache, _deltaHeightWatcher, _deltaHashProvider, _deltaDfsReader, _deltaIndexService, _mapperProvider, _userOutput, Substitute.For <ILogger>(), _syncTestHeight); sync.SyncCompleted.Subscribe(x => { _manualResetEventSlim.Set(); }); await sync.StartAsync(CancellationToken.None); _manualResetEventSlim.Wait(); var range = _deltaIndexService.GetRange(0, (ulong)_syncTestHeight).Select(x => DeltaIndexDao.ToProtoBuff <DeltaIndex>(x, _mapperProvider)); range.Should().BeEquivalentTo(expectedData.DeltaIndex); }
public void Init() { _cancellationToken = new CancellationToken(); _manualResetEventSlim = new ManualResetEventSlim(false); _testScheduler = new TestScheduler(); _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256")); _peerSettings = Substitute.For <IPeerSettings>(); _peerSettings.PeerId.Returns(PeerIdHelper.GetPeerId()); _deltaDfsReader = Substitute.For <IDeltaDfsReader>(); _deltaDfsReader.TryReadDeltaFromDfs(Arg.Any <Cid>(), out Arg.Any <Delta>()).Returns(x => true); _deltaCache = Substitute.For <IDeltaCache>(); _deltaCache.GenesisHash.Returns("bafk2bzacecji5gcdd6lxsoazgnbg46c3vttjwwkptiw27enachziizhhkir2w".ToCid()); _ledger = Substitute.For <ILedger>(); _peerService = Substitute.For <IPeerService>(); _deltaHashProvider = new DeltaHashProvider(_deltaCache, Substitute.For <IDeltaIndexService>(), Substitute.For <ILogger>()); _deltaIndexService = new DeltaIndexService(new InMemoryRepository <DeltaIndexDao, string>()); _deltaIndexService.Add(new DeltaIndexDao { Cid = _hashProvider.ComputeUtf8MultiHash("0").ToCid(), Height = 0 }); _peerClient = Substitute.For <IPeerClient>(); ModifyPeerClient <LatestDeltaHashRequest>((request, senderPeerIdentifier) => { var deltaHeightResponse = new LatestDeltaHashResponse { DeltaIndex = new DeltaIndex { Cid = _hashProvider.ComputeUtf8MultiHash(_syncTestHeight.ToString()).ToCid().ToArray() .ToByteString(), Height = (uint)_syncTestHeight } }; _deltaHeightReplaySubject.OnNext(new ObserverDto(Substitute.For <IChannelHandlerContext>(), deltaHeightResponse.ToProtocolMessage(senderPeerIdentifier, CorrelationId.GenerateCorrelationId()))); }); ModifyPeerClient <DeltaHistoryRequest>((request, senderPeerIdentifier) => { var data = GenerateSampleData((int)request.Height, (int)request.Range, (int)_syncTestHeight); _deltaIndexService.Add(data.DeltaIndex.Select(x => DeltaIndexDao.ToDao <DeltaIndex>(x, _mapperProvider))); _deltaHistoryReplaySubject.OnNext(new ObserverDto(Substitute.For <IChannelHandlerContext>(), data .ToProtocolMessage(senderPeerIdentifier, CorrelationId.GenerateCorrelationId()))); }); _peerRepository = new PeerRepository(new InMemoryRepository <Peer, string>()); Enumerable.Repeat(new Peer { PeerId = PeerIdHelper.GetPeerId() }, 5).ToList().ForEach(_peerRepository.Add); _deltaHeightReplaySubject = new ReplaySubject <IObserverDto <ProtocolMessage> >(1); _deltaHistoryReplaySubject = new ReplaySubject <IObserverDto <ProtocolMessage> >(1); var mergeMessageStreams = _deltaHeightReplaySubject.AsObservable() .Merge(_deltaHistoryReplaySubject.AsObservable()); _peerService.MessageStream.Returns(mergeMessageStreams); _deltaHashProvider = Substitute.For <IDeltaHashProvider>(); _deltaHashProvider.TryUpdateLatestHash(Arg.Any <Cid>(), Arg.Any <Cid>()).Returns(true); _mapperProvider = new TestMapperProvider(); _userOutput = Substitute.For <IUserOutput>(); _deltaHeightWatcher = new DeltaHeightWatcher(_peerClient, _peerRepository, _peerService, minimumPeers: 0); var dfsService = Substitute.For <IDfsService>(); _peerSyncManager = new PeerSyncManager(_peerClient, _peerRepository, _peerService, _userOutput, _deltaHeightWatcher, Substitute.For <IDfsService>(), 0.7, 0); }