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());