You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vk...@apache.org on 2022/01/21 17:15:19 UTC

[ignite-3] branch ignite-3.0.0-alpha4 updated: IGNITE-16161 Fix memory leak in BaseQueryContext (#553)

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

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


The following commit(s) were added to refs/heads/ignite-3.0.0-alpha4 by this push:
     new 9e3845a  IGNITE-16161 Fix memory leak in BaseQueryContext (#553)
9e3845a is described below

commit 9e3845ae4f70e1745c9968952624574ae6408ac8
Author: Andrew V. Mashenkov <AM...@users.noreply.github.com>
AuthorDate: Fri Jan 21 16:11:15 2022 +0300

    IGNITE-16161 Fix memory leak in BaseQueryContext (#553)
---
 .../internal/sql/engine/prepare/Fragment.java      |  6 ++--
 .../internal/sql/engine/prepare/QueryTemplate.java | 11 +++++--
 .../internal/sql/engine/util/BaseQueryContext.java | 34 ++++++++++++++++++----
 .../ignite/internal/sql/engine/util/Commons.java   |  4 +++
 4 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/Fragment.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/Fragment.java
index fe1fed2..2df6073 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/Fragment.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/Fragment.java
@@ -22,6 +22,7 @@ import static org.apache.ignite.internal.sql.engine.externalize.RelJsonWriter.to
 import java.util.List;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.function.Supplier;
+import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.ignite.internal.sql.engine.metadata.ColocationMappingException;
@@ -34,7 +35,6 @@ import org.apache.ignite.internal.sql.engine.rel.IgniteReceiver;
 import org.apache.ignite.internal.sql.engine.rel.IgniteRel;
 import org.apache.ignite.internal.sql.engine.rel.IgniteSender;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.tostring.IgniteToStringExclude;
 import org.apache.ignite.internal.tostring.S;
 import org.jetbrains.annotations.NotNull;
@@ -141,8 +141,8 @@ public class Fragment {
         return !(root instanceof IgniteSender);
     }
 
-    public Fragment copy() {
-        return new Cloner(Commons.cluster()).go(this);
+    public Fragment copy(RelOptCluster cluster) {
+        return new Cloner(cluster).go(this);
     }
 
     /**
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/QueryTemplate.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/QueryTemplate.java
index b115855..775bd67 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/QueryTemplate.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/QueryTemplate.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
+import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.ignite.internal.sql.engine.metadata.FragmentMappingException;
 import org.apache.ignite.internal.sql.engine.metadata.MappingService;
@@ -48,10 +49,12 @@ public class QueryTemplate {
      * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
      */
     public QueryTemplate(List<Fragment> fragments) {
-
         List<Fragment> frgs = new ArrayList<>(fragments.size());
+
+        RelOptCluster cluster = Commons.createCluster();
+
         for (Fragment fragment : fragments) {
-            frgs.add(fragment.copy());
+            frgs.add(fragment.copy(cluster));
         }
 
         this.fragments = List.copyOf(frgs);
@@ -67,7 +70,9 @@ public class QueryTemplate {
             return executionPlan;
         }
 
-        List<Fragment> fragments = Commons.transform(this.fragments, Fragment::copy);
+        RelOptCluster cluster = Commons.createCluster();
+
+        List<Fragment> fragments = Commons.transform(this.fragments, fragment -> fragment.copy(cluster));
 
         Exception ex = null;
         RelMetadataQuery mq = first(fragments).root().getCluster().getMetadataQuery();
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
index f217765..8d7d134 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/BaseQueryContext.java
@@ -32,6 +32,7 @@ import org.apache.calcite.jdbc.CalciteSchema;
 import org.apache.calcite.plan.Context;
 import org.apache.calcite.plan.Contexts;
 import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelOptSchema;
 import org.apache.calcite.plan.volcano.VolcanoPlanner;
 import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
@@ -59,13 +60,13 @@ public final class BaseQueryContext extends AbstractQueryContext {
 
     public static final RelOptCluster CLUSTER;
 
-    public static final IgniteTypeFactory TYPE_FACTORY;
+    private static final IgniteTypeFactory TYPE_FACTORY;
 
     private static final IgniteCostFactory COST_FACTORY = new IgniteCostFactory();
 
     private static final BaseQueryContext EMPTY_CONTEXT;
 
-    private static final VolcanoPlanner EMPTY_PLANNER;
+    private static final VolcanoPlanner DUMMY_PLANNER;
 
     private static final RexBuilder DFLT_REX_BUILDER;
 
@@ -83,17 +84,38 @@ public final class BaseQueryContext extends AbstractQueryContext {
 
         EMPTY_CONTEXT = builder().build();
 
-        EMPTY_PLANNER = new VolcanoPlanner(COST_FACTORY, EMPTY_CONTEXT);
+        DUMMY_PLANNER = new VolcanoPlanner(COST_FACTORY, EMPTY_CONTEXT) {
+            @Override
+            public void registerSchema(RelOptSchema schema) {
+                throw new UnsupportedOperationException("Dummy planer. Please use a specific instance.");
+            }
+        };
 
         RelDataTypeSystem typeSys = CALCITE_CONNECTION_CONFIG.typeSystem(RelDataTypeSystem.class, FRAMEWORK_CONFIG.getTypeSystem());
         TYPE_FACTORY = new IgniteTypeFactory(typeSys);
 
         DFLT_REX_BUILDER = new RexBuilder(TYPE_FACTORY);
 
-        CLUSTER = RelOptCluster.create(EMPTY_PLANNER, DFLT_REX_BUILDER);
+        RelOptCluster cluster = RelOptCluster.create(DUMMY_PLANNER, DFLT_REX_BUILDER);
 
-        CLUSTER.setMetadataProvider(new CachingRelMetadataProvider(IgniteMetadata.METADATA_PROVIDER, EMPTY_PLANNER));
-        CLUSTER.setMetadataQuerySupplier(RelMetadataQueryEx::create);
+        cluster.setMetadataProvider(IgniteMetadata.METADATA_PROVIDER);
+
+        CLUSTER = cluster;
+    }
+
+    /**
+     * Creates a new cluster.
+     *
+     * @return New cluster.
+     */
+    public static RelOptCluster createCluster() {
+        RelOptCluster cluster = RelOptCluster.create(new VolcanoPlanner(COST_FACTORY, EMPTY_CONTEXT), DFLT_REX_BUILDER);
+
+        cluster.setMetadataProvider(new CachingRelMetadataProvider(IgniteMetadata.METADATA_PROVIDER,
+                cluster.getPlanner()));
+        cluster.setMetadataQuerySupplier(RelMetadataQueryEx::create);
+
+        return cluster;
     }
 
     private final FrameworkConfig cfg;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index 789f2c6..4b60ea9 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -830,4 +830,8 @@ public final class Commons {
     public static RelOptCluster cluster() {
         return CLUSTER;
     }
+
+    public static RelOptCluster createCluster() {
+        return BaseQueryContext.createCluster();
+    }
 }