Exemplo n.º 1
0
        private void DeliverEvent(EventStore.Core.Data.ResolvedEvent pair, float progress, ref long sequenceNumber)
        {
            EventRecord positionEvent = pair.OriginalEvent;

            if (positionEvent.EventNumber != sequenceNumber)
            {
                // This can happen when the original stream has $maxAge/$maxCount set
                _publisher.Publish(new ReaderSubscriptionMessage.Faulted(EventReaderCorrelationId, string.Format(
                                                                             "Event number {0} was expected in the stream {1}, but event number {2} was received. This may happen if events have been deleted from the beginning of your stream, please reset your projection.",
                                                                             sequenceNumber, _streamName, positionEvent.EventNumber), this.GetType()));
                return;
            }

            sequenceNumber = positionEvent.EventNumber + 1;
            var resolvedEvent = new ResolvedEvent(pair, null);

            string deletedPartitionStreamId;

            if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone)
            {
                return;
            }

            bool isDeletedStreamEvent =
                StreamDeletedHelper.IsStreamDeletedEventOrLinkToStreamDeletedEvent(resolvedEvent, pair.ResolveResult,
                                                                                   out deletedPartitionStreamId);

            if (isDeletedStreamEvent)
            {
                var deletedPartition = deletedPartitionStreamId;

                if (_produceStreamDeletes)
                {
                    _publisher.Publish(
                        //TODO: publish both link and event data
                        new ReaderSubscriptionMessage.EventReaderPartitionDeleted(
                            EventReaderCorrelationId, deletedPartition, source: this.GetType(), lastEventNumber: -1,
                            deleteEventOrLinkTargetPosition: null,
                            deleteLinkOrEventPosition: resolvedEvent.EventOrLinkTargetPosition,
                            positionStreamId: resolvedEvent.PositionStreamId,
                            positionEventNumber: resolvedEvent.PositionSequenceNumber));
                }
            }
            else if (!resolvedEvent.IsStreamDeletedEvent)
            {
                _publisher.Publish(
                    //TODO: publish both link and event data
                    new ReaderSubscriptionMessage.CommittedEventDistributed(
                        EventReaderCorrelationId, resolvedEvent, _stopOnEof ? (long?)null : positionEvent.LogPosition,
                        progress, source: this.GetType()));
            }
        }
Exemplo n.º 2
0
        private void DeliverEvent(EventStore.Core.Data.ResolvedEvent pair, float progress, ref int sequenceNumber)
        {
            _deliveredEvents++;

            EventRecord positionEvent = pair.OriginalEvent;

            if (positionEvent.EventNumber != sequenceNumber)
            {
                throw new InvalidOperationException(
                          string.Format(
                              "Event number {0} was expected in the stream {1}, but event number {2} was received",
                              sequenceNumber, _streamName, positionEvent.EventNumber));
            }
            sequenceNumber = positionEvent.EventNumber + 1;
            var resolvedEvent = new ResolvedEvent(pair, null);

            string deletedPartitionStreamId;

            if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone)
            {
                return;
            }

            bool isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEvent(resolvedEvent, out deletedPartitionStreamId);

            if (isDeletedStreamEvent)
            {
                var deletedPartition = deletedPartitionStreamId;

                if (_produceStreamDeletes)
                {
                    _publisher.Publish(
                        //TODO: publish both link and event data
                        new ReaderSubscriptionMessage.EventReaderPartitionDeleted(
                            EventReaderCorrelationId, deletedPartition, source: this.GetType(), lastEventNumber: -1,
                            deleteEventOrLinkTargetPosition: null, deleteLinkOrEventPosition: resolvedEvent.EventOrLinkTargetPosition,
                            positionStreamId: resolvedEvent.PositionStreamId,
                            positionEventNumber: resolvedEvent.PositionSequenceNumber));
                }
            }

            else if (!resolvedEvent.IsStreamDeletedEvent)
            {
                _publisher.Publish(
                    //TODO: publish both link and event data
                    new ReaderSubscriptionMessage.CommittedEventDistributed(
                        EventReaderCorrelationId, resolvedEvent, _stopOnEof ? (long?)null : positionEvent.LogPosition,
                        progress, source: this.GetType()));
            }
        }
            protected void DeliverEvent(float progress, ResolvedEvent resolvedEvent, TFPos position)
            {
                if (resolvedEvent.EventOrLinkTargetPosition <= _reader._lastEventPosition)
                {
                    return;
                }
                _reader._lastEventPosition = resolvedEvent.EventOrLinkTargetPosition;
                _reader._deliveredEvents++;
                //TODO: this is incomplete.  where reading from TF we need to handle actual deletes

                string deletedPartitionStreamId;


                if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone)
                {
                    return;
                }

                bool isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEvent(
                    resolvedEvent, out deletedPartitionStreamId);

                if (isDeletedStreamEvent)
                {
                    var deletedPartition = deletedPartitionStreamId;

                    if (_reader._includeDeletedStreamNotification)
                    {
                        _reader._publisher.Publish(
                            //TODO: publish both link and event data
                            new ReaderSubscriptionMessage.EventReaderPartitionDeleted(
                                _reader.EventReaderCorrelationId, deletedPartition, source: this.GetType(),
                                lastEventNumber: -1, deleteEventOrLinkTargetPosition: position,
                                deleteLinkOrEventPosition: resolvedEvent.EventOrLinkTargetPosition,
                                positionStreamId: resolvedEvent.PositionStreamId,
                                positionEventNumber: resolvedEvent.PositionSequenceNumber));
                    }
                }
                else
                {
                    _reader._publisher.Publish(
                        //TODO: publish both link and event data
                        new ReaderSubscriptionMessage.CommittedEventDistributed(
                            _reader.EventReaderCorrelationId, resolvedEvent,
                            _reader._stopOnEof ? (long?)null : position.PreparePosition, progress,
                            source: this.GetType()));
                }
            }
        private void DeliverEvent(
            EventStore.Core.Data.ResolvedEvent @event, long lastCommitPosition, TFPos currentFrom)
        {
            EventRecord linkEvent     = @event.Link;
            EventRecord targetEvent   = @event.Event ?? linkEvent;
            EventRecord positionEvent = (linkEvent ?? targetEvent);

            TFPos receivedPosition = @event.OriginalPosition.Value;

            if (currentFrom > receivedPosition)
            {
                throw new Exception(
                          string.Format(
                              "ReadFromTF returned events in incorrect order.  Last known position is: {0}.  Received position is: {1}",
                              currentFrom, receivedPosition));
            }

            var resolvedEvent = new ResolvedEvent(@event, null);

            string deletedPartitionStreamId;

            if (resolvedEvent.IsLinkToDeletedStream && !resolvedEvent.IsLinkToDeletedStreamTombstone)
            {
                return;
            }

            bool isDeletedStreamEvent = StreamDeletedHelper.IsStreamDeletedEventOrLinkToStreamDeletedEvent(
                resolvedEvent, out deletedPartitionStreamId);

            _publisher.Publish(
                new ReaderSubscriptionMessage.CommittedEventDistributed(
                    EventReaderCorrelationId,
                    resolvedEvent,
                    _stopOnEof ? (long?)null : receivedPosition.PreparePosition,
                    100.0f * positionEvent.LogPosition / lastCommitPosition,
                    source: this.GetType()));
            if (isDeletedStreamEvent)
            {
                _publisher.Publish(
                    new ReaderSubscriptionMessage.EventReaderPartitionDeleted(
                        EventReaderCorrelationId, deletedPartitionStreamId, source: this.GetType(), lastEventNumber: -1,
                        deleteEventOrLinkTargetPosition: resolvedEvent.EventOrLinkTargetPosition,
                        deleteLinkOrEventPosition: resolvedEvent.LinkOrEventPosition,
                        positionStreamId: positionEvent.EventStreamId, positionEventNumber: positionEvent.EventNumber));
            }
        }
