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