diff --git a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md index 0a657a975c..6ea943500d 100644 --- a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md +++ b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md @@ -36,8 +36,16 @@ The node offline operation is used to safely log off the node. The operation is grammar: +- Find backend through host and port + ```sql ALTER SYSTEM DECOMMISSION BACKEND "host:heartbeat_port"[,"host:heartbeat_port"...]; +```` + +- Find backend through backend_id + +```sql +ALTER SYSTEM DECOMMISSION BACKEND "id1","id2"...; ```` illustrate: @@ -55,6 +63,10 @@ ALTER SYSTEM DECOMMISSION BACKEND "host:heartbeat_port"[,"host:heartbeat_port".. ALTER SYSTEM DECOMMISSION BACKEND "host1:port", "host2:port"; ```` + ```sql + ALTER SYSTEM DECOMMISSION BACKEND "id1", "id2"; + ```` + ### Keywords ALTER, SYSTEM, DECOMMISSION, BACKEND, ALTER SYSTEM diff --git a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md index 6c71609118..2882654cc5 100644 --- a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md +++ b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md @@ -36,9 +36,16 @@ This statement is used to delete the BACKEND node (administrator only!) grammar: +- Find backend through host and port + ```sql ALTER SYSTEM DROP BACKEND "host:heartbeat_port"[,"host:heartbeat_port"...] ```` +- Find backend through backend_id + +```sql +ALTER SYSTEM DROP BACKEND "id1","id2"...; +```` illustrate: @@ -54,6 +61,10 @@ illustrate: ALTER SYSTEM DROP BACKEND "host1:port", "host2:port"; ```` + ```sql + ALTER SYSTEM DROP BACKEND "ids1", "ids2"; + ```` + ### Keywords ALTER, SYSTEM, DROP, BACKEND, ALTER SYSTEM diff --git a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md index 9c0ce3e0ed..d4f13ccfdb 100644 --- a/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md +++ b/docs/en/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md @@ -37,8 +37,16 @@ Modify BE node properties (administrator only!) grammar: +- Find backend through host and port + ```sql ALTER SYSTEM MODIFY BACKEND "host:heartbeat_port" SET ("key" = "value"[, ...]); +```` + +- Find backend through backend_id + +```sql +ALTER SYSTEM MODIFY BACKEND "id1" SET ("key" = "value"[, ...]); ```` illustrate: @@ -62,18 +70,31 @@ Note: ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("tag.location" = "group_a"); ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("tag.location" = "group_a", "tag.compute" = "c1"); ```` + + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("tag.location" = "group_a"); + ALTER SYSTEM MODIFY BACKEND "id1" SET ("tag.location" = "group_a", "tag.compute" = "c1"); + ```` 2. Modify the query disable property of BE ```sql ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("disable_query" = "true"); ```` + + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("disable_query" = "true"); + ```` 3. Modify the import disable property of BE ```sql ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("disable_load" = "true"); ```` + + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("disable_load" = "true"); + ```` ### Keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md index b3b8272afe..170fe29b1b 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DECOMMISSION-BACKEND.md @@ -36,8 +36,16 @@ ALTER SYSTEM DECOMMISSION BACKEND 语法: +- 通过 host 和 port 查找 backend + ```sql ALTER SYSTEM DECOMMISSION BACKEND "host:heartbeat_port"[,"host:heartbeat_port"...]; +``` + +- 通过 backend_id 查找 backend + +```sql +ALTER SYSTEM DECOMMISSION BACKEND "id1","id2"...; ``` 说明: @@ -54,6 +62,10 @@ ALTER SYSTEM DECOMMISSION BACKEND "host:heartbeat_port"[,"host:heartbeat_port".. ```sql ALTER SYSTEM DECOMMISSION BACKEND "host1:port", "host2:port"; ``` + + ```sql + ALTER SYSTEM DECOMMISSION BACKEND "id1", "id2"; + ``` ### Keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md index fac97c9e0f..a6af68912f 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-DROP-BACKEND.md @@ -36,10 +36,18 @@ ALTER SYSTEM DROP BACKEND 语法: +- 通过 host 和 port 查找 backend + ```sql ALTER SYSTEM DROP BACKEND "host:heartbeat_port"[,"host:heartbeat_port"...] ``` +- 通过 backend_id 查找 backend + +```sql +ALTER SYSTEM DROP BACKEND "id1","id2"...; +``` + 说明: 1. host 可以是主机名或者ip地址 @@ -53,6 +61,10 @@ ALTER SYSTEM DROP BACKEND "host:heartbeat_port"[,"host:heartbeat_port"...] ```sql ALTER SYSTEM DROP BACKEND "host1:port", "host2:port"; ``` + + ```sql + ALTER SYSTEM DROP BACKEND "id1", "id2"; + ``` ### Keywords diff --git a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md index c0b9941e2e..7165c3ec02 100644 --- a/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md +++ b/docs/zh-CN/docs/sql-manual/sql-reference/Cluster-Management-Statements/ALTER-SYSTEM-MODIFY-BACKEND.md @@ -37,10 +37,18 @@ ALTER SYSTEM MKDIFY BACKEND 语法: +- 通过 host 和 port 查找 backend + ```sql ALTER SYSTEM MODIFY BACKEND "host:heartbeat_port" SET ("key" = "value"[, ...]); ``` +- 通过 backend_id 查找 backend + +```sql +ALTER SYSTEM MODIFY BACKEND "id1" SET ("key" = "value"[, ...]); +```` + 说明: 1. host 可以是主机名或者ip地址 @@ -63,16 +71,31 @@ ALTER SYSTEM MODIFY BACKEND "host:heartbeat_port" SET ("key" = "value"[, ...]); ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("tag.location" = "group_a", "tag.compute" = "c1"); ``` + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("tag.location" = "group_a"); + ALTER SYSTEM MODIFY BACKEND "id1" SET ("tag.location" = "group_a", "tag.compute" = "c1"); + ```` + 2. 修改 BE 的查询禁用属性 ```sql ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("disable_query" = "true"); ``` + + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("disable_query" = "true"); + ```` + 3. 修改 BE 的导入禁用属性 ```sql ALTER SYSTEM MODIFY BACKEND "host1:heartbeat_port" SET ("disable_load" = "true"); ``` + + ```sql + ALTER SYSTEM MODIFY BACKEND "id1" SET ("disable_load" = "true"); + ```` + ### Keywords ALTER, SYSTEM, ADD, BACKEND, ALTER SYSTEM diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java index e9e28a155c..95c9b46f8b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java @@ -86,7 +86,7 @@ import com.google.common.collect.Maps; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -739,7 +739,7 @@ public class Alter { } public void processAlterCluster(AlterSystemStmt stmt) throws UserException { - clusterHandler.process(Arrays.asList(stmt.getAlterClause()), stmt.getClusterName(), null, null); + clusterHandler.process(Collections.singletonList(stmt.getAlterClause()), stmt.getClusterName(), null, null); } private void processRename(Database db, OlapTable table, List alterClauses) throws DdlException { diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java index d4aae2d7dc..fbfbc9cc0e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SystemHandler.java @@ -125,7 +125,13 @@ public class SystemHandler extends AlterHandler { + "All data on this backend will be discarded permanently. " + "If you insist, use DROPP instead of DROP"); } - Env.getCurrentSystemInfo().dropBackends(dropBackendClause.getHostInfos()); + if (dropBackendClause.getHostInfos().isEmpty()) { + // drop by id + Env.getCurrentSystemInfo().dropBackendsByIds(dropBackendClause.getIds()); + } else { + // drop by host + Env.getCurrentSystemInfo().dropBackends(dropBackendClause.getHostInfos()); + } } else if (alterClause instanceof DecommissionBackendClause) { // decommission DecommissionBackendClause decommissionBackendClause = (DecommissionBackendClause) alterClause; @@ -192,6 +198,9 @@ public class SystemHandler extends AlterHandler { private List checkDecommission(DecommissionBackendClause decommissionBackendClause) throws DdlException { + if (decommissionBackendClause.getHostInfos().isEmpty()) { + return checkDecommissionByIds(decommissionBackendClause.getIds()); + } return checkDecommission(decommissionBackendClause.getHostInfos()); } @@ -226,6 +235,29 @@ public class SystemHandler extends AlterHandler { return decommissionBackends; } + public static List checkDecommissionByIds(List ids) + throws DdlException { + SystemInfoService infoService = Env.getCurrentSystemInfo(); + List decommissionBackends = Lists.newArrayList(); + // check if exist + for (String id : ids) { + Backend backend = infoService.getBackend(Long.parseLong(id)); + if (backend == null) { + throw new DdlException("Backend does not exist, backend id is " + id); + } + if (backend.isDecommissioned()) { + // already under decommission, ignore it + continue; + } + decommissionBackends.add(backend); + } + + // TODO(cmy): check if replication num can be met + // TODO(cmy): check remaining space + + return decommissionBackends; + } + @Override public synchronized void cancel(CancelStmt stmt) throws DdlException { CancelAlterSystemStmt cancelAlterSystemStmt = (CancelAlterSystemStmt) stmt; diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AddBackendClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AddBackendClause.java index a3f57d700d..57c3124d5f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AddBackendClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AddBackendClause.java @@ -23,12 +23,14 @@ import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.resource.Tag; import com.google.common.collect.Maps; +import lombok.Getter; import java.util.List; import java.util.Map; public class AddBackendClause extends BackendClause { protected Map properties = Maps.newHashMap(); + @Getter private Map tagMap; public AddBackendClause(List hostPorts) { @@ -43,10 +45,6 @@ public class AddBackendClause extends BackendClause { } } - public Map getTagMap() { - return tagMap; - } - @Override public void analyze(Analyzer analyzer) throws AnalysisException { super.analyze(analyzer); @@ -69,9 +67,9 @@ public class AddBackendClause extends BackendClause { StringBuilder sb = new StringBuilder(); sb.append("ADD "); sb.append("BACKEND "); - for (int i = 0; i < hostPorts.size(); i++) { - sb.append("\"").append(hostPorts.get(i)).append("\""); - if (i != hostPorts.size() - 1) { + for (int i = 0; i < params.size(); i++) { + sb.append("\"").append(params.get(i)).append("\""); + if (i != params.size() - 1) { sb.append(", "); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterSystemStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterSystemStmt.java index cfea3d6687..a64c117110 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterSystemStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterSystemStmt.java @@ -25,19 +25,17 @@ import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.qe.ConnectContext; import com.google.common.base.Preconditions; +import lombok.Getter; +@Getter public class AlterSystemStmt extends DdlStmt { - private AlterClause alterClause; + private final AlterClause alterClause; public AlterSystemStmt(AlterClause alterClause) { this.alterClause = alterClause; } - public AlterClause getAlterClause() { - return alterClause; - } - @Override public void analyze(Analyzer analyzer) throws UserException { @@ -65,9 +63,7 @@ public class AlterSystemStmt extends DdlStmt { @Override public String toSql() { - StringBuilder sb = new StringBuilder(); - sb.append("ALTER SYSTEM ").append(alterClause.toSql()); - return sb.toString(); + return "ALTER SYSTEM " + alterClause.toSql(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/BackendClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/BackendClause.java index c9f0eb320b..8a8204500e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BackendClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BackendClause.java @@ -24,37 +24,46 @@ import org.apache.doris.system.SystemInfoService.HostInfo; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; +import lombok.Getter; import org.apache.commons.lang3.NotImplementedException; import java.util.List; import java.util.Map; public class BackendClause extends AlterClause { - protected List hostPorts; + protected List params; + @Getter protected List hostInfos; + @Getter + protected List ids; + public static final String MUTLI_TAG_DISABLED_MSG = "Not support multi tags for Backend now. " + "You can set 'enable_multi_tags=true' in fe.conf to enable this feature."; public static final String NEED_LOCATION_TAG_MSG = "Backend must have location type tag. Eg: 'tag.location' = 'xxx'."; - protected BackendClause(List hostPorts) { + protected BackendClause(List params) { super(AlterOpType.ALTER_OTHER); - this.hostPorts = hostPorts; + this.params = params; + this.ids = Lists.newArrayList(); this.hostInfos = Lists.newArrayList(); } - public List getHostInfos() { - return hostInfos; - } - @Override public void analyze(Analyzer analyzer) throws AnalysisException { - for (String hostPort : hostPorts) { - HostInfo hostInfo = SystemInfoService.getHostAndPort(hostPort); - hostInfos.add(hostInfo); + + for (String param : params) { + if (!param.contains(":")) { + ids.add(param); + } else { + HostInfo hostInfo = SystemInfoService.getHostAndPort(param); + this.hostInfos.add(hostInfo); + } + } - Preconditions.checkState(!hostInfos.isEmpty()); + Preconditions.checkState(!this.hostInfos.isEmpty() || !this.ids.isEmpty(), + "hostInfos or ids can not be empty"); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecommissionBackendClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecommissionBackendClause.java index ba629bb0d5..76ba614876 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecommissionBackendClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecommissionBackendClause.java @@ -29,9 +29,9 @@ public class DecommissionBackendClause extends BackendClause { public String toSql() { StringBuilder sb = new StringBuilder(); sb.append("DECOMMISSION BACKEND "); - for (int i = 0; i < hostPorts.size(); i++) { - sb.append("\"").append(hostPorts.get(i)).append("\""); - if (i != hostPorts.size() - 1) { + for (int i = 0; i < params.size(); i++) { + sb.append("\"").append(params.get(i)).append("\""); + if (i != params.size() - 1) { sb.append(", "); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropBackendClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropBackendClause.java index a54a4aacae..34fb36afb4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropBackendClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropBackendClause.java @@ -17,52 +17,31 @@ package org.apache.doris.analysis; -import org.apache.doris.common.AnalysisException; -import org.apache.doris.common.Config; -import org.apache.doris.system.SystemInfoService; -import org.apache.doris.system.SystemInfoService.HostInfo; - -import com.google.common.base.Preconditions; +import lombok.Getter; import java.util.List; +@Getter public class DropBackendClause extends BackendClause { - private boolean force; + private final boolean force; - public DropBackendClause(List hostPorts) { - super(hostPorts); + public DropBackendClause(List params) { + super(params); this.force = true; } - public DropBackendClause(List hostPorts, boolean force) { - super(hostPorts); + public DropBackendClause(List params, boolean force) { + super(params); this.force = force; } - public boolean isForce() { - return force; - } - - @Override - public void analyze(Analyzer analyzer) throws AnalysisException { - if (Config.enable_fqdn_mode) { - for (String hostPort : hostPorts) { - HostInfo hostInfo = SystemInfoService.getHostAndPort(hostPort); - hostInfos.add(hostInfo); - } - Preconditions.checkState(!hostInfos.isEmpty()); - } else { - super.analyze(analyzer); - } - } - @Override public String toSql() { StringBuilder sb = new StringBuilder(); sb.append("DROP BACKEND "); - for (int i = 0; i < hostPorts.size(); i++) { - sb.append("\"").append(hostPorts.get(i)).append("\""); - if (i != hostPorts.size() - 1) { + for (int i = 0; i < params.size(); i++) { + sb.append("\"").append(params.get(i)).append("\""); + if (i != params.size() - 1) { sb.append(", "); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyBackendClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyBackendClause.java index 5b8bd151fd..a8e9b9a0b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyBackendClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ModifyBackendClause.java @@ -23,14 +23,16 @@ import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.resource.Tag; import com.google.common.collect.Maps; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; public class ModifyBackendClause extends BackendClause { - protected Map properties = Maps.newHashMap(); + protected Map properties; protected Map analyzedProperties = Maps.newHashMap(); + @Getter private Map tagMap = null; private Boolean isQueryDisabled = null; private Boolean isLoadDisabled = null; @@ -74,10 +76,6 @@ public class ModifyBackendClause extends BackendClause { } } - public Map getTagMap() { - return tagMap; - } - public Boolean isQueryDisabled() { return isQueryDisabled; } @@ -90,9 +88,9 @@ public class ModifyBackendClause extends BackendClause { public String toSql() { StringBuilder sb = new StringBuilder(); sb.append("MODIFY BACKEND "); - for (int i = 0; i < hostPorts.size(); i++) { - sb.append("\"").append(hostPorts.get(i)).append("\""); - if (i != hostPorts.size() - 1) { + for (int i = 0; i < params.size(); i++) { + sb.append("\"").append(params.get(i)).append("\""); + if (i != params.size() - 1) { sb.append(", "); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java index 07a54759f0..666e89b392 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java @@ -235,12 +235,21 @@ public class SystemInfoService { .getHostPortInAccessibleFormat(hostInfo.getHost(), hostInfo.getPort()); throw new DdlException("backend does not exists[" + backendIdentifier + "]"); } - } - for (HostInfo hostInfo : hostInfos) { dropBackend(hostInfo.getHost(), hostInfo.getPort()); } } + public void dropBackendsByIds(List ids) throws DdlException { + + for (String id : ids) { + if (getBackend(Long.parseLong(id)) == null) { + throw new DdlException("backend does not exists[" + id + "]"); + } + dropBackend(Long.parseLong(id)); + } + + } + // for decommission public void dropBackend(long backendId) throws DdlException { Backend backend = getBackend(backendId); @@ -896,14 +905,26 @@ public class SystemInfoService { public void modifyBackends(ModifyBackendClause alterClause) throws UserException { List hostInfos = alterClause.getHostInfos(); List backends = Lists.newArrayList(); - for (HostInfo hostInfo : hostInfos) { - Backend be = getBackendWithHeartbeatPort(hostInfo.getHost(), hostInfo.getPort()); - if (be == null) { - throw new DdlException( - "backend does not exists[" + NetUtils - .getHostPortInAccessibleFormat(hostInfo.getHost(), hostInfo.getPort()) + "]"); + if (hostInfos.isEmpty()) { + List ids = alterClause.getIds(); + for (String id : ids) { + long backendId = Long.parseLong(id); + Backend be = getBackend(backendId); + if (be == null) { + throw new DdlException("backend does not exists[" + backendId + "]"); + } + backends.add(be); + } + } else { + for (HostInfo hostInfo : hostInfos) { + Backend be = getBackendWithHeartbeatPort(hostInfo.getHost(), hostInfo.getPort()); + if (be == null) { + throw new DdlException( + "backend does not exists[" + NetUtils + .getHostPortInAccessibleFormat(hostInfo.getHost(), hostInfo.getPort()) + "]"); + } + backends.add(be); } - backends.add(be); } for (Backend be : backends) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java b/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java index 568b886c35..17af00a654 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/cluster/DecommissionBackendTest.java @@ -35,7 +35,7 @@ import java.util.List; public class DecommissionBackendTest extends TestWithFeService { @Override protected int backendNum() { - return 3; + return 4; } @Override @@ -78,18 +78,18 @@ public class DecommissionBackendTest extends TestWithFeService { // 5. execute decommission Backend srcBackend = null; for (Backend backend : idToBackendRef.values()) { - if (Env.getCurrentInvertedIndex().getTabletIdsByBackendId(backend.getId()).size() > 0) { + if (!Env.getCurrentInvertedIndex().getTabletIdsByBackendId(backend.getId()).isEmpty()) { srcBackend = backend; break; } } - Assertions.assertTrue(srcBackend != null); + Assertions.assertNotNull(srcBackend); String decommissionStmtStr = "alter system decommission backend \"127.0.0.1:" + srcBackend.getHeartbeatPort() + "\""; AlterSystemStmt decommissionStmt = (AlterSystemStmt) parseAndAnalyzeStmt(decommissionStmtStr); Env.getCurrentEnv().getAlterInstance().processAlterCluster(decommissionStmt); - Assertions.assertEquals(true, srcBackend.isDecommissioned()); + Assertions.assertTrue(srcBackend.isDecommissioned()); long startTimestamp = System.currentTimeMillis(); while (System.currentTimeMillis() - startTimestamp < 90000 && Env.getCurrentSystemInfo().getIdToBackend().containsKey(srcBackend.getId())) { @@ -110,6 +110,34 @@ public class DecommissionBackendTest extends TestWithFeService { } + @Test + public void testDecommissionBackendById() throws Exception { + + ImmutableMap idToBackendRef = Env.getCurrentSystemInfo().getIdToBackend(); + Backend srcBackend = idToBackendRef.values().asList().get(0); + Assertions.assertNotNull(srcBackend); + // decommission backend by id + String decommissionByIdStmtStr = "alter system decommission backend \"" + srcBackend.getId() + "\""; + AlterSystemStmt decommissionByIdStmt = (AlterSystemStmt) parseAndAnalyzeStmt(decommissionByIdStmtStr); + Env.getCurrentEnv().getAlterInstance().processAlterCluster(decommissionByIdStmt); + + Assertions.assertTrue(srcBackend.isDecommissioned()); + long startTimestamp = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTimestamp < 90000 + && Env.getCurrentSystemInfo().getIdToBackend().containsKey(srcBackend.getId())) { + Thread.sleep(1000); + } + + Assertions.assertEquals(backendNum() - 1, Env.getCurrentSystemInfo().getIdToBackend().size()); + + // add backend + String addBackendStmtStr = "alter system add backend \"127.0.0.1:" + srcBackend.getHeartbeatPort() + "\""; + AlterSystemStmt addBackendStmt = (AlterSystemStmt) parseAndAnalyzeStmt(addBackendStmtStr); + Env.getCurrentEnv().getAlterInstance().processAlterCluster(addBackendStmt); + Assertions.assertEquals(backendNum(), Env.getCurrentSystemInfo().getIdToBackend().size()); + + } + @Test public void testDecommissionBackendWithDropTable() throws Exception { // 1. create connect context @@ -132,12 +160,12 @@ public class DecommissionBackendTest extends TestWithFeService { Backend srcBackend = null; for (Backend backend : idToBackendRef.values()) { - if (Env.getCurrentInvertedIndex().getTabletIdsByBackendId(backend.getId()).size() > 0) { + if (!Env.getCurrentInvertedIndex().getTabletIdsByBackendId(backend.getId()).isEmpty()) { srcBackend = backend; break; } } - Assertions.assertTrue(srcBackend != null); + Assertions.assertNotNull(srcBackend); // 5. drop table tbl1 dropTable("db2.tbl1", false); @@ -146,7 +174,7 @@ public class DecommissionBackendTest extends TestWithFeService { String decommissionStmtStr = "alter system decommission backend \"127.0.0.1:" + srcBackend.getHeartbeatPort() + "\""; AlterSystemStmt decommissionStmt = (AlterSystemStmt) parseAndAnalyzeStmt(decommissionStmtStr); Env.getCurrentEnv().getAlterInstance().processAlterCluster(decommissionStmt); - Assertions.assertEquals(true, srcBackend.isDecommissioned()); + Assertions.assertTrue(srcBackend.isDecommissioned()); long startTimestamp = System.currentTimeMillis(); while (System.currentTimeMillis() - startTimestamp < 90000 @@ -163,7 +191,7 @@ public class DecommissionBackendTest extends TestWithFeService { // TabletInvertedIndex still holds these tablets of srcBackend, but they are all in recycled status List tabletList = Env.getCurrentInvertedIndex().getTabletIdsByBackendId(srcBackend.getId()); - Assertions.assertTrue(tabletList.size() > 0); + Assertions.assertFalse(tabletList.isEmpty()); Assertions.assertTrue(Env.getCurrentRecycleBin().allTabletsInRecycledStatus(tabletList)); // recover tbl1, because tbl1 has more than one replica, so it still can be recovered @@ -176,4 +204,6 @@ public class DecommissionBackendTest extends TestWithFeService { Assertions.assertEquals(backendNum(), Env.getCurrentSystemInfo().getIdToBackend().size()); } + + } diff --git a/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java b/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java index 3721b8e1e7..40c207631e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java @@ -264,6 +264,33 @@ public class SystemInfoServiceTest { } } + @Test + public void removeBackendTestByBackendId() throws UserException { + clearAllBackend(); + AddBackendClause stmt = new AddBackendClause(Lists.newArrayList("192.168.0.1:1234")); + stmt.analyze(analyzer); + try { + Env.getCurrentSystemInfo().addBackends(stmt.getHostInfos(), true); + } catch (DdlException e) { + e.printStackTrace(); + } + + DropBackendClause dropStmt = new DropBackendClause(Lists.newArrayList(String.valueOf(backendId))); + dropStmt.analyze(analyzer); + try { + Env.getCurrentSystemInfo().dropBackends(dropStmt.getHostInfos()); + } catch (DdlException e) { + e.printStackTrace(); + Assert.fail(); + } + + try { + Env.getCurrentSystemInfo().dropBackends(dropStmt.getHostInfos()); + } catch (DdlException e) { + Assert.assertTrue(e.getMessage().contains("does not exist")); + } + } + @Test public void testSaveLoadBackend() throws Exception { clearAllBackend();