fix TcpDecoder memory leak by JoeCqupt · Pull Request #54 · trpc-group/trpc-java
@Test
public void testTcpDecodeIllegalPacket1() {
Codec codec = mock(Codec.class);
doThrow(TRpcException.newFrameException(ErrorCode.TRPC_CLIENT_DECODE_ERR, "the request protocol is not trpc"))
.when(codec).decode(any(), any());
ProtocolConfig protocolConfig = new ProtocolConfig();
// set batchDecoder true
protocolConfig.setBatchDecoder(true);
NettyCodecAdapter nettyCodecAdapter = NettyCodecAdapter.createTcpCodecAdapter(codec, protocolConfig);
ChannelHandler decoder = nettyCodecAdapter.getDecoder();
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
embeddedChannel.pipeline().addLast(decoder);
ByteBuf byteBuf = AbstractByteBufAllocator.DEFAULT.heapBuffer();
byteBuf.writeBytes("testTcpDecodeIllegalPacket1".getBytes(StandardCharsets.UTF_8));
// write illegal packet
EmbeddedChannel tmpEmbeddedChannel = embeddedChannel;
DecoderException decoderException = Assert.assertThrows(DecoderException.class, () -> {
tmpEmbeddedChannel.writeInbound(byteBuf);
});
Assert.assertTrue(decoderException.getCause() instanceof TRpcException);
TRpcException tRpcException = (TRpcException) decoderException.getCause();
Assert.assertEquals(tRpcException.getCode(), ErrorCode.TRPC_CLIENT_DECODE_ERR);
Assert.assertEquals(byteBuf.refCnt(), 0);
}
when TcpDecoder#decode() throw exception . ByteBuf param not released
expect refcnt 0 , actual 1
Solution
when decode excpetion . skip all readable bytes let ByteToMessageDecoder release ByteBuf