This is an automated email from the ASF dual-hosted git repository.

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new a637327f31d  fix create region group (#15108)
a637327f31d is described below

commit a637327f31d40e72f94efd25699ce75b6bd6af28
Author: Xiangpeng Hu <[email protected]>
AuthorDate: Mon Mar 17 20:30:49 2025 +0800

     fix create region group (#15108)
---
 .../iotdb/confignode/manager/ProcedureManager.java |  2 +-
 .../impl/region/CreateRegionGroupsProcedure.java   | 35 ++++++++++++++++++----
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 002fcf859ff..e47ed4abc69 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -571,7 +571,7 @@ public class ProcedureManager {
     this.executor.submitProcedure(
         new 
RemoveDataNodesProcedure(removeDataNodePlan.getDataNodeLocations(), 
nodeStatusMap));
     LOGGER.info(
-        "Submit RemoveDataNodeProcedure successfully, {}",
+        "Submit RemoveDataNodesProcedure successfully, {}",
         removeDataNodePlan.getDataNodeLocations());
     return true;
   }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/region/CreateRegionGroupsProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/region/CreateRegionGroupsProcedure.java
index 2bcaee129d5..14e4be60ed9 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/region/CreateRegionGroupsProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/region/CreateRegionGroupsProcedure.java
@@ -26,6 +26,8 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.commons.cluster.RegionStatus;
 import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.commons.utils.ThriftCommonsSerDeUtils;
+import org.apache.iotdb.confignode.conf.ConfigNodeConfig;
+import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
 import 
org.apache.iotdb.confignode.consensus.request.write.region.CreateRegionGroupsPlan;
 import 
org.apache.iotdb.confignode.consensus.request.write.region.OfferRegionMaintainTasksPlan;
 import 
org.apache.iotdb.confignode.manager.load.cache.region.RegionHeartbeatSample;
@@ -60,6 +62,7 @@ public class CreateRegionGroupsProcedure
 
   private CreateRegionGroupsPlan createRegionGroupsPlan = new 
CreateRegionGroupsPlan();
   private CreateRegionGroupsPlan persistPlan = new CreateRegionGroupsPlan();
+  private static final ConfigNodeConfig CONF = 
ConfigNodeDescriptor.getInstance().getConf();
 
   /** key: TConsensusGroupId value: Failed RegionReplicas */
   private Map<TConsensusGroupId, TRegionReplicaSet> failedRegionReplicaSets = 
new HashMap<>();
@@ -117,8 +120,13 @@ public class CreateRegionGroupsProcedure
                             final TRegionReplicaSet failedRegionReplicas =
                                 
failedRegionReplicaSets.get(regionReplicaSet.getRegionId());
 
-                            if (failedRegionReplicas.getDataNodeLocationsSize()
-                                <= 
(regionReplicaSet.getDataNodeLocationsSize() - 1) / 2) {
+                            boolean canProvideService =
+                                canRegionGroupProvideService(
+                                    
regionReplicaSet.getDataNodeLocationsSize(),
+                                    
failedRegionReplicas.getDataNodeLocationsSize(),
+                                    failedRegionReplicas.getRegionId());
+
+                            if (canProvideService) {
                               // A RegionGroup can provide service as long as 
there are more than
                               // half of the RegionReplicas created 
successfully
                               persistPlan.addRegionGroup(database, 
regionReplicaSet);
@@ -181,9 +189,15 @@ public class CreateRegionGroupsProcedure
                         regionReplicaSet -> {
                           TRegionReplicaSet failedRegionReplicas =
                               
failedRegionReplicaSets.get(regionReplicaSet.getRegionId());
-                          if (failedRegionReplicas == null
-                              || 
failedRegionReplicas.getDataNodeLocationsSize()
-                                  <= 
(regionReplicaSet.getDataNodeLocationsSize() - 1) / 2) {
+
+                          boolean canProvideService =
+                              failedRegionReplicas == null
+                                  || canRegionGroupProvideService(
+                                      
regionReplicaSet.getDataNodeLocationsSize(),
+                                      
failedRegionReplicas.getDataNodeLocationsSize(),
+                                      failedRegionReplicas.getRegionId());
+
+                          if (canProvideService) {
                             final Set<Integer> failedDataNodeIds =
                                 failedRegionReplicas == null
                                     ? new TreeSet<>()
@@ -313,4 +327,15 @@ public class CreateRegionGroupsProcedure
     return Objects.hash(
         consensusGroupType, createRegionGroupsPlan, persistPlan, 
failedRegionReplicaSets);
   }
+
+  public boolean canRegionGroupProvideService(
+      int regionGroupNodeNumber, int failedNodeNumber, TConsensusGroupId 
regionId) {
+    boolean isStrongConsistency = 
CONF.isConsensusGroupStrongConsistency(regionId);
+    int successNodeNumber = regionGroupNodeNumber - failedNodeNumber;
+    if (isStrongConsistency) {
+      return successNodeNumber > (regionGroupNodeNumber / 2);
+    } else {
+      return successNodeNumber >= 1;
+    }
+  }
 }

Reply via email to