alex-plekhanov commented on code in PR #12595:
URL: https://github.com/apache/ignite/pull/12595#discussion_r2643197254
##########
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/DistributedCalciteConfiguration.java:
##########
@@ -17,14 +17,107 @@
package org.apache.ignite.internal.processors.query.calcite;
+import java.util.Objects;
+import java.util.stream.Stream;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.GridKernalContext;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributePropertyListener;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributedChangeableProperty;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributedPropertyDispatcher;
+import
org.apache.ignite.internal.processors.configuration.distributed.SimpleDistributedProperty;
import org.apache.ignite.internal.processors.query.DistributedSqlConfiguration;
+import
org.apache.ignite.internal.processors.query.calcite.prepare.QueryPlanCache;
+import org.apache.ignite.internal.processors.query.calcite.util.Commons;
+import org.apache.ignite.internal.processors.query.calcite.util.LifecycleAware;
+import org.apache.ignite.internal.processors.query.calcite.util.Service;
+import org.apache.ignite.internal.util.typedef.F;
+
+import static
org.apache.ignite.internal.cluster.DistributedConfigurationUtils.setDefaultValue;
/** Distributed Calcite-engine configuration. */
-public class DistributedCalciteConfiguration extends
DistributedSqlConfiguration {
+public class DistributedCalciteConfiguration extends
DistributedSqlConfiguration implements Service, LifecycleAware {
+ /** Globally disabled rules property name. */
+ public static final String DISABLED_RULES_PROPERTY_NAME =
"sql.calcite.disabledRules";
+
+ /** Default value of the disabled rules. */
+ public static final String[] DFLT_DISABLED_RULES = new String[0];
+
+ /** Globally disabled rules. */
+ private volatile DistributedChangeableProperty<String[]> disabledRules;
+
+ /** */
+ private QueryPlanCache qryPlanCache;
+
/** */
public DistributedCalciteConfiguration(GridKernalContext ctx, IgniteLogger
log) {
super(ctx, log);
}
+
+ /** {@inheritDoc} */
+ @Override public void onStart(GridKernalContext ctx) {
+ CalciteQueryProcessor proc =
Objects.requireNonNull(Commons.lookupComponent(ctx,
CalciteQueryProcessor.class));
+
+ assert proc != null;
+
+ qryPlanCache = proc.queryPlanCache();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void onStop() {
+ // No-op.
+ }
+
+ /**
+ * @return Globally disabled planning rules.
+ * @see #DISABLED_RULES_PROPERTY_NAME
+ */
+ public String[] disabledRules() {
+ DistributedChangeableProperty<String[]> disabledRules =
this.disabledRules;
+
+ String[] res = disabledRules == null ? DFLT_DISABLED_RULES :
disabledRules.get();
+
+ return res != null ? res : DFLT_DISABLED_RULES;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void onReadyToRegister(DistributedPropertyDispatcher
dispatcher) {
+ super.onReadyToRegister(dispatcher);
+
+ registerProperty(
+ dispatcher,
+ DISABLED_RULES_PROPERTY_NAME,
+ prop -> disabledRules = prop,
+ () -> new SimpleDistributedProperty<>(
+ DISABLED_RULES_PROPERTY_NAME,
+ str -> Stream.of(str.split(",")).map(String::trim).filter(s ->
!s.isBlank()).toArray(String[]::new),
+ "Comma-separated list of Calcite's disabled planning rules.
NOTE: cleans the planning cache on cnage."
+ ),
+ log
+ );
+
+ disabledRules.addListener(new DistributePropertyListener<>() {
+ @Override public void onUpdate(String name, String[] oldVal,
String[] newVal) {
+ if (oldVal != null && F.compareArrays(oldVal, newVal) != 0) {
+ log.warning("Cleaning Calcite's cache plan by setting
changing of the property '"
+ + DISABLED_RULES_PROPERTY_NAME + "'.");
+
+ assert qryPlanCache != null;
Review Comment:
Maybe
```
if (qryPlanCache != null)
qryPlanCache.clear();
```
?
I'm afraid about races between query processor start and cluster activation
##########
modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/DistributedCalciteConfiguration.java:
##########
@@ -17,14 +17,107 @@
package org.apache.ignite.internal.processors.query.calcite;
+import java.util.Objects;
+import java.util.stream.Stream;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.GridKernalContext;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributePropertyListener;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributedChangeableProperty;
+import
org.apache.ignite.internal.processors.configuration.distributed.DistributedPropertyDispatcher;
+import
org.apache.ignite.internal.processors.configuration.distributed.SimpleDistributedProperty;
import org.apache.ignite.internal.processors.query.DistributedSqlConfiguration;
+import
org.apache.ignite.internal.processors.query.calcite.prepare.QueryPlanCache;
+import org.apache.ignite.internal.processors.query.calcite.util.Commons;
+import org.apache.ignite.internal.processors.query.calcite.util.LifecycleAware;
+import org.apache.ignite.internal.processors.query.calcite.util.Service;
+import org.apache.ignite.internal.util.typedef.F;
+
+import static
org.apache.ignite.internal.cluster.DistributedConfigurationUtils.setDefaultValue;
/** Distributed Calcite-engine configuration. */
-public class DistributedCalciteConfiguration extends
DistributedSqlConfiguration {
+public class DistributedCalciteConfiguration extends
DistributedSqlConfiguration implements Service, LifecycleAware {
+ /** Globally disabled rules property name. */
+ public static final String DISABLED_RULES_PROPERTY_NAME =
"sql.calcite.disabledRules";
+
+ /** Default value of the disabled rules. */
+ public static final String[] DFLT_DISABLED_RULES = new String[0];
+
+ /** Globally disabled rules. */
+ private volatile DistributedChangeableProperty<String[]> disabledRules;
+
+ /** */
+ private QueryPlanCache qryPlanCache;
+
/** */
public DistributedCalciteConfiguration(GridKernalContext ctx, IgniteLogger
log) {
super(ctx, log);
}
+
+ /** {@inheritDoc} */
+ @Override public void onStart(GridKernalContext ctx) {
+ CalciteQueryProcessor proc =
Objects.requireNonNull(Commons.lookupComponent(ctx,
CalciteQueryProcessor.class));
+
+ assert proc != null;
+
+ qryPlanCache = proc.queryPlanCache();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void onStop() {
+ // No-op.
+ }
+
+ /**
+ * @return Globally disabled planning rules.
+ * @see #DISABLED_RULES_PROPERTY_NAME
+ */
+ public String[] disabledRules() {
+ DistributedChangeableProperty<String[]> disabledRules =
this.disabledRules;
+
+ String[] res = disabledRules == null ? DFLT_DISABLED_RULES :
disabledRules.get();
+
+ return res != null ? res : DFLT_DISABLED_RULES;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void onReadyToRegister(DistributedPropertyDispatcher
dispatcher) {
+ super.onReadyToRegister(dispatcher);
+
+ registerProperty(
+ dispatcher,
+ DISABLED_RULES_PROPERTY_NAME,
+ prop -> disabledRules = prop,
+ () -> new SimpleDistributedProperty<>(
+ DISABLED_RULES_PROPERTY_NAME,
+ str -> Stream.of(str.split(",")).map(String::trim).filter(s ->
!s.isBlank()).toArray(String[]::new),
+ "Comma-separated list of Calcite's disabled planning rules.
NOTE: cleans the planning cache on cnage."
Review Comment:
cnage -> change
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]