2012-04-02 47 views
0

我使用Netty 3.3.1.Final来满足我们对自定义服务器的需求。 我们的执行被阻塞在无限循环: org.jboss.netty.buffer.DynamicChannelBuffer.ensureWritableBytes(DynamicChannelBuffer.java:75)Java Netty 3.3.1.Final,DynamicChannelBuffer.java:75,无限循环,一个bug?

走进与debuger代码将显示一个无限循环开始于初始值: minNewCapacity = 2147483647 newCapacity = 256
(二进制1111111111111111111111111111111)
(二进制0000000000000000000000100000000)

原因是< < =操作者将引起newCapacity达到100000000000000000最大值0000000000000,并在下一步newCapacity将永远变为0。

这部分代码缺少文档,所以我不能深入分析,但我想知道这是否是已知问题,如果我可以使用其他版本的netty?

@Override 
    public void ensureWritableBytes(int minWritableBytes) { 
     if (minWritableBytes <= writableBytes()) { 
      return; 
     } 

     int newCapacity; 
     if (capacity() == 0) { 
      newCapacity = 1; 
     } else { 
      newCapacity = capacity(); 
     } 
     int minNewCapacity = writerIndex() + minWritableBytes; 
     //INFINITE LOOP HERE 
     while (newCapacity < minNewCapacity) { 
      newCapacity <<= 1; 
     } 

     ChannelBuffer newBuffer = factory().getBuffer(order(), newCapacity); 
     newBuffer.writeBytes(buffer, 0, writerIndex()); 
     buffer = newBuffer; 
    } 

感谢您的帮助,

雷诺


添加的注释:

这是方法导致minNewCapacity那么高至极似乎并不好,因为它会导致一个巨大的内存缓冲区... org.jboss.netty.ReplayingDecoderBuffer.readableBytes(ReplayingDecoderBuffer.java:301)

public int readableBytes() { 
     if (terminated) { 
      return buffer.readableBytes(); 
     } else { 
      return Integer.MAX_VALUE - buffer.readerIndex(); 
     } 
    } 

添加评论2012/04/13

我终于决定,因为它会导致一些非常奇怪的行为不使用ReplayingDecoder。 特别是,在decode()方法中使用ChannelBuffer参数的mark()和reset()方法看起来不安全。 当我尝试使用buffer.slice()将ChannelBuffer封装在“私有”容器中时,出现异常,例如“Slice不是可重放方法...”。 它不是很复杂,如何扩展FrameDecoder并重新实现检查点逻辑......

+0

这应该作为一个问题记录在github https://github.com/netty/netty/issues这是很容易创建一个。 – Abe 2012-04-03 03:25:07

+0

您能否请开一个错误报告或更好地提供修复;) – 2012-04-04 05:46:05

+0

谢谢我会尝试添加一张票到github。我不确定我是否已经在Netty的代码中做得足够深入......也许有时候! – RenaudBlue 2012-04-13 09:56:27

回答

1

它已经成为一个官方的Bug在Netty API中已经是Patched了。 Tiket here。 感谢Netty的社区!