This is an automated email from the ASF dual-hosted git repository.

ibessonov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new a9ab2acc04 IGNITE-21309 Avoid potential memory leaks in direct message 
writer (#3065)
a9ab2acc04 is described below

commit a9ab2acc04b21fc51fad6cfddedfb75ac23e2e78
Author: Ivan Bessonov <bessonov...@gmail.com>
AuthorDate: Fri Jan 19 12:58:20 2024 +0300

    IGNITE-21309 Avoid potential memory leaks in direct message writer (#3065)
---
 .../ignite/internal/network/direct/DirectMessageWriter.java  |  7 +++++++
 .../network/direct/stream/DirectByteBufferStreamImplV1.java  | 12 +-----------
 .../ignite/internal/raft/util/OptimizedMarshaller.java       |  8 +++-----
 3 files changed, 11 insertions(+), 16 deletions(-)

diff --git 
a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
 
b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
index 79bfd620e8..88725cafe3 100644
--- 
a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
+++ 
b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
@@ -29,6 +29,7 @@ import 
org.apache.ignite.internal.network.direct.state.DirectMessageState;
 import org.apache.ignite.internal.network.direct.state.DirectMessageStateItem;
 import org.apache.ignite.internal.network.direct.stream.DirectByteBufferStream;
 import 
org.apache.ignite.internal.network.direct.stream.DirectByteBufferStreamImplV1;
+import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.network.NetworkMessage;
 import org.apache.ignite.network.serialization.MessageSerializationRegistry;
 import org.apache.ignite.network.serialization.MessageWriter;
@@ -39,6 +40,9 @@ import org.jetbrains.annotations.Nullable;
  * Message writer implementation.
  */
 public class DirectMessageWriter implements MessageWriter {
+    /** Empty array-based byte buffer. Not read-only. */
+    public static final ByteBuffer EMPTY_BYTE_BUFFER = 
ByteBuffer.wrap(ArrayUtils.BYTE_EMPTY_ARRAY);
+
     /** State. */
     private final DirectMessageState<StateItem> state;
 
@@ -480,6 +484,9 @@ public class DirectMessageWriter implements MessageWriter {
     /** {@inheritDoc} */
     @Override
     public void afterInnerMessageWrite(boolean finished) {
+        // Prevent memory leaks.
+        setBuffer(EMPTY_BYTE_BUFFER);
+
         state.backward(finished);
     }
 
diff --git 
a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
 
b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
index 1014c85241..768909ff26 100644
--- 
a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
+++ 
b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
@@ -2050,17 +2050,7 @@ public class DirectByteBufferStreamImplV1 implements 
DirectByteBufferStream {
                 break;
 
             case MSG:
-                try {
-                    if (val != null) {
-                        writer.beforeInnerMessageWrite();
-                    }
-
-                    writeMessage((NetworkMessage) val, writer);
-                } finally {
-                    if (val != null) {
-                        writer.afterInnerMessageWrite(lastFinished);
-                    }
-                }
+                writeMessage((NetworkMessage) val, writer);
 
                 break;
 
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/util/OptimizedMarshaller.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/util/OptimizedMarshaller.java
index f555679de8..4686d6e01c 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/util/OptimizedMarshaller.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/util/OptimizedMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.raft.util;
 
+import static 
org.apache.ignite.internal.network.direct.DirectMessageWriter.EMPTY_BYTE_BUFFER;
+
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Arrays;
@@ -25,7 +27,6 @@ import 
org.apache.ignite.internal.network.direct.DirectMessageWriter;
 import org.apache.ignite.internal.network.direct.stream.DirectByteBufferStream;
 import 
org.apache.ignite.internal.network.direct.stream.DirectByteBufferStreamImplV1;
 import org.apache.ignite.internal.raft.Marshaller;
-import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.network.NetworkMessage;
 import org.apache.ignite.network.serialization.MessageReader;
 import org.apache.ignite.network.serialization.MessageSerializationRegistry;
@@ -68,9 +69,6 @@ public class OptimizedMarshaller implements Marshaller {
     /** Byte buffer order. */
     public static final ByteOrder ORDER = ByteOrder.LITTLE_ENDIAN;
 
-    /** Empty array-based byte buffer. Not read-only. */
-    private static final ByteBuffer EMPTY_BUFFER = 
ByteBuffer.wrap(ArrayUtils.BYTE_EMPTY_ARRAY);
-
     /** Pool of byte buffers. */
     private final ByteBuffersPool pool;
 
@@ -146,7 +144,7 @@ public class OptimizedMarshaller implements Marshaller {
         }
 
         // Prevent holding the reference for too long.
-        stream.setBuffer(EMPTY_BUFFER);
+        stream.setBuffer(EMPTY_BYTE_BUFFER);
 
         byte[] result = Arrays.copyOf(buffer.array(), buffer.position());
 

Reply via email to