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;
+ }
+ }
}