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); }
/// <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); }
/// <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); }