Esempio n. 1
0
        private ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward msg)
        {
            using (HistogramService.Measure(_readerStreamRangeHistogram))
            {
                var lastCommitPosition = _readIndex.LastReplicatedPosition;
                try
                {
                    if (msg.MaxCount > MaxPageSize)
                    {
                        throw new ArgumentException(string.Format("Read size too big, should be less than {0} items",
                                                                  MaxPageSize));
                    }
                    if (msg.ValidationStreamVersion.HasValue &&
                        _readIndex.GetStreamLastEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion)
                    {
                        return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition,
                                      msg.ValidationStreamVersion.Value));
                    }

                    var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                    if (!access.Granted)
                    {
                        return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                    }

                    var result = _readIndex.ReadStreamEventsForward(msg.EventStreamId, msg.FromEventNumber, msg.MaxCount);
                    CheckEventsOrder(msg, result);
                    var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User);
                    if (resolvedPairs == null)
                    {
                        return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                    }

                    return(new ClientMessage.ReadStreamEventsForwardCompleted(
                               msg.CorrelationId, msg.EventStreamId, msg.FromEventNumber, msg.MaxCount,
                               (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty,
                               result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition));
                }
                catch (Exception exc)
                {
                    Log.ErrorException(exc, "Error during processing ReadStreamEventsForward request.");
                    return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, error: exc.Message));
                }
            }
        }
Esempio n. 2
0
        public void Handle(ClientMessage.ConnectToPersistentSubscription message)
        {
            if (!_started)
            {
                return;
            }
            var streamAccess = _readIndex.CheckStreamAccess(
                message.EventStreamId, StreamAccessType.Read, message.User);

            if (!streamAccess.Granted)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.AccessDenied));
                return;
            }

            List <PersistentSubscription> subscribers;

            if (!_subscriptionTopics.TryGetValue(message.EventStreamId, out subscribers))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            var key = BuildSubscriptionGroupKey(message.EventStreamId, message.SubscriptionId);
            PersistentSubscription subscription;

            if (!_subscriptionsById.TryGetValue(key, out subscription))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            if (subscription.HasReachedMaxClientCount)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.SubscriberMaxCountReached));
                return;
            }

            Log.Debug("New connection to persistent subscription {subscriptionKey} by {connectionId}", key,
                      message.ConnectionId);
            var lastEventNumber   = _readIndex.GetStreamLastEventNumber(message.EventStreamId);
            var lastCommitPos     = _readIndex.LastIndexedPosition;
            var subscribedMessage =
                new ClientMessage.PersistentSubscriptionConfirmation(key, message.CorrelationId, lastCommitPos,
                                                                     lastEventNumber);

            message.Envelope.ReplyWith(subscribedMessage);
            var name = message.User == null ? "anonymous" : message.User.Identity.Name;

            subscription.AddClient(message.CorrelationId, message.ConnectionId, message.ConnectionName, message.Envelope,
                                   message.AllowedInFlightMessages, name, message.From);
        }
Esempio n. 3
0
        private ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward msg)
        {
            var lastCommitPosition = _readIndex.LastCommitPosition;

            try
            {
                if (msg.ValidationStreamVersion.HasValue && _readIndex.GetStreamLastEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion)
                {
                    return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition, msg.ValidationStreamVersion.Value));
                }

                var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                if (!access.Granted)
                {
                    return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                }

                var result = _readIndex.ReadStreamEventsForward(msg.EventStreamId, msg.FromEventNumber, msg.MaxCount);
                CheckEventsOrder(msg, result);
                var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User);
                if (resolvedPairs == null)
                {
                    return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                }

                return(new ClientMessage.ReadStreamEventsForwardCompleted(
                           msg.CorrelationId, msg.EventStreamId, msg.FromEventNumber, msg.MaxCount,
                           (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty,
                           result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition));
            }
            catch (Exception exc)
            {
                Log.ErrorException(exc, "Error during processing ReadStreamEventsForward request.");
                return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, error: exc.Message));
            }
        }
Esempio n. 4
0
 public long GetStreamLastEventNumber(TStreamId streamId) => _readIndex.GetStreamLastEventNumber(streamId);
Esempio n. 5
0
        public static long GetStreamLastEventNumber <TStreamId>(this IReadIndex <TStreamId> self, string streamName)
        {
            var streamId = self.GetStreamId(streamName);

            return(self.GetStreamLastEventNumber(streamId));
        }