This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new fceb28c6744 [opt](Nereids) do not fallback if nereids failed because
timeout (#39499)
fceb28c6744 is described below
commit fceb28c6744b02b9afae26b2609b0072f3d4324b
Author: morrySnow <[email protected]>
AuthorDate: Wed Aug 21 16:47:49 2024 +0800
[opt](Nereids) do not fallback if nereids failed because timeout (#39499)
since legacy planner will cost more time to plan, fallback will be worse
than throw exception directly
---
.../nereids/exceptions/DoNotFallbackException.java | 27 +++++++++++++
.../nereids/jobs/scheduler/SimpleJobScheduler.java | 3 +-
.../java/org/apache/doris/qe/StmtExecutor.java | 30 ++++++++-------
.../suites/nereids_p0/test_timeout_fallback.groovy | 44 ++++++++++++++++++++++
4 files changed, 90 insertions(+), 14 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/exceptions/DoNotFallbackException.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/exceptions/DoNotFallbackException.java
new file mode 100644
index 00000000000..b6253f52c6b
--- /dev/null
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/exceptions/DoNotFallbackException.java
@@ -0,0 +1,27 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.exceptions;
+
+/**
+ * Exception for can not fall back error in Nereids.
+ */
+public class DoNotFallbackException extends RuntimeException {
+ public DoNotFallbackException(String msg) {
+ super(msg);
+ }
+}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/scheduler/SimpleJobScheduler.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/scheduler/SimpleJobScheduler.java
index ec751bdab2d..32a82127e6d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/scheduler/SimpleJobScheduler.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/scheduler/SimpleJobScheduler.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.jobs.scheduler;
import org.apache.doris.nereids.CascadesContext;
+import org.apache.doris.nereids.exceptions.DoNotFallbackException;
import org.apache.doris.nereids.jobs.Job;
import org.apache.doris.qe.SessionVariable;
@@ -36,7 +37,7 @@ public class SimpleJobScheduler implements JobScheduler {
if (sessionVariable.enableNereidsTimeout
&&
context.getStatementContext().getStopwatch().elapsed(TimeUnit.MILLISECONDS)
> sessionVariable.nereidsTimeoutSecond * 1000L) {
- throw new RuntimeException(
+ throw new DoNotFallbackException(
"Nereids cost too much time ( > " +
sessionVariable.nereidsTimeoutSecond + "s )");
}
Job job = pool.pop();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index b6acf6f1126..08517acdf0c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -144,6 +144,7 @@ import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.PlanProcess;
import org.apache.doris.nereids.StatementContext;
+import org.apache.doris.nereids.exceptions.DoNotFallbackException;
import org.apache.doris.nereids.exceptions.MustFallbackException;
import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
@@ -588,7 +589,10 @@ public class StmtExecutor {
}
}
- public boolean notAllowFallback() {
+ public boolean notAllowFallback(NereidsException e) {
+ if (e.getException() instanceof DoNotFallbackException) {
+ return true;
+ }
if (parsedStmt instanceof LogicalPlanAdapter) {
LogicalPlan logicalPlan = ((LogicalPlanAdapter)
parsedStmt).getLogicalPlan();
return logicalPlan instanceof NotAllowFallback;
@@ -613,12 +617,12 @@ public class StmtExecutor {
}
// try to fall back to legacy planner
if (LOG.isDebugEnabled()) {
- LOG.debug("nereids cannot process statement\n" +
originStmt.originStmt
- + "\n because of " + e.getMessage(), e);
+ LOG.debug("nereids cannot process statement\n{}\n
because of {}",
+ originStmt.originStmt, e.getMessage(), e);
}
- if (notAllowFallback()) {
+ if (e instanceof NereidsException &&
notAllowFallback((NereidsException) e)) {
LOG.warn("Analyze failed. {}",
context.getQueryIdentifier(), e);
- throw ((NereidsException) e).getException();
+ throw new AnalysisException(e.getMessage());
}
if (e instanceof NereidsException
&& !(((NereidsException) e).getException()
instanceof MustFallbackException)
@@ -750,7 +754,7 @@ public class StmtExecutor {
syncJournalIfNeeded();
try {
((Command) logicalPlan).run(context, this);
- } catch (MustFallbackException e) {
+ } catch (MustFallbackException | DoNotFallbackException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Command({}) process failed.",
originStmt.originStmt, e);
}
@@ -799,11 +803,11 @@ public class StmtExecutor {
try {
planner.plan(parsedStmt,
context.getSessionVariable().toThrift());
checkBlockRules();
+ } catch (MustFallbackException | DoNotFallbackException e) {
+ LOG.warn("Nereids plan query failed:\n{}",
originStmt.originStmt, e);
+ throw new NereidsException("Command(" + originStmt.originStmt
+ ") process failed.", e);
} catch (Exception e) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Nereids plan query failed:\n{}",
originStmt.originStmt);
- }
- LOG.info("NereidsException", e);
+ LOG.warn("Nereids plan query failed:\n{}",
originStmt.originStmt, e);
throw new NereidsException(new
AnalysisException(e.getMessage(), e));
}
profile.getSummaryProfile().setQueryPlanFinishTime();
@@ -3584,10 +3588,10 @@ public class StmtExecutor {
}
// try to fall back to legacy planner
if (LOG.isDebugEnabled()) {
- LOG.debug("nereids cannot process statement\n" +
originStmt.originStmt
- + "\n because of " + e.getMessage(), e);
+ LOG.debug("nereids cannot process statement\n{}\n
because of {}",
+ originStmt.originStmt, e.getMessage(), e);
}
- if (notAllowFallback()) {
+ if (e instanceof NereidsException &&
notAllowFallback((NereidsException) e)) {
LOG.warn("Analyze failed. {}",
context.getQueryIdentifier(), e);
throw ((NereidsException) e).getException();
}
diff --git a/regression-test/suites/nereids_p0/test_timeout_fallback.groovy
b/regression-test/suites/nereids_p0/test_timeout_fallback.groovy
new file mode 100644
index 00000000000..084fe9c8a19
--- /dev/null
+++ b/regression-test/suites/nereids_p0/test_timeout_fallback.groovy
@@ -0,0 +1,44 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_timeout_fallback") {
+ sql "set enable_nereids_planner=true"
+ sql "set enable_fallback_to_original_planner=true"
+ sql "set enable_nereids_timeout=true"
+ sql "set nereids_timeout_second=-1"
+
+ test {
+ sql "select 1"
+ exception "Nereids cost too much time"
+ }
+
+ test {
+ sql "explain select 1"
+ exception "Nereids cost too much time"
+ }
+
+ sql "drop table if exists test_timeout_fallback"
+
+ sql """
+ create table test_timeout_fallback (id int) distributed by hash(id)
properties ('replication_num'='1')
+ """
+
+ test {
+ sql "insert into test_timeout_fallback values (1)"
+ exception "Nereids cost too much time"
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]