private void runBackgroundTask() { updatePublisherLimit(); logBuffer.cleanPartitions(); }
public Subscription( AtomicPosition position, AtomicPosition limit, int id, String name, ActorCondition onConsumption, LogBuffer logBuffer, Metric fragmentsConsumedMetric) { this.position = position; this.id = id; this.name = name; this.limit = limit; this.logBuffer = logBuffer; this.dataConsumed = onConsumption; this.fragmentsConsumedMetric = fragmentsConsumedMetric; // required so that a subscription can freely modify position and limit of the raw buffer this.rawDispatcherBufferView = logBuffer.createRawBufferView(); }
public LogBufferPartition getPartition(int id) { return partitions[id % getPartitionCount()]; }
final long limit = publisherLimit.get(); final int activePartitionId = logBuffer.getActivePartitionIdVolatile(); final LogBufferPartition partition = logBuffer.getPartition(activePartitionId);
final int partitionOffset = partitionOffset(currentPosition); final LogBufferPartition partition = logBuffer.getPartition(partitionId);
public Dispatcher( LogBuffer logBuffer, LogBufferAppender logAppender, AtomicPosition publisherLimit, AtomicPosition publisherPosition, int logWindowLength, String[] subscriptionNames, int mode, String name, MetricsManager metricsManager) { this.logBuffer = logBuffer; this.logAppender = logAppender; this.publisherLimit = publisherLimit; this.publisherPosition = publisherPosition; this.logWindowLength = logWindowLength; this.mode = mode; this.name = name; this.metricsManager = metricsManager; this.partitionSize = logBuffer.getPartitionSize(); this.maxFrameLength = partitionSize / 16; this.subscriptions = new Subscription[0]; this.defaultSubscriptionNames = subscriptionNames; }
@Override protected void onActorClosing() { publisherLimit.reset(); publisherPosition.reset(); final Subscription[] subscriptionsCopy = Arrays.copyOf(subscriptions, subscriptions.length); for (Subscription subscription : subscriptionsCopy) { doCloseSubscription(subscription); } logBuffer.close(); isClosed = true; }
protected long updatePublisherPosition(final int activePartitionId, int newOffset) { long newPosition = -1; if (newOffset > 0) { newPosition = position(activePartitionId, newOffset); } else if (newOffset == RESULT_PADDING_AT_END_OF_PARTITION) { logBuffer.onActiveParitionFilled(activePartitionId); newPosition = -2; } return newPosition; }
protected Subscription newSubscription( final int subscriptionId, final String subscriptionName, ActorCondition onConsumption) { final AtomicPosition position = new AtomicPosition(); position.set(position(logBuffer.getActivePartitionIdVolatile(), 0)); final AtomicPosition limit = determineLimit(subscriptionId); final Metric fragmentsRead = metricsManager .newMetric("buffer_fragments_read") .type("counter") .label("subscription", subscriptionName) .label("buffer", getName()) .create(); return new Subscription( position, limit, subscriptionId, subscriptionName, onConsumption, logBuffer, fragmentsRead); }
final LogBuffer logBuffer = new LogBuffer(allocatedBuffer, partitionSize, initialPartitionId); final LogBufferAppender logAppender = new LogBufferAppender();
final long limit = publisherLimit.get(); final int activePartitionId = logBuffer.getActivePartitionIdVolatile(); final LogBufferPartition partition = logBuffer.getPartition(activePartitionId);
final int partitionOffset = partitionOffset(currentPosition); final LogBufferPartition partition = logBuffer.getPartition(partitionId);
public Dispatcher( LogBuffer logBuffer, LogBufferAppender logAppender, AtomicPosition publisherLimit, AtomicPosition publisherPosition, int logWindowLength, String[] subscriptionNames, int mode, String name, MetricsManager metricsManager) { this.logBuffer = logBuffer; this.logAppender = logAppender; this.publisherLimit = publisherLimit; this.publisherPosition = publisherPosition; this.logWindowLength = logWindowLength; this.mode = mode; this.name = name; this.metricsManager = metricsManager; this.partitionSize = logBuffer.getPartitionSize(); this.maxFrameLength = partitionSize / 16; this.subscriptions = new Subscription[0]; this.defaultSubscriptionNames = subscriptionNames; }
@Override protected void onActorClosing() { publisherLimit.reset(); publisherPosition.reset(); final Subscription[] subscriptionsCopy = Arrays.copyOf(subscriptions, subscriptions.length); for (Subscription subscription : subscriptionsCopy) { doCloseSubscription(subscription); } logBuffer.close(); isClosed = true; }
protected long updatePublisherPosition(final int activePartitionId, int newOffset) { long newPosition = -1; if (newOffset > 0) { newPosition = position(activePartitionId, newOffset); } else if (newOffset == RESULT_PADDING_AT_END_OF_PARTITION) { logBuffer.onActiveParitionFilled(activePartitionId); newPosition = -2; } return newPosition; }
protected Subscription newSubscription( final int subscriptionId, final String subscriptionName, ActorCondition onConsumption) { final AtomicPosition position = new AtomicPosition(); position.set(position(logBuffer.getActivePartitionIdVolatile(), 0)); final AtomicPosition limit = determineLimit(subscriptionId); final Metric fragmentsRead = metricsManager .newMetric("buffer_fragments_read") .type("counter") .label("subscription", subscriptionName) .label("buffer", getName()) .create(); return new Subscription( position, limit, subscriptionId, subscriptionName, onConsumption, logBuffer, fragmentsRead); }
final LogBuffer logBuffer = new LogBuffer(allocatedBuffer, partitionSize, initialPartitionId); final LogBufferAppender logAppender = new LogBufferAppender();
final long limit = publisherLimit.get(); final int activePartitionId = logBuffer.getActivePartitionIdVolatile(); final LogBufferPartition partition = logBuffer.getPartition(activePartitionId);
/** * Read fragments from the buffer and invoke the given handler for each fragment. Consume the * fragments (i.e. update the subscription position) after all fragments are handled. * * <p>Note that the handler is not aware of fragment batches. * * @return the amount of read fragments */ public int poll(FragmentHandler frgHandler, int maxNumOfFragments) { int fragmentsRead = 0; if (!isClosed) { final long currentPosition = position.get(); final long limit = getLimit(); if (limit > currentPosition) { final int partitionId = partitionId(currentPosition); final int partitionOffset = partitionOffset(currentPosition); final LogBufferPartition partition = logBuffer.getPartition(partitionId); fragmentsRead = pollFragments( partition, frgHandler, partitionId, partitionOffset, maxNumOfFragments, limit, false); } } return fragmentsRead; }
public LogBufferPartition getPartition(int id) { return partitions[id % getPartitionCount()]; }