예제 #1
0
        public static FeedElement ToAllEventsForwardFeed(ClientMessage.ReadAllEventsForwardCompleted msg, Uri requestedUrl, EmbedLevel embedContent)
        {
            var self = HostName.Combine(requestedUrl, "/streams/{0}", AllEscaped);
            var feed = new FeedElement();

            feed.SetTitle("All events");
            feed.SetId(self);
            feed.SetUpdated(msg.Events.Length > 0 && msg.Events[0].Event != null ? msg.Events[msg.Events.Length - 1].Event.TimeStamp : DateTime.MinValue.ToUniversalTime());
            feed.SetAuthor(AtomSpecs.Author);

            feed.AddLink("self", self);
            feed.AddLink("first", HostName.Combine(requestedUrl, "/streams/{0}/head/backward/{1}", AllEscaped, msg.MaxCount));
            if (msg.CurrentPos.CommitPosition != 0)
            {
                feed.AddLink("last", HostName.Combine(requestedUrl, "/streams/{0}/{1}/forward/{2}", AllEscaped, new TFPos(0, 0).AsString(), msg.MaxCount));
                feed.AddLink("next", HostName.Combine(requestedUrl, "/streams/{0}/{1}/backward/{2}", AllEscaped, msg.PrevPos.AsString(), msg.MaxCount));
            }
            if (!msg.IsEndOfStream || msg.Events.Length > 0)
            {
                feed.AddLink("previous", HostName.Combine(requestedUrl, "/streams/{0}/{1}/forward/{2}", AllEscaped, msg.NextPos.AsString(), msg.MaxCount));
            }
            feed.AddLink("metadata", HostName.Combine(requestedUrl, "/streams/{0}/metadata", AllEscaped));
            for (int i = msg.Events.Length - 1; i >= 0; --i)
            {
                feed.AddEntry(
                    ToEntry(
                        new ResolvedEvent(msg.Events[i].Event, msg.Events[i].Link, msg.Events[i].ResolveResult),
                        requestedUrl, embedContent));
            }
            return(feed);
        }
        public static ClientMessage.ReadAllEventsForwardCompleted ReadAllEventsForward(MiniClusterNode node,
                                                                                       long position)
        {
            ClientMessage.ReadAllEventsForwardCompleted readResult = null;
            var readEvent = new ManualResetEventSlim();
            var done      = false;

            while (!done)
            {
                var read = new ClientMessage.ReadAllEventsForward(Guid.NewGuid(), Guid.NewGuid(), new CallbackEnvelope(
                                                                      msg => {
                    readResult = (ClientMessage.ReadAllEventsForwardCompleted)msg;
                    readEvent.Set();
                }),
                                                                  0, 0, 100, false, false, null, SystemAccount.Principal);
                node.Node.MainQueue.Publish(read);

                if (!readEvent.Wait(_timeout))
                {
                    Assert.Fail("Timed out waiting for events to be read forward");
                    return(null);
                }

                if (readResult.Result == ReadAllResult.Error)
                {
                    Assert.Fail("Failed to read forwards. Read result error: {0}", readResult.Error);
                    return(null);
                }

                done = readResult.NextPos.CommitPosition > position;
                readEvent.Reset();
            }

            return(readResult);
        }
예제 #3
0
        private static TcpPackage WrapReadAllEventsForwardCompleted(ClientMessage.ReadAllEventsForwardCompleted msg)
        {
            var dto = new TcpClientMessageDto.ReadAllEventsCompleted(
                msg.CurrentPos.CommitPosition, msg.CurrentPos.PreparePosition, ConvertToResolvedEvents(msg.Events),
                msg.NextPos.CommitPosition, msg.NextPos.PreparePosition,
                (TcpClientMessageDto.ReadAllEventsCompleted.ReadAllResult)msg.Result, msg.Error);

            return(new TcpPackage(TcpCommand.ReadAllEventsForwardCompleted, msg.CorrelationId, dto.Serialize()));
        }
        public void Handle(ClientMessage.ReadAllEventsForwardCompleted message)
        {
            EventDistributionPoint distributionPoint;

            if (_distributionPoints.TryGetValue(message.CorrelationId, out distributionPoint))
            {
                distributionPoint.Handle(message);
            }
        }
예제 #5
0
        private static TcpPackage WrapReadAllEventsForwardCompleted(ClientMessage.ReadAllEventsForwardCompleted msg)
        {
            var dto = new ClientMessageDto.ReadAllEventsForwardCompleted(msg.Result.CurrentPos.CommitPosition,
                                                                         msg.Result.CurrentPos.PreparePosition,
                                                                         msg.Result.Records.Select(x => new EventLinkPair(x.Event, x.Link)).ToArray(),
                                                                         msg.Result.NextPos.CommitPosition,
                                                                         msg.Result.NextPos.PreparePosition);

            return(new TcpPackage(TcpCommand.ReadAllEventsForwardCompleted, msg.CorrelationId, dto.Serialize()));
        }
