diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminSetConfigStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminSetConfigStmt.java index b197c6c2bca113..6695a9e9846045 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminSetConfigStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminSetConfigStmt.java @@ -97,7 +97,7 @@ public RedirectStatus getRedirectStatus() { public OriginStatement getLocalSetStmt() { OriginStatement stmt = this.getOrigStmt(); Object[] keyArr = configs.keySet().toArray(); - String sql = String.format("ADMIN SET FRONTEND CONFIG (\"%s\" = \"%s\");", + String sql = String.format("ADMIN SET %s CONFIG (\"%s\" = \"%s\");", applyToAll ? "ALL FRONTENDS" : "FRONTEND", keyArr[0].toString(), configs.get(keyArr[0].toString())); return new OriginStatement(sql, stmt.idx); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 4cf16959d241fe..d2a08ddb657fa1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -6136,7 +6136,7 @@ public void setMutableConfigWithCallback(String key, String value) throws Config } } - public void setConfig(AdminSetConfigStmt stmt) throws Exception { + public void setConfig(AdminSetConfigStmt stmt, boolean isProxy) throws Exception { Map configs = stmt.getConfigs(); Preconditions.checkState(configs.size() == 1); @@ -6148,7 +6148,8 @@ public void setConfig(AdminSetConfigStmt stmt) throws Exception { } } - if (stmt.isApplyToAll()) { + // if this request already come from other Frontend, do not forward it again + if (!isProxy && stmt.isApplyToAll()) { for (Frontend fe : Env.getCurrentEnv().getFrontends(null /* all */)) { if (!fe.isAlive() || fe.getHost().equals(Env.getCurrentEnv().getSelfNode().getHost())) { continue; diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java index 03bc3908cf9e76..e4737e81970bc5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java @@ -161,6 +161,10 @@ public class DdlExecutor { * Execute ddl. **/ public static void execute(Env env, DdlStmt ddlStmt) throws Exception { + execute(env, ddlStmt, false); + } + + public static void execute(Env env, DdlStmt ddlStmt, boolean isProxy) throws Exception { checkDdlStmtSupported(ddlStmt); if (ddlStmt instanceof CreateDbStmt) { env.createDb((CreateDbStmt) ddlStmt); @@ -297,7 +301,7 @@ public static void execute(Env env, DdlStmt ddlStmt) throws Exception { } else if (ddlStmt instanceof AdminCompactTableStmt) { env.compactTable((AdminCompactTableStmt) ddlStmt); } else if (ddlStmt instanceof AdminSetConfigStmt) { - env.setConfig((AdminSetConfigStmt) ddlStmt); + env.setConfig((AdminSetConfigStmt) ddlStmt, isProxy); } else if (ddlStmt instanceof AdminSetTableStatusStmt) { env.setTableStatus((AdminSetTableStatusStmt) ddlStmt); } else if (ddlStmt instanceof CreateFileStmt) { 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 f1ebd8a3156bf1..2ac7467280e7fd 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 @@ -3168,7 +3168,7 @@ private void handleDeleteStmt() { private void handleDdlStmt() { try { - DdlExecutor.execute(context.getEnv(), (DdlStmt) parsedStmt); + DdlExecutor.execute(context.getEnv(), (DdlStmt) parsedStmt, isProxy); if (!(parsedStmt instanceof AnalyzeStmt)) { context.getState().setOk(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminSetConfigStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminSetConfigStmtTest.java index a8dce790f652cc..95bf073929a6e7 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminSetConfigStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminSetConfigStmtTest.java @@ -39,7 +39,8 @@ public class AdminSetConfigStmtTest extends TestWithFeService { public void testNormal() throws Exception { String stmt = "admin set frontend config(\"alter_table_timeout_second\" = \"60\");"; AdminSetConfigStmt adminSetConfigStmt = (AdminSetConfigStmt) parseAndAnalyzeStmt(stmt); - Env.getCurrentEnv().setConfig(adminSetConfigStmt); + Env.getCurrentEnv().setConfig(adminSetConfigStmt, false); + Assertions.assertTrue(adminSetConfigStmt.getLocalSetStmt().originStmt.startsWith("ADMIN SET FRONTEND CONFIG")); } @Test @@ -47,7 +48,7 @@ public void testUnknownConfig() throws Exception { String stmt = "admin set frontend config(\"unknown_config\" = \"unknown\");"; AdminSetConfigStmt adminSetConfigStmt = (AdminSetConfigStmt) parseAndAnalyzeStmt(stmt); DdlException exception = Assertions.assertThrows(DdlException.class, - () -> Env.getCurrentEnv().setConfig(adminSetConfigStmt)); + () -> Env.getCurrentEnv().setConfig(adminSetConfigStmt, false)); Assertions.assertEquals("errCode = 2, detailMessage = Config 'unknown_config' does not exist", exception.getMessage()); } @@ -66,14 +67,14 @@ public void testExperimentalConfig() throws Exception { boolean enableMtmv = Config.enable_mtmv; String stmt = "admin set frontend config('enable_mtmv' = '" + String.valueOf(!enableMtmv) + "');"; AdminSetConfigStmt adminSetConfigStmt = (AdminSetConfigStmt) parseAndAnalyzeStmt(stmt); - Env.getCurrentEnv().setConfig(adminSetConfigStmt); + Env.getCurrentEnv().setConfig(adminSetConfigStmt, false); Assert.assertNotEquals(enableMtmv, Config.enable_mtmv); // 2. set with experimental enableMtmv = Config.enable_mtmv; stmt = "admin set frontend config('experimental_enable_mtmv' = '" + String.valueOf(!enableMtmv) + "');"; adminSetConfigStmt = (AdminSetConfigStmt) parseAndAnalyzeStmt(stmt); - Env.getCurrentEnv().setConfig(adminSetConfigStmt); + Env.getCurrentEnv().setConfig(adminSetConfigStmt, false); Assert.assertNotEquals(enableMtmv, Config.enable_mtmv); // 3. show config @@ -89,5 +90,19 @@ public void testExperimentalConfig() throws Exception { results = ConfigBase.getConfigInfo(matcher); Assert.assertEquals(num, results.size()); } + + @Test + public void testSetAllFrontendsConfig() throws Exception { + String stmt = "admin set all frontends config(\"alter_table_timeout_second\" = \"77\");"; + AdminSetConfigStmt adminSetConfigStmt = (AdminSetConfigStmt) parseAndAnalyzeStmt(stmt); + + Assertions.assertTrue(adminSetConfigStmt.isApplyToAll()); + Assertions.assertEquals(adminSetConfigStmt.getRedirectStatus(), RedirectStatus.NO_FORWARD); + Assertions.assertTrue( + adminSetConfigStmt.getLocalSetStmt().originStmt.startsWith("ADMIN SET ALL FRONTENDS CONFIG")); + + Env.getCurrentEnv().setConfig(adminSetConfigStmt, true); + Assertions.assertEquals(77, Config.alter_table_timeout_second); + } }