|
18 | 18 | */ |
19 | 19 | package org.apache.hadoop.hbase.master.balancer; |
20 | 20 |
|
| 21 | +import java.io.IOException; |
21 | 22 | import java.util.ArrayList; |
22 | 23 | import java.util.Arrays; |
23 | 24 | import java.util.Collection; |
|
52 | 53 | import org.apache.hadoop.hbase.master.MasterServices; |
53 | 54 | import org.apache.hadoop.hbase.master.RackManager; |
54 | 55 | import org.apache.hadoop.hbase.master.RegionPlan; |
55 | | -import org.apache.hadoop.hbase.master.assignment.AssignmentManager; |
56 | | -import org.apache.hadoop.hbase.master.assignment.RegionStates; |
57 | 56 | import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type; |
58 | 57 | import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; |
59 | 58 | import org.apache.hbase.thirdparty.com.google.common.base.Joiner; |
@@ -1263,7 +1262,7 @@ public Map<ServerName, List<RegionInfo>> roundRobinAssignment(List<RegionInfo> r |
1263 | 1262 | return assignments; |
1264 | 1263 | } |
1265 | 1264 |
|
1266 | | - Cluster cluster = createCluster(servers, regions, false); |
| 1265 | + Cluster cluster = createCluster(servers, regions); |
1267 | 1266 | List<RegionInfo> unassignedRegions = new ArrayList<>(); |
1268 | 1267 |
|
1269 | 1268 | roundRobinAssignment(cluster, regions, unassignedRegions, |
@@ -1319,8 +1318,22 @@ public Map<ServerName, List<RegionInfo>> roundRobinAssignment(List<RegionInfo> r |
1319 | 1318 | return assignments; |
1320 | 1319 | } |
1321 | 1320 |
|
1322 | | - protected Cluster createCluster(List<ServerName> servers, Collection<RegionInfo> regions, |
1323 | | - boolean hasRegionReplica) { |
| 1321 | + protected Cluster createCluster(List<ServerName> servers, Collection<RegionInfo> regions) |
| 1322 | + throws HBaseIOException { |
| 1323 | + boolean hasRegionReplica = false; |
| 1324 | + try { |
| 1325 | + for (RegionInfo regionInfo : regions) { |
| 1326 | + TableName tableName = regionInfo.getTable(); |
| 1327 | + if (services != null && |
| 1328 | + services.getTableDescriptors().get(tableName).getRegionReplication() > 1) { |
| 1329 | + hasRegionReplica = true; |
| 1330 | + break; |
| 1331 | + } |
| 1332 | + } |
| 1333 | + } catch (IOException ioe) { |
| 1334 | + throw new HBaseIOException(ioe); |
| 1335 | + } |
| 1336 | + |
1324 | 1337 | // Get the snapshot of the current assignments for the regions in question, and then create |
1325 | 1338 | // a cluster out of it. Note that we might have replicas already assigned to some servers |
1326 | 1339 | // earlier. So we want to get the snapshot to see those assignments, but this will only contain |
@@ -1380,7 +1393,7 @@ public ServerName randomAssignment(RegionInfo regionInfo, List<ServerName> serve |
1380 | 1393 | final List<ServerName> finalServers = idleServers.isEmpty() ? |
1381 | 1394 | servers : idleServers; |
1382 | 1395 | List<RegionInfo> regions = Lists.newArrayList(regionInfo); |
1383 | | - Cluster cluster = createCluster(finalServers, regions, false); |
| 1396 | + Cluster cluster = createCluster(finalServers, regions); |
1384 | 1397 | return randomAssignment(cluster, regionInfo, finalServers); |
1385 | 1398 | } |
1386 | 1399 |
|
@@ -1452,21 +1465,9 @@ public Map<ServerName, List<RegionInfo>> retainAssignment(Map<RegionInfo, Server |
1452 | 1465 |
|
1453 | 1466 | int numRandomAssignments = 0; |
1454 | 1467 | int numRetainedAssigments = 0; |
1455 | | - boolean hasRegionReplica = false; |
1456 | 1468 | for (Map.Entry<RegionInfo, ServerName> entry : regions.entrySet()) { |
1457 | 1469 | RegionInfo region = entry.getKey(); |
1458 | 1470 | ServerName oldServerName = entry.getValue(); |
1459 | | - // In the current set of regions even if one has region replica let us go with |
1460 | | - // getting the entire snapshot |
1461 | | - if (this.services != null) { // for tests |
1462 | | - AssignmentManager am = this.services.getAssignmentManager(); |
1463 | | - if (am != null) { |
1464 | | - RegionStates states = am.getRegionStates(); |
1465 | | - if (!hasRegionReplica && states != null && states.isReplicaAvailableForRegion(region)) { |
1466 | | - hasRegionReplica = true; |
1467 | | - } |
1468 | | - } |
1469 | | - } |
1470 | 1471 | List<ServerName> localServers = new ArrayList<>(); |
1471 | 1472 | if (oldServerName != null) { |
1472 | 1473 | localServers = serversByHostname.get(oldServerName.getHostnameLowerCase()); |
@@ -1506,7 +1507,7 @@ public Map<ServerName, List<RegionInfo>> retainAssignment(Map<RegionInfo, Server |
1506 | 1507 |
|
1507 | 1508 | // If servers from prior assignment aren't present, then lets do randomAssignment on regions. |
1508 | 1509 | if (randomAssignRegions.size() > 0) { |
1509 | | - Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica); |
| 1510 | + Cluster cluster = createCluster(servers, regions.keySet()); |
1510 | 1511 | for (Map.Entry<ServerName, List<RegionInfo>> entry : assignments.entrySet()) { |
1511 | 1512 | ServerName sn = entry.getKey(); |
1512 | 1513 | for (RegionInfo region : entry.getValue()) { |
|
0 commit comments