public ConsumerPushResult PushMessageToClient(OutstandingMessage message)
        {
            if (_state == null)
            {
                return(ConsumerPushResult.NoMoreCapacity);
            }

            if (_state.AvailableCapacity == 0)
            {
                return(ConsumerPushResult.NoMoreCapacity);
            }


            uint bucket = GetAssignmentId(message.ResolvedEvent);

            if (_state.Assignments[bucket].State != BucketAssignment.BucketState.Assigned)
            {
                _state.AssignBucket(bucket);
            }

            if (!_state.Assignments[bucket].Node.Client.Push(message))
            {
                return(ConsumerPushResult.Skipped);
            }

            _state.RecordEventSent(bucket);
            return(ConsumerPushResult.Sent);
        }
        private OutstandingMessage BuildMessageAt(int position, Guid?forcedEventId = null)
        {
            IPersistentSubscriptionStreamPosition previousEventPosition =
                position > 0 ? Helper.GetStreamPositionFor(position - 1, _eventSource) : null;
            var @event = BuildEventAt(position, forcedEventId);

            return(OutstandingMessage.ForPushedEvent(
                       OutstandingMessage.ForNewEvent(@event, Helper.GetStreamPositionFor(position, _eventSource)), position, previousEventPosition).message);
        }
        private OutstandingMessage BuildMessageAt(int eventPosition, EventSource eventSource, Guid?forcedEventId = null)
        {
            IPersistentSubscriptionStreamPosition previousEventPosition =
                eventPosition > 0 ? GetStreamPositionFor(eventPosition - 1) : null;
            var @event = Helper.GetFakeEventFor(eventPosition, eventSource, forcedEventId);

            return(OutstandingMessage.ForPushedEvent(
                       OutstandingMessage.ForNewEvent(@event, GetStreamPositionFor(eventPosition)),
                       eventPosition, previousEventPosition).message);
        }
        public void lowest_ignores_replayed_events()
        {
            var cache = new OutstandingMessageCache();

            //normal event:
            cache.StartMessage(BuildMessageAt(5, _eventSource), DateTime.Now);
            //replayed event:
            cache.StartMessage(OutstandingMessage.ForParkedEvent(Helper.BuildFakeEvent(Guid.NewGuid(), "type", "$persistentsubscription-name::group-parked", 4)), DateTime.Now);
            Assert.AreEqual(GetStreamPositionFor(5), cache.GetLowestPosition().message?.EventPosition);
        }
        public void lowest_retry_ignores_replayed_events()
        {
            var buffer = new StreamBuffer(10, 10, null, true);

            buffer.AddRetry(BuildMessageAt(4));
            buffer.AddRetry(BuildMessageAt(2));
            buffer.AddRetry(BuildMessageAt(3));
            //add parked events
            buffer.AddRetry(OutstandingMessage.ForParkedEvent(Helper.BuildFakeEvent(Guid.NewGuid(), "foo", "$persistentsubscription-foo::group-parked", 1)));
            Assert.AreEqual(2, buffer.GetLowestRetry().sequenceNumber);
        }
        public void adding_read_message_in_correct_order()
        {
            var buffer = new StreamBuffer(10, 10, null, true);

            buffer.AddReadMessage(BuildMessageAt(0));
            Assert.AreEqual(1, buffer.BufferCount);
            OutstandingMessage message = buffer.Scan().First().Message;

            Assert.AreEqual(GetEventIdFor(0), message.EventId);
            Assert.IsFalse(buffer.Live);
        }
        public void adding_read_message_in_correct_order()
        {
            var buffer = new StreamBuffer(10, 10, -1, true);
            var id     = Guid.NewGuid();

            buffer.AddReadMessage(BuildMessageAt(id, 0));
            Assert.AreEqual(1, buffer.BufferCount);
            OutstandingMessage message = buffer.Scan().First().Message;

            Assert.AreEqual(id, message.EventId);
            Assert.IsFalse(buffer.Live);
        }
        public override ConsumerPushResult PushMessageToClient(OutstandingMessage message)
        {
            for (int i = 0; i < Clients.Count; i++)
            {
                if (Clients.Peek().Push(message))
                {
                    return(ConsumerPushResult.Sent);
                }

                var c = Clients.Dequeue();
                Clients.Enqueue(c);
            }

            return(ConsumerPushResult.NoMoreCapacity);
        }
        public virtual ConsumerPushResult PushMessageToClient(OutstandingMessage message)
        {
            for (int i = 0; i < Clients.Count; i++)
            {
                var c      = Clients.Dequeue();
                var pushed = c.Push(message);
                Clients.Enqueue(c);
                if (pushed)
                {
                    return(ConsumerPushResult.Sent);
                }
            }

            return(ConsumerPushResult.NoMoreCapacity);
        }