예제 #6
0
        public override void Handle(ClientMessage.ReadAllEventsForwardCompleted message)
        {
            if (_disposed)
            {
                return;
            }
            if (!_eventsRequested)
            {
                throw new InvalidOperationException("Read events has not been requested");
            }
            if (_paused)
            {
                throw new InvalidOperationException("Paused");
            }
            _eventsRequested = false;

            if (message.Result.Records.Count == 0)
            {
                // the end
                if (_deliverEndOfTfPosition)
                {
                    DeliverLastCommitPosition(_from);
                }
                // allow joining heading distribution
            }
            else
            {
                for (int index = 0; index < message.Result.Records.Count; index++)
                {
                    var @event = message.Result.Records[index];
                    DeliverEvent(@event);
                }
                _from = message.Result.NextPos;
            }
            if (_pauseRequested)
            {
                _paused = true;
            }
            else
            {
                //TODO: we may publish this message somewhere 10 events before the end of the chunk
                _publisher.Publish(
                    new ProjectionMessage.CoreService.Tick(
                        () => { if (!_paused && !_disposed)
                                {
                                    RequestEvents();
                                }
                        }));
            }
        }
        public override void Handle(ClientMessage.ReadAllEventsForwardCompleted message)
        {
            if (_disposed)
            {
                return;
            }
            if (!_eventsRequested)
            {
                throw new InvalidOperationException("Read events has not been requested");
            }
            if (_paused)
            {
                throw new InvalidOperationException("Paused");
            }
            _eventsRequested = false;

            if (message.Result.Records.Length == 0)
            {
                // the end
                if (_deliverEndOfTfPosition)
                {
                    DeliverLastCommitPosition(_from);
                }
                // allow joining heading distribution
            }
            else
            {
                for (int index = 0; index < message.Result.Records.Length; index++)
                {
                    var @event = message.Result.Records[index];
                    DeliverEvent(@event, message.Result.TfEofPosition);
                }
                _from = message.Result.NextPos;
            }


            if (_pauseRequested)
            {
                _paused = true;
            }
            else if (message.Result.Records.Length == 0)
            {
                RequestEvents(delay: true);
            }
            else
            {
                _publisher.Publish(CreateTickMessage());
            }
        }
예제 #8
0
            public void FetchAllCompleted(ClientMessage.ReadAllEventsForwardCompleted msg)
            {
                switch (msg.Result)
                {
                case ReadAllResult.Success:
                    _onFetchCompleted(_skipFirstEvent ? msg.Events.Skip(1).ToArray() : msg.Events, new PersistentSubscriptionAllStreamPosition(msg.NextPos.CommitPosition, msg.NextPos.PreparePosition), msg.IsEndOfStream);
                    break;

                case ReadAllResult.AccessDenied:
                    _onError($"Read access denied for stream: {SystemStreams.AllStream}");
                    break;

                default:
                    _onError(msg.Error ?? $"Error reading stream: {SystemStreams.AllStream} at position: {msg.CurrentPos}");
                    break;
                }
            }
        when_wrapping_read_all_events_forward_completed_with_deleted_event_should_not_downgrade_last_event_number_for_v2_clients()
        {
            var events = new ResolvedEvent[] {
                ResolvedEvent.ForUnresolvedEvent(CreateDeletedEventRecord(), 0),
            };
            var msg = new ClientMessage.ReadAllEventsForwardCompleted(Guid.NewGuid(), ReadAllResult.Success, "", events,
                                                                      new StreamMetadata(), true, 10, new TFPos(0, 0),
                                                                      new TFPos(200, 200), new TFPos(0, 0), 100);

            var package = _dispatcher.WrapMessage(msg, (byte)ClientVersion.V2);

            Assert.IsNotNull(package, "Package is null");
            Assert.AreEqual(TcpCommand.ReadAllEventsForwardCompleted, package.Value.Command, "TcpCommand");

            var dto = package.Value.Data.Deserialize <TcpClientMessageDto.ReadAllEventsCompleted>();

            Assert.IsNotNull(dto, "DTO is null");
            Assert.AreEqual(1, dto.Events.Count(), "Number of events");

            Assert.AreEqual(long.MaxValue, dto.Events[0].Event.EventNumber, "Event Number");
        }
        public InspectionResult InspectPackage(TcpPackage package)
        {
            try
            {
                if (package.Command != TcpCommand.ReadAllEventsForwardCompleted)
                {
                    return(new InspectionResult(InspectionDecision.NotifyError,
                                                new CommandNotExpectedException(TcpCommand.ReadAllEventsForwardCompleted.ToString(),
                                                                                package.Command.ToString())));
                }

                var data = package.Data;
                var dto  = data.Deserialize <ClientMessage.ReadAllEventsForwardCompleted>();
                _result = dto;
                return(new InspectionResult(InspectionDecision.Succeed));
            }
            catch (Exception e)
            {
                return(new InspectionResult(InspectionDecision.NotifyError, e));
            }
        }
예제 #11
0
        public void when_wrapping_read_all_events_forward_completed_with_link_to_deleted_event_should_downgrade_version()
        {
            var events = new ResolvedEvent[] {
                ResolvedEvent.ForResolvedLink(CreateLinkEventRecord(), CreateDeletedEventRecord(), 100)
            };
            var msg = new ClientMessage.ReadAllEventsForwardCompleted(Guid.NewGuid(), ReadAllResult.Success, "", events,
                                                                      new StreamMetadata(), true, 10, new TFPos(0, 0),
                                                                      new TFPos(200, 200), new TFPos(0, 0), 100);

            var package = _dispatcher.WrapMessage(msg, _version);

            Assert.IsNotNull(package, "Package is null");
            Assert.AreEqual(TcpCommand.ReadAllEventsForwardCompleted, package.Value.Command, "TcpCommand");

            var dto = package.Value.Data.Deserialize <TcpClientMessageDto.ReadAllEventsCompleted>();

            Assert.IsNotNull(dto, "DTO is null");
            Assert.AreEqual(1, dto.Events.Count(), "Number of events");

            Assert.AreEqual(0, dto.Events[0].Event.EventNumber, "Event Number");
            Assert.AreEqual(int.MaxValue, dto.Events[0].Link.EventNumber, "Link Event Number");
        }
예제 #12
0
 public abstract void Handle(ClientMessage.ReadAllEventsForwardCompleted message);
 public override void Handle(ClientMessage.ReadAllEventsForwardCompleted message)
 {
     throw new NotImplementedException();
 }