diff --git a/docs/zh-CN/docs/admin-manual/config/fe-config.md b/docs/zh-CN/docs/admin-manual/config/fe-config.md index 302c5fbdbeea59..957f87bcd6b947 100644 --- a/docs/zh-CN/docs/admin-manual/config/fe-config.md +++ b/docs/zh-CN/docs/admin-manual/config/fe-config.md @@ -2313,3 +2313,14 @@ load 标签清理器将每隔 `label_clean_interval_second` 运行一次以清 是否可以动态配置:true 是否为 Master FE 节点独有的配置项:true + + +### max_replica_count_when_schema_change + +OlapTable在做schema change时,允许的最大副本数,副本数过大会导致FE OOM。 + +默认值:100000 + +是否可以动态配置:true + +是否为 Master FE 节点独有的配置项:true diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java index c0d31cab9d1e2e..c408f9690d4955 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java @@ -27,6 +27,7 @@ import org.apache.doris.catalog.Replica; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Tablet; +import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; import org.apache.doris.common.MetaNotFoundException; @@ -253,4 +254,23 @@ public void replayAlterJobV2(AlterJobV2 alterJob) { existingJob.replay(alterJob); } } + + /** + * there will be OOM if there are too many replicas of the table when schema change. + */ + protected void checkReplicaCount(OlapTable olapTable) throws DdlException { + olapTable.readLock(); + try { + long replicaCount = olapTable.getReplicaCount(); + long maxReplicaCount = Config.max_replica_count_when_schema_change; + if (replicaCount > maxReplicaCount) { + String msg = String.format("%s have %d replicas reach %d limit when schema change.", + olapTable.getName(), replicaCount, maxReplicaCount); + LOG.warn(msg); + throw new DdlException(msg); + } + } finally { + olapTable.readUnlock(); + } + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java index 32ec16301b91c3..6a835d6ccbc8e8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java @@ -233,6 +233,7 @@ public void processCreateMaterializedView(CreateMaterializedViewStmt addMVClause */ public void processBatchAddRollup(List alterClauses, Database db, OlapTable olapTable) throws DdlException, AnalysisException { + checkReplicaCount(olapTable); Map rollupNameJobMap = new LinkedHashMap<>(); // save job id for log Set logJobIdSet = new HashSet<>(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index 85e12954c8beee..90b81cfb08f342 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -1139,6 +1139,7 @@ private void createJob(long dbId, OlapTable olapTable, Map