/** * Set the subscriber position for this {@link Image} to indicate where it has been consumed to. * * @param newPosition for the consumption point. */ public void position(final long newPosition) { if (!isClosed) { validatePosition(newPosition); subscriberPosition.setOrdered(newPosition); } }
public void decRef() { if (0 == --refCount) { state = State.INACTIVE; final long producerPosition = producerPosition(); if (publisherLimit.get() > producerPosition) { publisherLimit.setOrdered(producerPosition); } LogBufferDescriptor.endOfStreamPosition(metaDataBuffer, producerPosition); } }
@Test public void shouldPollNoFragmentsToControlledFragmentHandler() { final Image image = createImage(); final int fragmentsRead = image.controlledPoll(mockControlledFragmentHandler, Integer.MAX_VALUE); assertThat(fragmentsRead, is(0)); verify(position, never()).setOrdered(anyLong()); verify(mockControlledFragmentHandler, never()).onFragment( any(UnsafeBuffer.class), anyInt(), anyInt(), any(Header.class)); }
@Test public void shouldNotReadPastTail() { final int termOffset = 0; final int readOutcome = TermReader.read( termBuffer, termOffset, handler, Integer.MAX_VALUE, header, errorHandler, 0, subscriberPosition); assertThat(readOutcome, is(0)); verify(subscriberPosition, never()).setOrdered(anyLong()); verify(termBuffer).getIntVolatile(0); verify(handler, never()).onFragment(any(), anyInt(), anyInt(), any()); }
@Test public void shouldReportCorrectPositionOnReception() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); final int messages = image.poll(mockFragmentHandler, Integer.MAX_VALUE); assertThat(messages, is(1)); verify(mockFragmentHandler).onFragment( any(UnsafeBuffer.class), eq(HEADER_LENGTH), eq(DATA.length), any(Header.class)); final InOrder inOrder = Mockito.inOrder(position); inOrder.verify(position).setOrdered(initialPosition); inOrder.verify(position).setOrdered(initialPosition + ALIGNED_FRAME_LENGTH); }
@Test public void shouldPollOneFragmentToControlledFragmentHandlerOnContinue() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.CONTINUE); final int fragmentsRead = image.controlledPoll(mockControlledFragmentHandler, Integer.MAX_VALUE); assertThat(fragmentsRead, is(1)); final InOrder inOrder = Mockito.inOrder(position, mockControlledFragmentHandler); inOrder.verify(mockControlledFragmentHandler).onFragment( any(UnsafeBuffer.class), eq(HEADER_LENGTH), eq(DATA.length), any(Header.class)); inOrder.verify(position).setOrdered(initialPosition + ALIGNED_FRAME_LENGTH); }
@Test public void shouldAllowValidPosition() { final Image image = createImage(); final long expectedPosition = TERM_BUFFER_LENGTH - 32; position.setOrdered(expectedPosition); assertThat(image.position(), is(expectedPosition)); image.position(TERM_BUFFER_LENGTH); assertThat(image.position(), is((long)TERM_BUFFER_LENGTH)); }
@Test public void shouldPollOneFragmentToControlledFragmentHandlerOnBreak() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(1)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.BREAK); final int fragmentsRead = image.controlledPoll(mockControlledFragmentHandler, Integer.MAX_VALUE); assertThat(fragmentsRead, is(1)); final InOrder inOrder = Mockito.inOrder(position, mockControlledFragmentHandler); inOrder.verify(mockControlledFragmentHandler).onFragment( any(UnsafeBuffer.class), eq(HEADER_LENGTH), eq(DATA.length), any(Header.class)); inOrder.verify(position).setOrdered(initialPosition + ALIGNED_FRAME_LENGTH); }
@Test public void shouldNotPollOneFragmentToControlledFragmentHandlerOnAbort() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.ABORT); final int fragmentsRead = image.controlledPoll(mockControlledFragmentHandler, Integer.MAX_VALUE); assertThat(fragmentsRead, is(0)); assertThat(image.position(), is(initialPosition)); verify(mockControlledFragmentHandler).onFragment( any(UnsafeBuffer.class), eq(HEADER_LENGTH), eq(DATA.length), any(Header.class)); }
@Test(expected = IllegalArgumentException.class) public void shouldNotAdvancePastEndOfTerm() { final Image image = createImage(); final long expectedPosition = TERM_BUFFER_LENGTH - 32; position.setOrdered(expectedPosition); assertThat(image.position(), is(expectedPosition)); image.position(TERM_BUFFER_LENGTH + 32); }
@Test public void shouldReadOneLimitedMessage() { final int msgLength = 1; final int frameLength = HEADER_LENGTH + msgLength; final int alignedFrameLength = align(frameLength, FRAME_ALIGNMENT); final int termOffset = 0; when(termBuffer.getIntVolatile(anyInt())).thenReturn(frameLength); when(termBuffer.getShort(anyInt())).thenReturn((short)HDR_TYPE_DATA); final int readOutcome = TermReader.read( termBuffer, termOffset, handler, 1, header, errorHandler, 0, subscriberPosition); assertThat(readOutcome, is(1)); final InOrder inOrder = inOrder(termBuffer, handler, subscriberPosition); inOrder.verify(termBuffer).getIntVolatile(0); inOrder.verify(handler).onFragment(eq(termBuffer), eq(HEADER_LENGTH), eq(msgLength), any(Header.class)); inOrder.verify(subscriberPosition).setOrdered(alignedFrameLength); inOrder.verifyNoMoreInteractions(); }
@Test public void shouldPollFragmentsToBoundedControlledFragmentHandlerWithMaxPositionBeforeNextMessage() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); final long maxPosition = initialPosition + ALIGNED_FRAME_LENGTH; position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(1)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.CONTINUE); final int fragmentsRead = image.boundedControlledPoll(mockControlledFragmentHandler, maxPosition, Integer.MAX_VALUE); assertThat(fragmentsRead, is(1)); final InOrder inOrder = Mockito.inOrder(position, mockControlledFragmentHandler); inOrder.verify(mockControlledFragmentHandler).onFragment( any(UnsafeBuffer.class), eq(HEADER_LENGTH), eq(DATA.length), any(Header.class)); inOrder.verify(position).setOrdered(initialPosition + ALIGNED_FRAME_LENGTH); }
@Test public void shouldReadFirstMessage() { final int msgLength = 1; final int frameLength = HEADER_LENGTH + msgLength; final int alignedFrameLength = align(frameLength, FRAME_ALIGNMENT); final int termOffset = 0; when(termBuffer.getIntVolatile(0)).thenReturn(frameLength); when(termBuffer.getShort(typeOffset(0))).thenReturn((short)HDR_TYPE_DATA); final int readOutcome = TermReader.read( termBuffer, termOffset, handler, Integer.MAX_VALUE, header, errorHandler, 0, subscriberPosition); assertThat(readOutcome, is(1)); final InOrder inOrder = inOrder(termBuffer, handler, subscriberPosition); inOrder.verify(termBuffer).getIntVolatile(0); inOrder.verify(handler).onFragment(eq(termBuffer), eq(HEADER_LENGTH), eq(msgLength), any(Header.class)); inOrder.verify(subscriberPosition).setOrdered(alignedFrameLength); }
@Test public void shouldNotReadLastMessageWhenPadding() { final int msgLength = 1; final int frameLength = HEADER_LENGTH + msgLength; final int alignedFrameLength = align(frameLength, FRAME_ALIGNMENT); final int frameOffset = TERM_BUFFER_CAPACITY - alignedFrameLength; when(termBuffer.getIntVolatile(frameOffset)).thenReturn(frameLength); when(termBuffer.getShort(typeOffset(frameOffset))).thenReturn((short)PADDING_FRAME_TYPE); final int readOutcome = TermReader.read( termBuffer, frameOffset, handler, Integer.MAX_VALUE, header, errorHandler, 0, subscriberPosition); assertThat(readOutcome, is(0)); final InOrder inOrder = inOrder(termBuffer, subscriberPosition); inOrder.verify(termBuffer).getIntVolatile(frameOffset); verify(handler, never()).onFragment(any(), anyInt(), anyInt(), any()); inOrder.verify(subscriberPosition).setOrdered(alignedFrameLength); } }
@Test public void shouldReadLastMessage() { final int msgLength = 1; final int frameLength = HEADER_LENGTH + msgLength; final int alignedFrameLength = align(frameLength, FRAME_ALIGNMENT); final int frameOffset = TERM_BUFFER_CAPACITY - alignedFrameLength; when(termBuffer.getIntVolatile(frameOffset)).thenReturn(frameLength); when(termBuffer.getShort(typeOffset(frameOffset))).thenReturn((short)HDR_TYPE_DATA); final int readOutcome = TermReader.read( termBuffer, frameOffset, handler, Integer.MAX_VALUE, header, errorHandler, 0, subscriberPosition); assertThat(readOutcome, is(1)); final InOrder inOrder = inOrder(termBuffer, handler, subscriberPosition); inOrder.verify(termBuffer).getIntVolatile(frameOffset); inOrder.verify(handler).onFragment( eq(termBuffer), eq(frameOffset + HEADER_LENGTH), eq(msgLength), any(Header.class)); inOrder.verify(subscriberPosition).setOrdered(alignedFrameLength); }
@Test public void shouldPollNoFragmentsToBoundedControlledFragmentHandlerWithMaxPositionBeforeInitialPosition() { final long initialPosition = computePosition(INITIAL_TERM_ID, 0, POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); final long maxPosition = initialPosition - HEADER_LENGTH; position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(0)); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(1)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.CONTINUE); final int fragmentsRead = image.boundedControlledPoll(mockControlledFragmentHandler, maxPosition, Integer.MAX_VALUE); assertThat(fragmentsRead, is(0)); assertThat(position.get(), is(initialPosition)); verify(mockControlledFragmentHandler, never()).onFragment( any(UnsafeBuffer.class), anyInt(), anyInt(), any(Header.class)); }
@Test public void shouldPollNoFragmentsToBoundedControlledFragmentHandlerWithInitialOffsetNotZero() { final long initialPosition = computePosition(INITIAL_TERM_ID, offsetForFrame(1), POSITION_BITS_TO_SHIFT, INITIAL_TERM_ID); final long maxPosition = initialPosition + ALIGNED_FRAME_LENGTH; position.setOrdered(initialPosition); final Image image = createImage(); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(1)); insertDataFrame(INITIAL_TERM_ID, offsetForFrame(2)); when(mockControlledFragmentHandler.onFragment(any(DirectBuffer.class), anyInt(), anyInt(), any(Header.class))) .thenReturn(Action.CONTINUE); final int fragmentsRead = image.boundedControlledPoll(mockControlledFragmentHandler, maxPosition, Integer.MAX_VALUE); assertThat(fragmentsRead, is(1)); assertThat(position.get(), is(maxPosition)); verify(mockControlledFragmentHandler).onFragment( any(UnsafeBuffer.class), anyInt(), anyInt(), any(Header.class)); }
public void decRef() { if (0 == --refCount) { state = State.DRAINING; channelEndpoint.decRef(); timeOfLastActivityNs = nanoClock.nanoTime(); final long producerPosition = producerPosition(); if (publisherLimit.get() > producerPosition) { publisherLimit.setOrdered(producerPosition); } endOfStreamPosition(metaDataBuffer, producerPosition); if (senderPosition.getVolatile() >= producerPosition) { isEndOfStream = true; } } }
private Position linkSpy(final NetworkPublication publication, final SubscriptionLink subscription) { final long joinPosition = publication.consumerPosition(); final long subscriberRegistrationId = subscription.registrationId(); final int streamId = publication.streamId(); final int sessionId = publication.sessionId(); final String channel = subscription.channel(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, subscriberRegistrationId, sessionId, streamId, channel, joinPosition); position.setOrdered(joinPosition); publication.addSubscriber(position); subscription.link(publication, position); return position; }
private Position linkIpcSubscription(final IpcPublication publication, final SubscriptionLink subscription) { final long joinPosition = publication.joinPosition(); final long registrationId = subscription.registrationId(); final int sessionId = publication.sessionId(); final int streamId = subscription.streamId(); final String channel = subscription.channel(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, registrationId, sessionId, streamId, channel, joinPosition); position.setOrdered(joinPosition); publication.addSubscriber(position); subscription.link(publication, position); return position; }