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

ptupitsyn 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 54b4317d73 IGNITE-19143 Fix memory leak in ClientInboundMessageHandler 
(#1852)
54b4317d73 is described below

commit 54b4317d738a1ee7c91b2f128a38d3fdd90ddb14
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Wed Mar 29 07:31:25 2023 +0300

    IGNITE-19143 Fix memory leak in ClientInboundMessageHandler (#1852)
    
    `this::onPartitionAssignmentChanged` allocates a new delegate object, so 
`removeAssignmentsChangeListener` did not work. Store the delegate in a field 
and use the same object to unsubscribe.
---
 .../ignite/client/handler/ClientInboundMessageHandler.java       | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
index 392e8f6215..76c59e5178 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
@@ -32,6 +32,7 @@ import java.util.BitSet;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 import javax.net.ssl.SSLException;
 import org.apache.ignite.client.handler.configuration.ClientConnectorView;
 import 
org.apache.ignite.client.handler.requests.cluster.ClientClusterGetNodesRequest;
@@ -145,6 +146,9 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter {
     /** Whether the partition assignment has changed since the last server 
response. */
     private final AtomicBoolean partitionAssignmentChanged = new 
AtomicBoolean();
 
+    /** Partition assignment change listener. */
+    private final Consumer<IgniteTablesInternal> 
partitionAssignmentsChangeListener;
+
     /**
      * Constructor.
      *
@@ -190,7 +194,8 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter {
         jdbcQueryEventHandler = new JdbcQueryEventHandlerImpl(processor, new 
JdbcMetadataCatalog(igniteTables), resources);
         jdbcQueryCursorHandler = new JdbcQueryCursorHandlerImpl(resources);
 
-        
igniteTables.addAssignmentsChangeListener(this::onPartitionAssignmentChanged);
+        this.partitionAssignmentsChangeListener = 
this::onPartitionAssignmentChanged;
+        
igniteTables.addAssignmentsChangeListener(partitionAssignmentsChangeListener);
     }
 
     /** {@inheritDoc} */
@@ -218,7 +223,7 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter {
     @Override
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         resources.close();
-        
igniteTables.removeAssignmentsChangeListener(this::onPartitionAssignmentChanged);
+        
igniteTables.removeAssignmentsChangeListener(partitionAssignmentsChangeListener);
 
         super.channelInactive(ctx);
     }

Reply via email to