diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionReplicaUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionReplicaUtil.java index 9c5af37..3538e2a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionReplicaUtil.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RegionReplicaUtil.java @@ -176,6 +176,7 @@ public class RegionReplicaUtil { } List hRegionInfos = new ArrayList<>((newReplicaCount) * regions.size()); for (int i = 0; i < regions.size(); i++) { + hRegionInfos.add(regions.get(i)); if (RegionReplicaUtil.isDefaultReplica(regions.get(i))) { // region level replica index starts from 0. So if oldReplicaCount was 2 then the max replicaId for // the existing regions would be 1 @@ -184,7 +185,6 @@ public class RegionReplicaUtil { } } } - hRegionInfos.addAll(regions); return hRegionInfos; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index 1c193f9..95a213a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -618,6 +618,20 @@ public class AssignmentManager implements ServerListener { return procs; } + public AssignProcedure[] createRoundRobinAssignProcedures(final Collection regionInfo, + final List onlineServers) { + if (regionInfo.isEmpty()) return null; + final AssignProcedure[] procs = new AssignProcedure[regionInfo.size()]; + int index = 0; + int serverIndex = 0; + for (RegionInfo hri : regionInfo) { + serverIndex = serverIndex % onlineServers.size(); + procs[index++] = createAssignProcedure(hri, onlineServers.get(serverIndex)); + serverIndex++; + } + return procs; + } + // Needed for the following method so it can type the created Array we return private static final UnassignProcedure [] UNASSIGNED_PROCEDURE_FOR_TYPE_INFO = new UnassignProcedure[0]; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java index e9804dd..4b321c5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java @@ -28,6 +28,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.MetaTableAccessor; +import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableExistsException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.RegionInfo; @@ -106,7 +107,14 @@ public class CreateTableProcedure break; case CREATE_TABLE_ASSIGN_REGIONS: setEnablingState(env, getTableName()); - addChildProcedure(env.getAssignmentManager().createAssignProcedures(newRegions)); + if (tableDescriptor.getRegionReplication() > 1) { + List onlineServersList = + env.getMasterServices().getServerManager().getOnlineServersList(); + addChildProcedure(env.getAssignmentManager().createRoundRobinAssignProcedures(newRegions, + onlineServersList)); + } else { + addChildProcedure(env.getAssignmentManager().createAssignProcedures(newRegions)); + } setNextState(CreateTableState.CREATE_TABLE_UPDATE_DESC_CACHE); break; case CREATE_TABLE_UPDATE_DESC_CACHE: