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