исключение java.nio.BufferOverflowException, несмотря на buffer.clear()

#java #sockets #memcached #socketchannel

#java #сокеты #memcached #socketchannel

Вопрос:

Я внедряю промежуточное программное обеспечение между клиентами memaslap эталонного теста и memcached сервером. Размер ключа установлен равным 16 байтам, а размер значения — 1024 байта, поэтому запрос никогда не должен превышать 2048 байт, что MAX_PACKET_LENGTH в следующем фрагменте кода:

 ByteBuffer buffer = ByteBuffer.allocate(MAX_PACKET_LENGTH);

while(running) {
    try {
        buffer.clear();
        socketChannel.read(buffer);
    } catch (IOException e) {
        e.printStackTrace();
    }
    ....
}
  

Мне очень странно, почему после определенного количества запросов (это никогда не бывает одинаковым) возникает BufferOverflow, несмотря на то, что я делал buffer.clear() раньше.

Кто-нибудь может мне помочь?

Комментарии:

1. Какая строка / метод генерирует исключение? SocketChannel.read() никогда не пытается прочитать больше данных, чем поместилось бы в буфер, поэтому он не будет выдавать BufferOverflowException . Один из способов, которым я предполагаю, что это может произойти, — это если вы изменяете буфер из другого потока во время SocketChannel.read() выполнения.

2. @Jesper ты был прав. Существуют другие потоки, которые изменяют буфер. Отправка дубликата в другой поток решила проблему. спасибо