Github user NicoK commented on a diff in the pull request:

    https://github.com/apache/flink/pull/4552#discussion_r161567305
  
    --- Diff: 
flink-runtime/src/test/java/org/apache/flink/runtime/io/network/netty/PartitionRequestQueueTest.java
 ---
    @@ -71,4 +78,142 @@ public void testProducerFailedException() throws 
Exception {
                NettyMessage.ErrorResponse err = (NettyMessage.ErrorResponse) 
msg;
                assertTrue(err.cause instanceof CancelTaskException);
        }
    +
    +   /**
    +    * Tests {@link 
PartitionRequestQueue#enqueueAvailableReader(SequenceNumberingViewReader)},
    +    * verifying the reader would be enqueued in the pipeline if the next 
sending buffer is event, even
    +    * though it has no available credits.
    +    */
    +   @Test
    +   public void testEnqueueReaderByNotifyingEventBuffer() throws Exception {
    +           // setup
    +           final ResultSubpartitionView view = 
mock(ResultSubpartitionView.class);
    +           when(view.nextBufferIsEvent()).thenReturn(true);
    +
    +           final ResultPartitionID partitionId = new ResultPartitionID();
    +           final ResultPartitionProvider partitionProvider = 
mock(ResultPartitionProvider.class);
    +           when(partitionProvider.createSubpartitionView(
    +                   eq(partitionId),
    +                   eq(0),
    +                   
any(BufferAvailabilityListener.class))).thenReturn(view);
    +
    +           final InputChannelID receiverId = new InputChannelID();
    +           final PartitionRequestQueue queue = new PartitionRequestQueue();
    +           final SequenceNumberingViewReader reader = new 
SequenceNumberingViewReader(receiverId, 0, queue);
    +           final EmbeddedChannel channel = new EmbeddedChannel(queue);
    +
    +           reader.requestSubpartitionView(partitionProvider, partitionId, 
0);
    +
    +           // block the channel so that we see an intermediate state in 
the test
    +           ByteBuf channelBlockingBuffer = blockChannel(channel);
    +           assertNull(channel.readOutbound());
    +
    +           // Notify an available event buffer to trigger enqueue the 
reader
    +           reader.notifyBuffersAvailable(1);
    +
    +           channel.runPendingTasks();
    +
    +           // The reader is enqueued in the pipeline because the next 
buffer is an event, even though no credits are available
    +           assertEquals(1, queue.getAvailableReaders().size());
    +           assertEquals(0, reader.getNumCreditsAvailable());
    +
    +           // Flush the buffer to make the channel writable again and see 
the final results
    +           channel.flush();
    +           assertSame(channelBlockingBuffer, channel.readOutbound());
    +
    +           assertEquals(0, queue.getAvailableReaders().size());
    +           assertEquals(0, reader.getNumCreditsAvailable());
    --- End diff --
    
    let's end with `assertNull(channel.readOutbound());`


---

Reply via email to