1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.master.balancer;
19
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertTrue;
22
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.hadoop.hbase.HBaseTestingUtility;
29 import org.apache.hadoop.hbase.HDFSBlocksDistribution;
30 import org.apache.hadoop.hbase.HRegionInfo;
31 import org.apache.hadoop.hbase.MiniHBaseCluster;
32 import org.apache.hadoop.hbase.ServerName;
33 import org.apache.hadoop.hbase.TableName;
34 import org.apache.hadoop.hbase.client.Table;
35 import org.apache.hadoop.hbase.regionserver.Region;
36 import org.apache.hadoop.hbase.regionserver.HRegionServer;
37 import org.apache.hadoop.hbase.util.Bytes;
38 import org.apache.hadoop.hbase.testclassification.SmallTests;
39 import org.junit.AfterClass;
40 import org.junit.BeforeClass;
41 import org.junit.Test;
42 import org.junit.experimental.categories.Category;
43
44 @Category({SmallTests.class})
45 public class TestRegionLocationFinder {
46 private static final Log LOG = LogFactory.getLog(TestRegionLocationFinder.class);
47 private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
48 private static MiniHBaseCluster cluster;
49
50 private final static TableName tableName = TableName.valueOf("table");
51 private final static byte[] FAMILY = Bytes.toBytes("cf");
52 private static Table table;
53 private final static int ServerNum = 5;
54
55 private static RegionLocationFinder finder = new RegionLocationFinder();
56
57 @BeforeClass
58 public static void setUpBeforeClass() throws Exception {
59 cluster = TEST_UTIL.startMiniCluster(1, ServerNum);
60 table = TEST_UTIL.createTable(tableName, FAMILY, HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE);
61 TEST_UTIL.waitTableAvailable(tableName, 1000);
62 TEST_UTIL.loadTable(table, FAMILY);
63
64 for (int i = 0; i < ServerNum; i++) {
65 HRegionServer server = cluster.getRegionServer(i);
66 for (Region region : server.getOnlineRegions(tableName)) {
67 region.flush(true);
68 }
69 }
70
71 finder.setConf(TEST_UTIL.getConfiguration());
72 finder.setServices(cluster.getMaster());
73 finder.setClusterStatus(cluster.getMaster().getClusterStatus());
74 }
75
76 @AfterClass
77 public static void tearDownAfterClass() throws Exception {
78 table.close();
79 TEST_UTIL.deleteTable(tableName);
80 TEST_UTIL.shutdownMiniCluster();
81 }
82
83 @Test
84 public void testInternalGetTopBlockLocation() throws Exception {
85 for (int i = 0; i < ServerNum; i++) {
86 HRegionServer server = cluster.getRegionServer(i);
87 for (Region region : server.getOnlineRegions(tableName)) {
88
89 List<ServerName> servers = finder.internalGetTopBlockLocation(region.getRegionInfo());
90
91 if (region.getHDFSBlocksDistribution().getUniqueBlocksTotalWeight() == 0) {
92 continue;
93 }
94 List<String> topHosts = region.getHDFSBlocksDistribution().getTopHosts();
95
96 if (!topHosts.contains(server.getServerName().getHostname())) {
97 continue;
98 }
99 for (int j = 0; j < ServerNum; j++) {
100 ServerName serverName = cluster.getRegionServer(j).getServerName();
101 assertTrue(servers.contains(serverName));
102 }
103 }
104 }
105 }
106
107 @Test
108 public void testMapHostNameToServerName() throws Exception {
109 List<String> topHosts = new ArrayList<String>();
110 for (int i = 0; i < ServerNum; i++) {
111 HRegionServer server = cluster.getRegionServer(i);
112 String serverHost = server.getServerName().getHostname();
113 if (!topHosts.contains(serverHost)) {
114 topHosts.add(serverHost);
115 }
116 }
117 List<ServerName> servers = finder.mapHostNameToServerName(topHosts);
118
119 assertEquals(1, topHosts.size());
120 for (int i = 0; i < ServerNum; i++) {
121 ServerName server = cluster.getRegionServer(i).getServerName();
122 assertTrue(servers.contains(server));
123 }
124 }
125
126 @Test
127 public void testGetTopBlockLocations() throws Exception {
128 for (int i = 0; i < ServerNum; i++) {
129 HRegionServer server = cluster.getRegionServer(i);
130 for (Region region : server.getOnlineRegions(tableName)) {
131 List<ServerName> servers = finder.getTopBlockLocations(region.getRegionInfo());
132
133 if (region.getHDFSBlocksDistribution().getUniqueBlocksTotalWeight() == 0) {
134 continue;
135 }
136 List<String> topHosts = region.getHDFSBlocksDistribution().getTopHosts();
137
138 if (!topHosts.contains(server.getServerName().getHostname())) {
139 continue;
140 }
141 for (int j = 0; j < ServerNum; j++) {
142 ServerName serverName = cluster.getRegionServer(j).getServerName();
143 assertTrue(servers.contains(serverName));
144 }
145 }
146 }
147 }
148 }