ibessonov commented on code in PR #6323: URL: https://github.com/apache/ignite-3/pull/6323#discussion_r2231350582
########## modules/network/src/main/java/org/apache/ignite/internal/network/netty/OutboundEncoder.java: ########## @@ -170,34 +288,57 @@ public ByteBuf readChunk(ByteBufAllocator allocator) { writer.setBuffer(byteBuffer); - while (byteBuffer.hasRemaining()) { + writeMessages(); + + buffer.writerIndex(byteBuffer.position() - initialPosition); + + // Do not hold a reference, might help GC to do its job better. + writer.setBuffer(EMPTY_BYTE_BUFFER); + + return buffer; + } + + /** + * Tries to write as many messages from {@link #state} as possible, until either buffer exhaustion or messages exhaustion. + */ + private void writeMessages() { + while (true) { if (!descriptorsFinished) { descriptorsFinished = descriptorSerializer.writeMessage(descriptors, writer); - if (descriptorsFinished) { - for (ClassDescriptorMessage classDescriptorMessage : descriptors.messages()) { - serializationService.addSentDescriptor(classDescriptorMessage.descriptorId()); - } - writer.reset(); - } else { - break; + if (!descriptorsFinished) { + return; } - } else { - finished = serializer.writeMessage(msg, writer); - if (finished) { - writer.reset(); + for (ClassDescriptorMessage classDescriptorMessage : descriptors.messages()) { + serializationService.addSentDescriptor(classDescriptorMessage.descriptorId()); } - break; + writer.reset(); } - } - buffer.writerIndex(byteBuffer.position() - initialPosition); + boolean messageFinished = serializer.writeMessage(msg, writer); + if (!messageFinished) { + return; + } - // Do not hold a reference, might help GC to do its job better. - writer.setBuffer(EMPTY_BYTE_BUFFER); + writer.reset(); - return buffer; + cleanupMessage(); + currentMessageIndex++; + + // Message is successfully written, now we must check if there's another message in our chunk. + while (true) { + ChunkState curState = state.get(); + + if (currentMessageIndex < curState.size) { + prepareMessage(curState.messages[currentMessageIndex]); + + break; Review Comment: Everything is guaranteed by our invariants, arrays length can't be smaller than the `size` value -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org