java - LEAK: ByteBuf.release() was not called in before it's garbage-collected. Spring Reactor TcpServer -
i using reactor-core [1.1.0.release] , reactor-net [1.1.0.release] using netty-all [4.0.18.final], reactor-spring-context [1.1.0.release] & spring reactor tcpserver [spring 4.0.3.release].
i have created simple rest api in netty health check: /health
. have followed gs-reactor-thumbnailer code
please see code follows:
import io.netty.handler.codec.http.defaultfullhttpresponse; import io.netty.handler.codec.http.fullhttprequest; import io.netty.handler.codec.http.fullhttpresponse; import io.netty.handler.codec.http.httpheaders; import io.netty.handler.codec.http.httpmethod; import io.netty.handler.codec.http.httpresponsestatus; import io.netty.handler.codec.http.httpversion; import org.springframework.stereotype.service; import reactor.function.consumer; import reactor.net.netchannel; @service public class healthchecknettyrestapi{ public consumer<fullhttprequest> getresponse(netchannel<fullhttprequest, fullhttpresponse> channel,int portnumber){ return req -> { if (req.getmethod() != httpmethod.get) { channel.send(badrequest(req.getmethod() + " not supported uri")); } else { defaultfullhttpresponse resp = new defaultfullhttpresponse( httpversion.http_1_1, httpresponsestatus.ok); resp.content().writebytes("hello world".getbytes()); resp.headers().set(httpheaders.names.content_type, "text/plain"); resp.headers().set(httpheaders.names.content_length,resp.content().readablebytes()); //resp.release(); channel.send((resp)); } }; } }
in spring boot application wiring as:
@bean public serversocketoptions serversocketoptions(){ return new nettyserversocketoptions(). pipelineconfigurer(pipeline -> pipeline.addlast(new httpservercodec()). addlast(new httpobjectaggregator(16*1024*1024))); } @autowired private healthchecknettyrestapi healthcheck; @value("${netty.port:5555}") private integer nettyport; @bean public netserver<fullhttprequest, fullhttpresponse> restapi(environment env,serversocketoptions opts) throws interruptedexception{ netserver<fullhttprequest, fullhttpresponse> server = new tcpserverspec<fullhttprequest, fullhttpresponse>(nettytcpserver.class) .env(env) .dispatcher("sync") .options(opts) .listen(nettyport) .consume(ch -> { stream<fullhttprequest> in = ch.in(); log.info("netty server humming....."); in.filter( (fullhttprequest req) -> (req.geturi().matches(nettyrestconstants.health_check))) .when(throwable.class, nettyhttpsupport.errorhandler(ch)) .consume(healthcheck.getresponse(ch, nettyport)); }).get(); server.start().await(); //this working tomcat deployed due spring jpa & web dependencies return server; }
when running benchmark using wrk:
wrk -t6 -c100 -d30s --latency 'http://localhost:8087/health'
then getting following stack trace:
2015-04-22 17:23:21.072] - 16497 error [reactor-tcp-io-22] --- i.n.u.resourceleakdetector: leak: bytebuf.release() not called before it's garbage-collected. enable advanced leak reporting find out leak occurred. enable advanced leak reporting, specify jvm option '-dio.netty.leakdetectionlevel=advanced' or call resourceleakdetector.setlevel() 2015-04-22 23:09:26.354 error 4308 --- [actor-tcp-io-13] io.netty.util.resourceleakdetector : leak: bytebuf.release() not called before it's garbage-collected. recent access records: 0 created at: io.netty.buffer.compositebytebuf.<init>(compositebytebuf.java:59) io.netty.buffer.unpooled.compositebuffer(unpooled.java:355) io.netty.handler.codec.http.httpobjectaggregator.decode(httpobjectaggregator.java:144) io.netty.handler.codec.http.httpobjectaggregator.decode(httpobjectaggregator.java:49) io.netty.handler.codec.messagetomessagedecoder.channelread(messagetomessagedecoder.java:89) io.netty.channel.defaultchannelhandlercontext.invokechannelread(defaultchannelhandlercontext.java:341) io.netty.channel.defaultchannelhandlercontext.firechannelread(defaultchannelhandlercontext.java:327) io.netty.handler.codec.bytetomessagedecoder.channelread(bytetomessagedecoder.java:155) io.netty.channel.combinedchannelduplexhandler.channelread(combinedchannelduplexhandler.java:148) io.netty.channel.defaultchannelhandlercontext.invokechannelread(defaultchannelhandlercontext.java:341) io.netty.channel.defaultchannelhandlercontext.firechannelread(defaultchannelhandlercontext.java:327) io.netty.channel.defaultchannelpipeline.firechannelread(defaultchannelpipeline.java:785) io.netty.channel.nio.abstractniobytechannel$niobyteunsafe.read(abstractniobytechannel.java:116) io.netty.channel.nio.nioeventloop.processselectedkey(nioeventloop.java:494) io.netty.channel.nio.nioeventloop.processselectedkeysoptimized(nioeventloop.java:461) io.netty.channel.nio.nioeventloop.processselectedkeys(nioeventloop.java:378) io.netty.channel.nio.nioeventloop.run(nioeventloop.java:350) io.netty.util.concurrent.singlethreadeventexecutor$2.run(singlethreadeventexecutor.java:116) java.lang.thread.run(thread.java:745) 2015-04-22 23:09:55.217 info 4308 --- [actor-tcp-io-13] r.n.netty.nettynetchannelinboundhandler : [id: 0x260faf6d, /127.0.0.1:50275 => /127.0.0.1:8087] connection reset peer 2015-04-22 23:09:55.219 error 4308 --- [actor-tcp-io-13] reactor.core.reactor : connection reset peer java.io.ioexception: connection reset peer @ sun.nio.ch.filedispatcherimpl.read0(native method) @ sun.nio.ch.socketdispatcher.read(socketdispatcher.java:39) @ sun.nio.ch.ioutil.readintonativebuffer(ioutil.java:223) @ sun.nio.ch.ioutil.read(ioutil.java:192) @ sun.nio.ch.socketchannelimpl.read(socketchannelimpl.java:380) @ io.netty.buffer.unpooledunsafedirectbytebuf.setbytes(unpooledunsafedirectbytebuf.java:446) @ io.netty.buffer.abstractbytebuf.writebytes(abstractbytebuf.java:871) @ io.netty.channel.socket.nio.niosocketchannel.doreadbytes(niosocketchannel.java:224) @ io.netty.channel.nio.abstractniobytechannel$niobyteunsafe.read(abstractniobytechannel.java:108) @ io.netty.channel.nio.nioeventloop.processselectedkey(nioeventloop.java:494) @ io.netty.channel.nio.nioeventloop.processselectedkeysoptimized(nioeventloop.java:461) @ io.netty.channel.nio.nioeventloop.processselectedkeys(nioeventloop.java:378) @ io.netty.channel.nio.nioeventloop.run(nioeventloop.java:350) @ io.netty.util.concurrent.singlethreadeventexecutor$2.run(singlethreadeventexecutor.java:116) @ java.lang.thread.run(thread.java:745)
my analyis: think since forwarding defaultfullhttpresponse
spring implementation, spring apis should take care calling release()
method. btw tried calling release()
method implementation still getting same error.
could 1 tell me wrong implementation?
Comments
Post a Comment