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

Popular posts from this blog

c++ - No viable overloaded operator for references a map -

java - Custom OutputStreamAppender not run: LOGBACK: No context given for <MYAPPENDER> -

java - Cannot secure connection using TLS -