Netty 4.0.0.CR3 - LengthFieldBasedFrameDecoder maxFrameLength Exceeds Integer.MAX_VALUE -


so far have been amp'd upgrading netty version 3.5.7.final 4.0.0cr3 until ran final problem during upgrade.... lengthfieldbasedframedecoder. each available constructor requires maxframelength set integer.max_value when running client/server several stack traces (one shown below) state integer.max_value has been exceeded (2147483647). have tried take shot @ configuring maximum channel buffer size digging through channelconfig class in api docs , various other stackoverflow post, still no prevail. know if there missing option can set or way prevent reads being high?

stack trace:

io.netty.handler.codec.toolongframeexception: adjusted frame length exceeds 2147483647: 4156555235 - discarded @ io.netty.handler.codec.lengthfieldbasedframedecoder.fail(lengthfieldbasedframedecoder.java:486) @ io.netty.handler.codec.lengthfieldbasedframedecoder.failifnecessary(lengthfieldbasedframedecoder.java:462) @ io.netty.handler.codec.lengthfieldbasedframedecoder.decode(lengthfieldbasedframedecoder.java:397) @ io.netty.handler.codec.lengthfieldbasedframedecoder.decode(lengthfieldbasedframedecoder.java:352) @ io.netty.handler.codec.bytetomessagedecoder.calldecode(bytetomessagedecoder.java:111) @ io.netty.handler.codec.bytetomessagedecoder.inboundbufferupdated(bytetomessagedecoder.java:69) @ io.netty.channel.channelinboundbytehandleradapter.inboundbufferupdated(channelinboundbytehandleradapter.java:46) @ io.netty.channel.defaultchannelhandlercontext.invokeinboundbufferupdated(defaultchannelhandlercontext.java:1031) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated0(defaultchannelhandlercontext.java:998) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated(defaultchannelhandlercontext.java:978) @ io.netty.handler.timeout.idlestatehandler.inboundbufferupdated(idlestatehandler.java:257) @ io.netty.channel.defaultchannelhandlercontext.invokeinboundbufferupdated(defaultchannelhandlercontext.java:1057) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated0(defaultchannelhandlercontext.java:998) @ io.netty.channel.defaultchannelhandlercontext.fireinboundbufferupdated(defaultchannelhandlercontext.java:978) @ io.netty.channel.defaultchannelpipeline.fireinboundbufferupdated(defaultchannelpipeline.java:828) @ io.netty.channel.nio.abstractniobytechannel$niobyteunsafe.read(abstractniobytechannel.java:118) @ io.netty.channel.nio.nioeventloop.processselectedkey(nioeventloop.java:429) @ io.netty.channel.nio.nioeventloop.processselectedkeys(nioeventloop.java:392) @ io.netty.channel.nio.nioeventloop.run(nioeventloop.java:322) @ io.netty.util.concurrent.singlethreadeventexecutor$2.run(singlethreadeventexecutor.java:114) @ java.lang.thread.run(thread.java:680) 

my client configured followed:

peerclient.bootstrap = new bootstrap();  peerclient.bootstrap.group(new nioeventloopgroup())           .channel(niosocketchannel.class)           .option(channeloption.allocator, unpooledbytebufallocator.default)           .option(channeloption.connect_timeout_millis, 120000)           .option(channeloption.so_keepalive, true)           .option(channeloption.tcp_nodelay, true)           .option(channeloption.so_reuseaddr, true)           .handler(peerinitializer.newinstance()); 

my server configuration:

result.serverbootstrap = new serverbootstrap();  result.serverbootstrap.group(new nioeventloopgroup(), new nioeventloopgroup())       .channel(nioserversocketchannel.class)       .handler(new logginghandler(loglevel.info))       .childhandler(peerinitializer.newinstance())       .childoption(channeloption.allocator, unpooledbytebufallocator.default); 

the initchannel method overridden custom class extending channelinitializer

public class peerinitializer extends channelinitializer<socketchannel>  @override protected void initchannel(socketchannel ch) throws exception {     final channelpipeline pipeline = ch.pipeline();      pipeline.addlast(             messageencoder,             handshakedecoder.newinstance(),             connectionhandler,             handshakehandler,             new lengthfieldbasedframedecoder(integer.max_value, 0, 4),             messagehandler); } 

in netty, converting 4 bytes length field unsigned int(actually long)

lengthfieldbasedframedecoder.java

private long getframelength(bytebuf in, int actuallengthfieldoffset) {     in = in.order(byteorder);     long framelength;     switch (lengthfieldlength) {     case 1:         framelength = in.getunsignedbyte(actuallengthfieldoffset);         break;     case 2:         framelength = in.getunsignedshort(actuallengthfieldoffset);         break;     case 3:         framelength = in.getunsignedmedium(actuallengthfieldoffset);         break;     // code     case 4:         framelength = in.getunsignedint(actuallengthfieldoffset);         break;     case 8:         framelength = in.getlong(actuallengthfieldoffset);         break;     default:         throw new error("should not reach here");     }     return framelength; } 

abstractbytebuf.java

@override public long getunsignedint(int index) {     return getint(index) & 0xffffffffl; } 

4156555235 -138412061.

code:

int = 0xf7bfffe3; system.out.println(i); 

check value of length field.

try this:

your channelinitializer

public class peerinitializer extends channelinitializer<socketchannel>  @override protected void initchannel(socketchannel ch) throws exception {     final channelpipeline pipeline = ch.pipeline();      pipeline.addlast(             new bytelogginghandler(loglevel.info), // add             messageencoder,             handshakedecoder.newinstance(),             connectionhandler,             handshakehandler,             new lengthfieldbasedframedecoder(integer.max_value, 0, 4),             messagehandler); } 

hope helps.


Comments