|
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; |
|
48 | 49 | import org.apache.hadoop.hbase.TableName; |
49 | 50 | import org.apache.hadoop.hbase.client.RegionInfo; |
50 | 51 | import org.apache.hadoop.hbase.client.RegionReplicaUtil; |
| 52 | +import org.apache.hadoop.hbase.client.TableDescriptor; |
51 | 53 | import org.apache.hadoop.hbase.master.LoadBalancer; |
52 | 54 | import org.apache.hadoop.hbase.master.MasterServices; |
53 | 55 | import org.apache.hadoop.hbase.master.RackManager; |
54 | 56 | 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 | 57 | import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action.Type; |
58 | 58 | import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting; |
59 | 59 | import org.apache.hbase.thirdparty.com.google.common.base.Joiner; |
@@ -1263,7 +1263,7 @@ public Map<ServerName, List<RegionInfo>> roundRobinAssignment(List<RegionInfo> r |
1263 | 1263 | return assignments; |
1264 | 1264 | } |
1265 | 1265 |
|
1266 | | - Cluster cluster = createCluster(servers, regions, false); |
| 1266 | + Cluster cluster = createCluster(servers, regions); |
1267 | 1267 | List<RegionInfo> unassignedRegions = new ArrayList<>(); |
1268 | 1268 |
|
1269 | 1269 | roundRobinAssignment(cluster, regions, unassignedRegions, |
@@ -1319,8 +1319,24 @@ public Map<ServerName, List<RegionInfo>> roundRobinAssignment(List<RegionInfo> r |
1319 | 1319 | return assignments; |
1320 | 1320 | } |
1321 | 1321 |
|
1322 | | - protected Cluster createCluster(List<ServerName> servers, Collection<RegionInfo> regions, |
1323 | | - boolean hasRegionReplica) { |
| 1322 | + protected Cluster createCluster(List<ServerName> servers, Collection<RegionInfo> regions) |
| 1323 | + throws HBaseIOException { |
| 1324 | + boolean hasRegionReplica = false; |
| 1325 | + try { |
| 1326 | + if (services != null && services.getTableDescriptors() != null) { |
| 1327 | + Map<String, TableDescriptor> tds = services.getTableDescriptors().getAll(); |
| 1328 | + for (RegionInfo regionInfo : regions) { |
| 1329 | + TableDescriptor td = tds.get(regionInfo.getTable().getNameWithNamespaceInclAsString()); |
| 1330 | + if (td != null && td.getRegionReplication() > 1) { |
| 1331 | + hasRegionReplica = true; |
| 1332 | + break; |
| 1333 | + } |
| 1334 | + } |
| 1335 | + } |
| 1336 | + } catch (IOException ioe) { |
| 1337 | + throw new HBaseIOException(ioe); |
| 1338 | + } |
| 1339 | + |
1324 | 1340 | // Get the snapshot of the current assignments for the regions in question, and then create |
1325 | 1341 | // a cluster out of it. Note that we might have replicas already assigned to some servers |
1326 | 1342 | // earlier. So we want to get the snapshot to see those assignments, but this will only contain |
@@ -1380,7 +1396,7 @@ public ServerName randomAssignment(RegionInfo regionInfo, List<ServerName> serve |
1380 | 1396 | final List<ServerName> finalServers = idleServers.isEmpty() ? |
1381 | 1397 | servers : idleServers; |
1382 | 1398 | List<RegionInfo> regions = Lists.newArrayList(regionInfo); |
1383 | | - Cluster cluster = createCluster(finalServers, regions, false); |
| 1399 | + Cluster cluster = createCluster(finalServers, regions); |
1384 | 1400 | return randomAssignment(cluster, regionInfo, finalServers); |
1385 | 1401 | } |
1386 | 1402 |
|
@@ -1452,21 +1468,9 @@ public Map<ServerName, List<RegionInfo>> retainAssignment(Map<RegionInfo, Server |
1452 | 1468 |
|
1453 | 1469 | int numRandomAssignments = 0; |
1454 | 1470 | int numRetainedAssigments = 0; |
1455 | | - boolean hasRegionReplica = false; |
1456 | 1471 | for (Map.Entry<RegionInfo, ServerName> entry : regions.entrySet()) { |
1457 | 1472 | RegionInfo region = entry.getKey(); |
1458 | 1473 | 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 | 1474 | List<ServerName> localServers = new ArrayList<>(); |
1471 | 1475 | if (oldServerName != null) { |
1472 | 1476 | localServers = serversByHostname.get(oldServerName.getHostnameLowerCase()); |
@@ -1506,7 +1510,7 @@ public Map<ServerName, List<RegionInfo>> retainAssignment(Map<RegionInfo, Server |
1506 | 1510 |
|
1507 | 1511 | // If servers from prior assignment aren't present, then lets do randomAssignment on regions. |
1508 | 1512 | if (randomAssignRegions.size() > 0) { |
1509 | | - Cluster cluster = createCluster(servers, regions.keySet(), hasRegionReplica); |
| 1513 | + Cluster cluster = createCluster(servers, regions.keySet()); |
1510 | 1514 | for (Map.Entry<ServerName, List<RegionInfo>> entry : assignments.entrySet()) { |
1511 | 1515 | ServerName sn = entry.getKey(); |
1512 | 1516 | for (RegionInfo region : entry.getValue()) { |
|
0 commit comments