diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java index 4d313049c00e6c..22112f314a4051 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java @@ -4371,8 +4371,10 @@ private void createTablets(String clusterName, MaterializedIndex index, ReplicaS Preconditions.checkState(chosenBackendIds.size() == replicationNum, chosenBackendIds.size() + " vs. "+ replicationNum); } - if (groupId != null) { + if (groupId != null && chooseBackendsArbitrary) { colocateIndex.addBackendsPerBucketSeq(groupId, backendsPerBucketSeq); + ColocatePersistInfo info = ColocatePersistInfo.createForBackendsPerBucketSeq(groupId, backendsPerBucketSeq); + editLog.logColocateBackendsPerBucketSeq(info); } } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java index 62dc4ccf78a740..626b25f4f9961f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java @@ -157,11 +157,11 @@ public GroupId addTableToGroup(long dbId, OlapTable tbl, String groupName, Group // generate a new one groupId = new GroupId(dbId, Catalog.getCurrentCatalog().getNextId()); } - groupName2Id.put(fullGroupName, groupId); HashDistributionInfo distributionInfo = (HashDistributionInfo) tbl.getDefaultDistributionInfo(); ColocateGroupSchema groupSchema = new ColocateGroupSchema(groupId, distributionInfo.getDistributionColumns(), distributionInfo.getBucketNum(), - tbl.getPartitionInfo().idToReplicationNum.values().stream().findFirst().get()); + tbl.getDefaultReplicationNum()); + groupName2Id.put(fullGroupName, groupId); group2Schema.put(groupId, groupSchema); } group2Tables.put(groupId, tbl.getId()); @@ -321,8 +321,12 @@ public Set getBackendsByGroup(GroupId groupId) { try { Set allBackends = new HashSet<>(); List> backendsPerBucketSeq = group2BackendsPerBucketSeq.get(groupId); - for (List bes : backendsPerBucketSeq) { - allBackends.addAll(bes); + // if create colocate table with empty partition or create colocate table + // with dynamic_partition will cause backendsPerBucketSeq == null + if (backendsPerBucketSeq != null) { + for (List bes : backendsPerBucketSeq) { + allBackends.addAll(bes); + } } return allBackends; } finally { @@ -446,7 +450,6 @@ public void replayAddTableToGroup(ColocatePersistInfo info) { writeLock(); try { if (!group2BackendsPerBucketSeq.containsKey(info.getGroupId())) { - Preconditions.checkState(!info.getBackendsPerBucketSeq().isEmpty()); group2BackendsPerBucketSeq.put(info.getGroupId(), info.getBackendsPerBucketSeq()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableBalancer.java b/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableBalancer.java index 3aad38a0b6afc7..9674f411098191 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableBalancer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableBalancer.java @@ -150,6 +150,10 @@ private void relocateAndBalanceGroup() { if (statistic == null) { continue; } + List> backendsPerBucketSeq = colocateIndex.getBackendsPerBucketSeq(groupId); + if (backendsPerBucketSeq.isEmpty()) { + continue; + } Set unavailableBeIdsInGroup = getUnavailableBeIdsInGroup(infoService, colocateIndex, groupId); List availableBeIds = getAvailableBeIds(db.getClusterName(), infoService); @@ -183,6 +187,10 @@ private void matchGroup() { } List> backendBucketsSeq = colocateIndex.getBackendsPerBucketSeqSet(groupId); + if (backendBucketsSeq.isEmpty()) { + continue; + } + boolean isGroupStable = true; db.readLock(); try {