Я использую 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 и переделать логику контрольных точек ...
Это должно быть зарегистрировано как проблема в github https://github.com/netty/netty/issues. Его очень легко создать. – Abe
Не могли бы вы открыть bugreport или еще лучше предоставить исправление;) –
Спасибо, я постараюсь добавить билет в github. Я не уверен, что был достаточно глубоким в коде Netty, чтобы внести свой вклад ... возможно, когда-нибудь! – RenaudBlue