This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 9a9226e541d [fix](block_rule) SQL block rule not working after FE 
restart (#41228) (#41250)
9a9226e541d is described below

commit 9a9226e541d8cc2b79cd724845ec7a51d3aebea1
Author: zhangdong <493738...@qq.com>
AuthorDate: Sat Sep 28 10:08:59 2024 +0800

    [fix](block_rule) SQL block rule not working after FE restart (#41228) 
(#41250)
    
    pick: https://github.com/apache/doris/pull/41228
---
 .../main/java/org/apache/doris/common/Config.java  |  4 ++++
 .../org/apache/doris/blockrule/SqlBlockRule.java   | 16 ++++++++------
 .../apache/doris/blockrule/SqlBlockRuleMgr.java    |  5 +++++
 .../doris/blockrule/SqlBlockRuleMgrTest.java       | 25 ++++++++++++++++++++++
 4 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java 
b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
index 1f45f5c1218..ca0690e5944 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
@@ -2816,4 +2816,8 @@ public class Config extends ConfigBase {
     @ConfField(mutable = true, description = {"元数据同步是否开启安全模式",
             "Is metadata synchronization enabled in safe mode"})
     public static boolean meta_helper_security_mode = false;
+
+    @ConfField(mutable = true, description = {
+            "设置为 true,如果查询无法选择到健康副本时,会打印出该tablet所有副本的详细信息,"})
+    public static boolean sql_block_rule_ignore_admin = false;
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRule.java 
b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRule.java
index 87d1830a170..41eecf94925 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRule.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.CreateSqlBlockRuleStmt;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
 import org.apache.doris.common.util.SqlBlockUtil;
+import org.apache.doris.persist.gson.GsonPostProcessable;
 import org.apache.doris.persist.gson.GsonUtils;
 
 import com.google.common.collect.Lists;
@@ -37,7 +38,7 @@ import java.util.regex.Pattern;
 /**
  * Use for block some sql by rule.
  **/
-public class SqlBlockRule implements Writable {
+public class SqlBlockRule implements Writable, GsonPostProcessable {
 
     public static final String NAME_TYPE = "SQL BLOCK RULE NAME";
 
@@ -191,11 +192,14 @@ public class SqlBlockRule implements Writable {
      **/
     public static SqlBlockRule read(DataInput in) throws IOException {
         String json = Text.readString(in);
-        SqlBlockRule sqlBlockRule = GsonUtils.GSON.fromJson(json, 
SqlBlockRule.class);
-        if (StringUtils.isNotEmpty(sqlBlockRule.getSql()) && 
!SqlBlockUtil.STRING_DEFAULT.equals(
-                sqlBlockRule.getSql())) {
-            sqlBlockRule.setSqlPattern(Pattern.compile(sqlBlockRule.getSql()));
+        return GsonUtils.GSON.fromJson(json, SqlBlockRule.class);
+    }
+
+    @Override
+    public void gsonPostProcess() {
+        if (StringUtils.isNotEmpty(this.getSql()) && 
!SqlBlockUtil.STRING_DEFAULT.equals(
+                this.getSql())) {
+            this.setSqlPattern(Pattern.compile(this.getSql()));
         }
-        return sqlBlockRule;
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java
index 2eba1d4fae3..13df2eb9377 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/blockrule/SqlBlockRuleMgr.java
@@ -23,12 +23,14 @@ import org.apache.doris.analysis.DropSqlBlockRuleStmt;
 import org.apache.doris.analysis.ShowSqlBlockRuleStmt;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
 import org.apache.doris.common.util.SqlBlockUtil;
 import org.apache.doris.metric.MetricRepo;
+import org.apache.doris.mysql.privilege.Auth;
 import org.apache.doris.persist.gson.GsonUtils;
 import org.apache.doris.qe.ConnectContext;
 
@@ -225,6 +227,9 @@ public class SqlBlockRuleMgr implements Writable {
      * Match SQL according to rules.
      **/
     public void matchSql(String originSql, String sqlHash, String user) throws 
AnalysisException {
+        if (Config.sql_block_rule_ignore_admin && (Auth.ROOT_USER.equals(user) 
|| Auth.ADMIN_USER.equals(user))) {
+            return;
+        }
         if (ConnectContext.get() != null
                 && ConnectContext.get().getSessionVariable().internalSession) {
             return;
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/blockrule/SqlBlockRuleMgrTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/blockrule/SqlBlockRuleMgrTest.java
index 2f93ee5beaa..b1684ef74a0 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/blockrule/SqlBlockRuleMgrTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/blockrule/SqlBlockRuleMgrTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.SetUserPropertyStmt;
 import org.apache.doris.analysis.ShowSqlBlockRuleStmt;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ExceptionChecker;
 import org.apache.doris.metric.MetricRepo;
@@ -303,4 +304,28 @@ public class SqlBlockRuleMgrTest extends TestWithFeService 
{
                 () -> dropSqlBlockRule("DROP SQL_BLOCK_RULE test_rule"));
         dropSqlBlockRule("DROP SQL_BLOCK_RULE if exists test_rule");
     }
+
+    @Test
+    public void testIgnoreAdmin() throws Exception {
+        String sql = "select * from test_table1 limit 10";
+        String sqlHash = DigestUtils.md5Hex(sql);
+        String sqlRule = "CREATE SQL_BLOCK_RULE test_rule 
PROPERTIES(\"sql\"=\"select \\\\* from test_table1\","
+                + " \"global\"=\"true\", \"enable\"=\"true\");";
+        createSqlBlockRule(sqlRule);
+        Config.sql_block_rule_ignore_admin = false;
+        ExceptionChecker.expectThrowsWithMsg(AnalysisException.class,
+                "sql match regex sql block rule: test_rule",
+                () -> mgr.matchSql(sql, sqlHash, "root"));
+        ExceptionChecker.expectThrowsWithMsg(AnalysisException.class,
+                "sql match regex sql block rule: test_rule",
+                () -> mgr.matchSql(sql, sqlHash, "admin"));
+        Config.sql_block_rule_ignore_admin = true;
+        ExceptionChecker.expectThrowsNoException(() -> mgr.matchSql(sql, 
sqlHash, "root"));
+        ExceptionChecker.expectThrowsNoException(() -> mgr.matchSql(sql, 
sqlHash, "admin"));
+        ExceptionChecker.expectThrowsWithMsg(AnalysisException.class,
+                "sql match regex sql block rule: test_rule",
+                () -> mgr.matchSql(sql, sqlHash, "other_user"));
+        Config.sql_block_rule_ignore_admin = false;
+        dropSqlBlockRule(dropSqlRule);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to