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

Reply via email to