Exemplo n.º 1
0
Arquivo: Remote.cs Projeto: zedr0n/ZES
        private async Task <FastForwardResult> FastForward(IStreamStore from, IStreamStore to, string branchId)
        {
            var fastForwardResult = new FastForwardResult();
            var page = await from.ListStreams();

            while (page.StreamIds.Length > 0)
            {
                foreach (var s in page.StreamIds.Where(x => x.StartsWith(branchId)))
                {
                    var localPosition = await from.LastPosition(s);

                    var remotePosition = await to.LastPosition(s);

                    if (localPosition == remotePosition)
                    {
                        continue;
                    }

                    var eventPage = await from.ReadStreamForwards(s, Math.Max(remotePosition + 1, 0), Configuration.BatchSize);

                    var appendMessages = new List <NewStreamMessage>();

                    if (eventPage.Messages.Length == 0 && localPosition >= ExpectedVersion.EmptyStream)
                    {
                        await to.AppendToStream(s, remotePosition, appendMessages.ToArray());
                    }

                    var metadata = await from.GetStreamMetadata(s);

                    await to.SetStreamMetadata(s, ExpectedVersion.Any, metadata.MaxAge, metadata.MaxCount, metadata.MetadataJson);

                    while (eventPage.Messages.Length > 0)
                    {
                        appendMessages.Clear();
                        foreach (var m in eventPage.Messages)
                        {
                            var payload = await m.GetJsonData();

                            var message = new NewStreamMessage(m.MessageId, m.Type, payload, m.JsonMetadata);
                            appendMessages.Add(message);
                        }

                        var result = await to.AppendToStream(s, remotePosition, appendMessages.ToArray());

                        fastForwardResult.NumberOfMessages += result.CurrentVersion - Math.Max(remotePosition, ExpectedVersion.EmptyStream);
                        eventPage = await eventPage.ReadNext();
                    }

                    fastForwardResult.NumberOfStreams++;
                }

                page = await page.Next();
            }

            fastForwardResult.ResultStatus = Status.Success;

            return(fastForwardResult);
        }
Exemplo n.º 2
0
Arquivo: Remote.cs Projeto: zedr0n/ZES
        /// <inheritdoc />
        public async Task <FastForwardResult> Push(string branchId)
        {
            var pushResult = new FastForwardResult();

            var valid = await ValidatePush(branchId);

            if (!valid)
            {
                _log.Warn($"Push of {branchId} to remote aborted, can't fast-forward", this);
                return(pushResult);
            }

            pushResult = await FastForward(_localStore, _remoteStore, branchId);

            _log.Info($"Pushed {pushResult.NumberOfMessages} objects to {pushResult.NumberOfStreams} streams on branch {branchId}");
            return(pushResult);
        }
Exemplo n.º 3
0
Arquivo: Remote.cs Projeto: zedr0n/ZES
        /// <inheritdoc />
        public async Task <FastForwardResult> Pull(string branchId)
        {
            var pullResult = new FastForwardResult();

            var valid = await ValidatePull(branchId);

            if (!valid)
            {
                _log.Warn($"Pull of {branchId} from remote aborted, can't fast-forward", this);
                return(pullResult);
            }

            pullResult = await FastForward(_remoteStore, _localStore, branchId);

            _log.Info($"Pulled {pullResult.NumberOfMessages} objects from {pullResult.NumberOfStreams} streams on branch {branchId}");
            _messageQueue.Alert(new PullCompleted());
            _messageQueue.Alert(new InvalidateProjections());
            return(pullResult);
        }