CN-GuoZiyang / My-RPC-Framework

一个简单的RPC框架的实现
https://cn-guoziyang.github.io/My-RPC-Framework/
MIT License
802 stars 191 forks source link

NettyServerHandler类的一个不恰当的对btyebuf的引用释放 #2

Open zzzczh opened 3 years ago

zzzczh commented 3 years ago

NettyServerHandler类的channelRead0最后会对msg进行引用释放,这是不正确的。如下打印一下方法返回值可见是false。跟进方法源码会发现因为类型都不对,会直接返回false。

 @Override
    protected void channelRead0(ChannelHandlerContext ctx, RpcRequest msg) throws Exception {
        try {
            if(msg.getHeartBeat()) {
                logger.info("接收到客户端心跳包...");
                return;
            }
            logger.info("服务器接收到请求: {}", msg);
            Object result = requestHandler.handle(msg);
            if (ctx.channel().isActive() && ctx.channel().isWritable()) {
                ctx.writeAndFlush(RpcResponse.success(result, msg.getRequestId()));
            } else {
                logger.error("通道不可写");
            }
        } finally {
            boolean isok = ReferenceCountUtil.release(msg);
            logger.info(String.valueOf(isok));
        }
    }

正确的做法应该是在上一个入站handler即最后使用btyebuf的地方进行释放

zzzczh commented 3 years ago

补充:查看上一个入站handler继承的replaying解码器发现自动释放了bytebuf,所以正确的改法应该是去掉这句释放代码即可。

Poison02 commented 1 year ago

你好,我是初学者,SimpleChannelInboundHandler 这个类本来就会自动释放的吧?原文中finally代码块最后是将引用计数释放了,应该不会有什么问题吧?没有恶意,只是想学习一下!😁