This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 9c455bff8e4 [opt](Nereids) do not fallback if nereids failed because
timeout (#39499) (#39722)
9c455bff8e4 is described below
commit 9c455bff8e4433e8ec50ffb2b4211f2796394eab
Author: morrySnow <[email protected]>
AuthorDate: Thu Aug 22 11:21:22 2024 +0800
[opt](Nereids) do not fallback if nereids failed because timeout (#39499)
(#39722)
pick from master #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/SessionVariable.java | 2 +-
.../java/org/apache/doris/qe/StmtExecutor.java | 18 ++++++++++--
.../suites/nereids_p0/test_timeout_fallback.groovy | 33 ++++++++++++++++++++++
5 files changed, 79 insertions(+), 4 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/SessionVariable.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 40a808533f8..ea0c4094243 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -1031,7 +1031,7 @@ public class SessionVariable implements Serializable,
Writable {
public boolean enableNewShuffleHashMethod = true;
@VariableMgr.VarAttr(name = "nereids_timeout_second", needForward = true)
- public int nereidsTimeoutSecond = 5;
+ public int nereidsTimeoutSecond = 30;
@VariableMgr.VarAttr(name = ENABLE_PUSH_DOWN_NO_GROUP_AGG)
public boolean enablePushDownNoGroupAgg = true;
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 7bb4ee6c2af..02450f424c0 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
@@ -126,6 +126,7 @@ import org.apache.doris.mysql.ProxyMysqlChannel;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.StatementContext;
+import org.apache.doris.nereids.exceptions.DoNotFallbackException;
import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.minidump.MinidumpUtils;
@@ -490,8 +491,13 @@ public class StmtExecutor {
MinidumpUtils.saveMinidumpString(context.getMinidump(),
DebugUtil.printId(context.queryId()));
}
// try to fall back to legacy planner
- 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 (e instanceof NereidsException
+ && ((NereidsException) e).getException()
instanceof DoNotFallbackException) {
+ LOG.warn("Analyze failed. {}",
context.getQueryIdentifier(), e);
+ throw new AnalysisException(e.getMessage());
+ }
if (e instanceof NereidsException
&&
!context.getSessionVariable().enableFallbackToOriginalPlanner) {
LOG.warn("Analyze failed. {}",
context.getQueryIdentifier(), e);
@@ -599,6 +605,11 @@ public class StmtExecutor {
syncJournalIfNeeded();
try {
((Command) logicalPlan).run(context, this);
+ } catch (DoNotFallbackException e) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Command({}) process failed.",
originStmt.originStmt, e);
+ }
+ throw new NereidsException("Command(" + originStmt.originStmt
+ ") process failed.", e);
} catch (QueryStateException e) {
LOG.debug("DDL statement(" + originStmt.originStmt + ")
process failed.", e);
context.setState(e.getQueryState());
@@ -631,6 +642,9 @@ public class StmtExecutor {
try {
planner.plan(parsedStmt,
context.getSessionVariable().toThrift());
checkBlockRules();
+ } catch (DoNotFallbackException e) {
+ LOG.warn("Nereids plan query failed:\n{}",
originStmt.originStmt, e);
+ throw new NereidsException("Command(" + originStmt.originStmt
+ ") process failed.", e);
} catch (Exception e) {
LOG.debug("Nereids plan query failed:\n{}",
originStmt.originStmt);
throw new NereidsException(new AnalysisException("Unexpected
exception: " + e.getMessage(), e));
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..52ceda85635
--- /dev/null
+++ b/regression-test/suites/nereids_p0/test_timeout_fallback.groovy
@@ -0,0 +1,33 @@
+// 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"
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]