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 <101034200+morrys...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to