和解了 netty butebuf释放问题暂时解决不了
前言
我先前写了一个代理软件,纯netty写的使用起来没问题。因为先前看了reacto-netty想要应用一下,结果总是出现bytebuf没有主动释放但是refCnt变成0的问题。
被这个问题折磨一个星期了,解决不了总在我的脑子里挥之不去,记录下来暂时放一放吧等后面有时间在想。
问题描述
数据的正向流程是这样的
data -> AesGcmHandler -> SsProtocolHandler -> ChannelOperationsHandler
其中AesGcmHandler继承自 ByteToMessageCodec 负责解密,他会输出一个新的PooledBytebuf向下游传递
SsProtocolHandler继承自 ReplayingDecoder,他会识别数据流,从中解析出目标ip和端口,识别成功后将自身移除,后续数据流不通过它
ChannelOperationsHandler 是reactor-netty框架内的,他会将数据桥接到内部的FluxReceive中,支持背压,数据会缓存到FluxReceive内部的queue中。
这里我遇到的问题是,上游SsProtocolHandler传递了数据缓冲到FluxReceive中,此时通过断点看出refCnt是1,等到下游consume请求数据时,queue中的数据refCnt变成0了。
为了排查这个问题我将上游传递的Butebuf进行wrap向下传递,queue中存储的数据确实是我wrap后的buf,断点查看这个wrapBuf的release方法发现release方法也没有被调用,但是等到程序执行到从queue中取数时,取出来的wrapBuf的refCnt是0。
我无法找打是在哪里释放的,并且因为netty线程绑定的原因,整个流程是发生在同一个线程上的。
reactory-netty内部逻辑我也做了分析,他只是将数据缓存在queue中,让我最理解不了的点是为什么release方法没有被调用的情况下refCnt数量会减少。
我有点怀疑是netty的bug,也许是他的池化内存有bug,其他暂时没有思路。
问题复现比较随机,但是能够稳定复现,批量发起多次请求的情况下一定可以出现。
这个问题我已经排查了一个星期了,暂时先放弃