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 <[email protected]>
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());