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