gaoyunhaii commented on a change in pull request #7368: [FLINK-10742][network] Let Netty use Flink's buffers directly in credit-based mode URL: https://github.com/apache/flink/pull/7368#discussion_r388742111
########## File path: flink-runtime/src/test/java/org/apache/flink/runtime/io/network/netty/CreditBasedPartitionRequestClientHandlerTest.java ########## @@ -419,6 +459,99 @@ public void testNotifyCreditAvailableAfterReleased() throws Exception { } } + @Test + public void testChannelReleasedBeforeDecodingBufferResponse() throws Exception { + testChannelReleasedOrRemovedBeforeDecodingBufferResponse(false); + } + + @Test + public void testChannelRemovedBeforeDecodingBufferResponse() throws Exception { + testChannelReleasedOrRemovedBeforeDecodingBufferResponse(true); + } + + @Test + public void testChannelReleasedBeforeReceivingBufferResponse() throws Exception { + testChannelReleasedOrRemovedBeforeReceivingBufferResponse(false); + } + + @Test + public void testChannelRemovedBeforeReceivingBufferResponse() throws Exception { + testChannelReleasedOrRemovedBeforeReceivingBufferResponse(true); + } + + private void testChannelReleasedOrRemovedBeforeDecodingBufferResponse(boolean isRemoved) throws Exception { + int bufferSize = 1024; + + NetworkBufferPool networkBufferPool = new NetworkBufferPool(10, bufferSize, 2); + SingleInputGate inputGate = createSingleInputGate(1); + RemoteInputChannel inputChannel = new InputChannelBuilder() + .setMemorySegmentProvider(networkBufferPool) + .buildRemoteAndSetToGate(inputGate); + inputGate.assignExclusiveSegments(); + + CreditBasedPartitionRequestClientHandler handler = new CreditBasedPartitionRequestClientHandler(); + handler.addInputChannel(inputChannel); + + try { + BufferResponse bufferResponse = createBufferResponse( + TestBufferFactory.createBuffer(bufferSize), + 0, + inputChannel.getInputChannelId(), + 1, + new NetworkBufferAllocator(handler)); + + // Release the channel. + inputGate.close(); + if (isRemoved) { + handler.removeInputChannel(inputChannel); + } + + handler.channelRead(null, bufferResponse); + + assertEquals(0, inputChannel.getNumberOfQueuedBuffers()); + assertNotNull(bufferResponse.getBuffer()); + assertTrue(bufferResponse.getBuffer().isRecycled()); + } finally { + releaseResource(inputGate, networkBufferPool); + } + } + + private void testChannelReleasedOrRemovedBeforeReceivingBufferResponse(boolean isRemoved) throws Exception { + int bufferSize = 1024; + + NetworkBufferPool networkBufferPool = new NetworkBufferPool(10, bufferSize, 2); + SingleInputGate inputGate = createSingleInputGate(1); + RemoteInputChannel inputChannel = new InputChannelBuilder() + .setMemorySegmentProvider(networkBufferPool) + .buildRemoteAndSetToGate(inputGate); + inputGate.assignExclusiveSegments(); + + CreditBasedPartitionRequestClientHandler handler = spy(new CreditBasedPartitionRequestClientHandler()); + handler.addInputChannel(inputChannel); + + try { + // Release the channel. + inputGate.close(); + if (isRemoved) { + handler.removeInputChannel(inputChannel); + } + + BufferResponse bufferResponse = createBufferResponse( + TestBufferFactory.createBuffer(bufferSize), + 0, + inputChannel.getInputChannelId(), + 1, + new NetworkBufferAllocator(handler)); + handler.channelRead(null, bufferResponse); + + assertEquals(0, inputChannel.getNumberOfQueuedBuffers()); + assertNull(bufferResponse.getBuffer()); + verify(handler, times(1)).cancelRequestFor(eq(inputChannel.getInputChannelId())); Review comment: Remove the `spy` usage and use `EmbeddedChannel` instead. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services