Exemplo n.º 5
0
            public void Handle(ClientMessage.ReadAllEventsForwardCompleted message)
            {
                if (_disposed)
                {
                    return;
                }
                if (message.CorrelationId != _pendingRequestCorrelationId)
                {
                    return;
                }
                if (message.Result == ReadAllResult.AccessDenied)
                {
                    SendNotAuthorized();
                    return;
                }

                if (!_tfEventsRequested)
                {
                    throw new InvalidOperationException("TF events has not been requested");
                }
                if (_reader.Paused)
                {
                    throw new InvalidOperationException("Paused");
                }
                _reader._lastPosition = message.TfLastCommitPosition;
                _tfEventsRequested    = false;
                switch (message.Result)
                {
                case ReadAllResult.Success:
                    var eof = message.Events.Length == 0;
                    _eof = eof;
                    var willDispose = _reader._stopOnEof && eof;
                    _fromTfPosition = message.NextPos;

                    if (!willDispose)
                    {
                        _reader.PauseOrContinueProcessing();
                    }

                    if (eof)
                    {
                        // the end
                        //TODO: is it safe to pass NEXT as last commit position here
                        DeliverLastCommitPosition(message.NextPos);
                        // allow joining heading distribution
                        SendIdle();
                        _reader.SendEof();
                    }
                    else
                    {
                        foreach (var @event in message.Events)
                        {
                            var    link     = @event.Link;
                            var    data     = @event.Event;
                            var    byStream = link != null && _streamToEventType.ContainsKey(link.EventStreamId);
                            string adjustedPositionStreamId;
                            var    isDeleteStreamEvent =
                                StreamDeletedHelper.IsStreamDeletedEvent(
                                    @event.OriginalStreamId, @event.OriginalEvent.EventType,
                                    @event.OriginalEvent.Data, out adjustedPositionStreamId);
                            if (data == null)
                            {
                                continue;
                            }
                            var eventType          = isDeleteStreamEvent ? "$deleted" : data.EventType;
                            var byEvent            = link == null && _eventTypes.Contains(eventType);
                            var originalTfPosition = @event.OriginalPosition.Value;
                            if (byStream)
                            {     // ignore data just update positions
                                _reader.UpdateNextStreamPosition(link.EventStreamId, link.EventNumber + 1);
                                // recover unresolved link event
                                var unresolvedLinkEvent = EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent(link, originalTfPosition.CommitPosition);
                                DeliverEventRetrievedFromTf(
                                    unresolvedLinkEvent, 100.0f * link.LogPosition / message.TfLastCommitPosition,
                                    originalTfPosition);
                            }
                            else if (byEvent)
                            {
                                DeliverEventRetrievedFromTf(
                                    @event, 100.0f * data.LogPosition / message.TfLastCommitPosition, originalTfPosition);
                            }
                        }
                    }
                    if (_disposed)
                    {
                        return;
                    }

                    break;

                default:
                    throw new NotSupportedException(
                              String.Format("ReadEvents result code was not recognized. Code: {0}", message.Result));
                }
            }