2012-04-02 1 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, бесконечный цикл, ошибка?

углубляясь в код с 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, потому что это приводит к некоторому очень странному поведению. В частности, похоже, что использовать метод mark() и reset() аргумента ChannelBuffer в методе decode() небезопасно. Когда я попытался использовать buffer.slice(), чтобы обернуть ChannelBuffer в «закрытый» контейнер, я получил исключение, что-то вроде «Slice - это не воспроизводимый метод ...». Это не очень сложно, чтобы расширить FrameDecoder и переделать логику контрольных точек ...

+0

Это должно быть зарегистрировано как проблема в github https://github.com/netty/netty/issues. Его очень легко создать. – Abe

+0

Не могли бы вы открыть bugreport или еще лучше предоставить исправление;) –

+0

Спасибо, я постараюсь добавить билет в github. Я не уверен, что был достаточно глубоким в коде Netty, чтобы внести свой вклад ... возможно, когда-нибудь! – RenaudBlue

ответ

1

Это стало официальной ошибкой в ​​нетто-API с уже запатентованным. Tiket here. Моя благодарность сообществу Netty!