use of org.apache.flink.runtime.execution.CancelTaskException in project flink-mirror by flink-ci.
the class LocalInputChannel method getNextBuffer.
@Override
Optional<BufferAndAvailability> getNextBuffer() throws IOException {
checkError();
ResultSubpartitionView subpartitionView = this.subpartitionView;
if (subpartitionView == null) {
// during) it was released during reading the EndOfPartitionEvent (2).
if (isReleased) {
return Optional.empty();
}
// this can happen if the request for the partition was triggered asynchronously
// by the time trigger
// would be good to avoid that, by guaranteeing that the requestPartition() and
// getNextBuffer() always come from the same thread
// we could do that by letting the timer insert a special "requesting channel" into the
// input gate's queue
subpartitionView = checkAndWaitForSubpartitionView();
}
BufferAndBacklog next = subpartitionView.getNextBuffer();
// ignore the empty buffer directly
while (next != null && next.buffer().readableBytes() == 0) {
next.buffer().recycleBuffer();
next = subpartitionView.getNextBuffer();
numBuffersIn.inc();
}
if (next == null) {
if (subpartitionView.isReleased()) {
throw new CancelTaskException("Consumed partition " + subpartitionView + " has been released.");
} else {
return Optional.empty();
}
}
Buffer buffer = next.buffer();
if (buffer instanceof FileRegionBuffer) {
buffer = ((FileRegionBuffer) buffer).readInto(inputGate.getUnpooledSegment());
}
numBytesIn.inc(buffer.getSize());
numBuffersIn.inc();
channelStatePersister.checkForBarrier(buffer);
channelStatePersister.maybePersist(buffer);
NetworkActionsLogger.traceInput("LocalInputChannel#getNextBuffer", buffer, inputGate.getOwningTaskName(), channelInfo, channelStatePersister, next.getSequenceNumber());
return Optional.of(new BufferAndAvailability(buffer, next.getNextDataType(), next.buffersInBacklog(), next.getSequenceNumber()));
}
use of org.apache.flink.runtime.execution.CancelTaskException in project flink-mirror by flink-ci.
the class BufferManager method requestBufferBlocking.
Buffer requestBufferBlocking() throws InterruptedException {
synchronized (bufferQueue) {
Buffer buffer;
while ((buffer = bufferQueue.takeBuffer()) == null) {
if (inputChannel.isReleased()) {
throw new CancelTaskException("Input channel [" + inputChannel.channelInfo + "] has already been released.");
}
if (!isWaitingForFloatingBuffers) {
BufferPool bufferPool = inputChannel.inputGate.getBufferPool();
buffer = bufferPool.requestBuffer();
if (buffer == null && shouldContinueRequest(bufferPool)) {
continue;
}
}
if (buffer != null) {
return buffer;
}
bufferQueue.wait();
}
return buffer;
}
}
use of org.apache.flink.runtime.execution.CancelTaskException in project flink-mirror by flink-ci.
the class LocalInputChannelTest method testGetNextAfterPartitionReleased.
/**
* Tests that reading from a channel when after the partition has been released are handled and
* don't lead to NPEs.
*/
@Test
public void testGetNextAfterPartitionReleased() throws Exception {
ResultSubpartitionView subpartitionView = InputChannelTestUtils.createResultSubpartitionView(false);
TestingResultPartitionManager partitionManager = new TestingResultPartitionManager(subpartitionView);
LocalInputChannel channel = createLocalInputChannel(new SingleInputGateBuilder().build(), partitionManager);
channel.requestSubpartition();
assertFalse(channel.getNextBuffer().isPresent());
// release the subpartition view
subpartitionView.releaseAllResources();
try {
channel.getNextBuffer();
fail("Did not throw expected CancelTaskException");
} catch (CancelTaskException ignored) {
}
channel.releaseAllResources();
assertFalse(channel.getNextBuffer().isPresent());
}
Aggregations