public void decRef() { if (0 == --refCount) { state = State.INACTIVE; final long producerPosition = producerPosition(); if (publisherLimit.get() > producerPosition) { publisherLimit.setOrdered(producerPosition); } LogBufferDescriptor.endOfStreamPosition(metaDataBuffer, producerPosition); } }
/** * Update the publishers limit for flow control as part of the conductor duty cycle. * * @return 1 if the limit has been updated otherwise 0. */ final int updatePublisherLimit() { int workCount = 0; final long senderPosition = this.senderPosition.getVolatile(); if (hasReceivers || (spiesSimulateConnection && spyPositions.length > 0)) { long minConsumerPosition = senderPosition; for (final ReadablePosition spyPosition : spyPositions) { minConsumerPosition = Math.min(minConsumerPosition, spyPosition.getVolatile()); } final long proposedPublisherLimit = minConsumerPosition + termWindowLength; if (publisherLimit.proposeMaxOrdered(proposedPublisherLimit)) { cleanBuffer(proposedPublisherLimit); workCount = 1; } } else if (publisherLimit.get() > senderPosition) { publisherLimit.setOrdered(senderPosition); } return workCount; }
/** * The counter id for the subscriber position counter. * * @return the id for the subscriber position counter. */ public int subscriberPositionId() { return subscriberPosition.id(); }
/** * To be called from the {@link Receiver} to see if a image should be retained. * * @param nowNs current time to check against for activity. * @return true if the image should be retained otherwise false. */ boolean hasActivityAndNotEndOfStream(final long nowNs) { boolean isActive = true; if (((lastPacketTimestampNs + imageLivenessTimeoutNs) - nowNs < 0) || (isEndOfStream && rebuildPosition.getVolatile() >= hwmPosition.get())) { isActive = false; } return isActive; }
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; } } }
/** * 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); } }
final long rebuildPosition = Math.max(this.rebuildPosition.get(), maxSubscriberPosition); final long hwmPosition = this.hwmPosition.getVolatile(); this.rebuildPosition.proposeMaxOrdered(newRebuildPosition);
/** * The position up to which the current stream rebuild is complete for reception. * * @return the position up to which the current stream rebuild is complete for reception. */ long rebuildPosition() { return rebuildPosition.get(); }
publisherPos.setOrdered(producerPosition); if (!isExclusive) checkForBlockedPublisher(producerPosition, senderPosition.getVolatile(), timeNs); publisherPos.setOrdered(producerPosition); final long senderPosition = this.senderPosition.getVolatile(); if (producerPosition > senderPosition)
private void linkMatchingImages(final SubscriptionLink subscription) { final long registrationId = subscription.registrationId(); final int streamId = subscription.streamId(); final String channel = subscription.channel(); for (int i = 0, size = publicationImages.size(); i < size; i++) { final PublicationImage image = publicationImages.get(i); if (subscription.matches(image) && image.isAcceptingSubscriptions()) { final long rebuildPosition = image.rebuildPosition(); final int sessionId = image.sessionId(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, registrationId, sessionId, streamId, channel, rebuildPosition); position.setOrdered(rebuildPosition); image.addSubscriber(position); subscription.link(image, position); clientProxy.onAvailableImage( image.correlationId(), streamId, sessionId, registrationId, position.id(), image.rawLog().fileName(), generateSourceIdentity(image.sourceAddress())); } } }
long consumerPosition() { return senderPosition.getVolatile(); } }
hwmPosition.proposeMaxOrdered(proposedPosition);
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; } } }
@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)); }
final long rebuildPosition = Math.max(this.rebuildPosition.get(), maxSubscriberPosition); final long hwmPosition = this.hwmPosition.getVolatile(); this.rebuildPosition.proposeMaxOrdered(newRebuildPosition);
/** * The position this {@link Image} has been consumed to by the subscriber. * * @return the position this {@link Image} has been consumed to by the subscriber. */ public long position() { if (isClosed) { return finalPosition; } return subscriberPosition.get(); }
/** * To be called from the {@link Receiver} to see if a image should be retained. * * @param nowNs current time to check against for activity. * @return true if the image should be retained otherwise false. */ boolean hasActivityAndNotEndOfStream(final long nowNs) { boolean isActive = true; if (((lastPacketTimestampNs + imageLivenessTimeoutNs) - nowNs < 0) || (isEndOfStream && rebuildPosition.getVolatile() >= hwmPosition.get())) { isActive = false; } return isActive; }
publisherPos.setOrdered(producerPosition); if (!isExclusive) checkForBlockedPublisher(producerPosition, senderPosition.getVolatile(), timeNs); publisherPos.setOrdered(producerPosition); final long senderPosition = this.senderPosition.getVolatile(); if (producerPosition > senderPosition)
private void linkMatchingImages(final SubscriptionLink subscription) { final long registrationId = subscription.registrationId(); final int streamId = subscription.streamId(); final String channel = subscription.channel(); for (int i = 0, size = publicationImages.size(); i < size; i++) { final PublicationImage image = publicationImages.get(i); if (subscription.matches(image) && image.isAcceptingSubscriptions()) { final long rebuildPosition = image.rebuildPosition(); final int sessionId = image.sessionId(); final Position position = SubscriberPos.allocate( tempBuffer, countersManager, registrationId, sessionId, streamId, channel, rebuildPosition); position.setOrdered(rebuildPosition); image.addSubscriber(position); subscription.link(image, position); clientProxy.onAvailableImage( image.correlationId(), streamId, sessionId, registrationId, position.id(), image.rawLog().fileName(), generateSourceIdentity(image.sourceAddress())); } } }