@Override public Throwable getFailureCause() { return parent.getFailureCause(); }
@Override public String toString() { final long numBuffers; final long numBytes; final boolean finished; final boolean hasReadView; synchronized (buffers) { numBuffers = getTotalNumberOfBuffers(); numBytes = getTotalNumberOfBytes(); finished = isFinished; hasReadView = readView != null; } return String.format( "PipelinedSubpartition [number of buffers: %d (%d bytes), number of buffers in backlog: %d, finished? %s, read view? %s]", numBuffers, numBytes, getBuffersInBacklog(), finished, hasReadView); }
@Override public boolean isReleased() { return isReleased.get() || parent.isReleased(); }
@Override public String toString() { final long numBuffers; final long numBytes; final boolean finished; final boolean hasReadView; synchronized (buffers) { numBuffers = getTotalNumberOfBuffers(); numBytes = getTotalNumberOfBytes(); finished = isFinished; hasReadView = readView != null; } return String.format( "PipelinedSubpartition [number of buffers: %d (%d bytes), finished? %s, read view? %s]", numBuffers, numBytes, finished, hasReadView); }
decreaseBuffersInBacklogUnsafe(bufferConsumer.isBuffer()); updateStatistics(buffer); isAvailableUnsafe(), getBuffersInBacklog(), nextBufferIsEventUnsafe());
private boolean add(BufferConsumer bufferConsumer, boolean finish) { checkNotNull(bufferConsumer); final boolean notifyDataAvailable; synchronized (buffers) { if (isFinished || isReleased) { bufferConsumer.close(); return false; } // Add the bufferConsumer and update the stats buffers.add(bufferConsumer); updateStatistics(bufferConsumer); increaseBuffersInBacklog(bufferConsumer); notifyDataAvailable = shouldNotifyDataAvailable() || finish; isFinished |= finish; } if (notifyDataAvailable) { notifyDataAvailable(); } return true; }
decreaseBuffersInBacklogUnsafe(bufferConsumer.isBuffer()); updateStatistics(buffer); isAvailableUnsafe(), getBuffersInBacklog(), _nextBufferIsEvent());
private boolean add(BufferConsumer bufferConsumer, boolean finish) { checkNotNull(bufferConsumer); synchronized (buffers) { if (isFinished || isReleased) { bufferConsumer.close(); return false; } // Add the bufferConsumer and update the stats buffers.add(bufferConsumer); updateStatistics(bufferConsumer); increaseBuffersInBacklog(bufferConsumer); if (finish) { isFinished = true; flush(); } else { maybeNotifyDataAvailable(); } } return true; }
@Override public void releaseAllResources() { if (isReleased.compareAndSet(false, true)) { // The view doesn't hold any resources and the parent cannot be restarted. Therefore, // it's OK to notify about consumption as well. parent.onConsumedSubpartition(); } }
@Override public Buffer getNextBuffer() { return parent.pollBuffer(); }
subpartitions[i] = new PipelinedSubpartition(i, this);
@Override public boolean add(BufferConsumer bufferConsumer) { return add(bufferConsumer, false); }
@Override public void finish() throws IOException { final Buffer buffer = EventSerializer.toBuffer(EndOfPartitionEvent.INSTANCE); // view reference accessible outside the lock, but assigned inside the locked scope final PipelinedSubpartitionView reader; synchronized (buffers) { if (isFinished || isReleased) { return; } buffers.add(buffer); reader = readView; updateStatistics(buffer); isFinished = true; } LOG.debug("Finished {}.", this); // Notify the listener outside of the synchronized block if (reader != null) { reader.notifyBuffersAvailable(1); } }
decreaseBuffersInBacklogUnsafe(bufferConsumer.isBuffer()); updateStatistics(buffer); isAvailableUnsafe(), getBuffersInBacklog(), nextBufferIsEventUnsafe());
private boolean add(BufferConsumer bufferConsumer, boolean finish) { checkNotNull(bufferConsumer); final boolean notifyDataAvailable; synchronized (buffers) { if (isFinished || isReleased) { bufferConsumer.close(); return false; } // Add the bufferConsumer and update the stats buffers.add(bufferConsumer); updateStatistics(bufferConsumer); increaseBuffersInBacklog(bufferConsumer); notifyDataAvailable = shouldNotifyDataAvailable() || finish; isFinished |= finish; } if (notifyDataAvailable) { notifyDataAvailable(); } return true; }
@Override public void releaseAllResources() { if (isReleased.compareAndSet(false, true)) { // The view doesn't hold any resources and the parent cannot be restarted. Therefore, // it's OK to notify about consumption as well. parent.onConsumedSubpartition(); } }
@Nullable @Override public BufferAndBacklog getNextBuffer() { return parent.pollBuffer(); }
case PIPELINED_BOUNDED: for (int i = 0; i < subpartitions.length; i++) { subpartitions[i] = new PipelinedSubpartition(i, this);
@Override public boolean add(BufferConsumer bufferConsumer) { return add(bufferConsumer, false); }
@Override public boolean add(Buffer buffer) throws IOException { checkNotNull(buffer); // view reference accessible outside the lock, but assigned inside the locked scope final PipelinedSubpartitionView reader; synchronized (buffers) { if (isFinished || isReleased) { return false; } // Add the buffer and update the stats buffers.add(buffer); reader = readView; updateStatistics(buffer); } // Notify the listener outside of the synchronized block if (reader != null) { reader.notifyBuffersAvailable(1); } return true; }