1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.util;
19
20 import org.apache.hadoop.conf.Configuration;
21 import org.apache.hadoop.hbase.ClusterStatus;
22 import org.apache.hadoop.hbase.HRegionInfo;
23 import org.apache.hadoop.hbase.HRegionLocation;
24 import org.apache.hadoop.hbase.RegionLoad;
25 import org.apache.hadoop.hbase.ServerLoad;
26 import org.apache.hadoop.hbase.ServerName;
27 import org.apache.hadoop.hbase.testclassification.SmallTests;
28 import org.apache.hadoop.hbase.client.Admin;
29 import org.apache.hadoop.hbase.TableName;
30 import org.apache.hadoop.hbase.client.RegionLocator;
31 import org.junit.Test;
32 import org.junit.experimental.categories.Category;
33 import org.mockito.Mockito;
34
35 import java.io.IOException;
36 import java.util.ArrayList;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.TreeMap;
40
41 import static org.junit.Assert.assertEquals;
42 import static org.mockito.Mockito.mock;
43 import static org.mockito.Mockito.when;
44
45 @Category(SmallTests.class)
46 public class TestRegionSizeCalculator {
47
48 private Configuration configuration = new Configuration();
49 private final long megabyte = 1024L * 1024L;
50
51 @Test
52 public void testSimpleTestCase() throws Exception {
53
54 RegionLocator regionLocator = mockRegionLocator("region1", "region2", "region3");
55
56 Admin admin = mockAdmin(
57 mockServer(
58 mockRegion("region1", 123),
59 mockRegion("region3", 1232)
60 ),
61 mockServer(
62 mockRegion("region2", 54321),
63 mockRegion("otherTableRegion", 110)
64 )
65 );
66
67 RegionSizeCalculator calculator = new RegionSizeCalculator(regionLocator, admin);
68
69 assertEquals(123 * megabyte, calculator.getRegionSize("region1".getBytes()));
70 assertEquals(54321 * megabyte, calculator.getRegionSize("region2".getBytes()));
71 assertEquals(1232 * megabyte, calculator.getRegionSize("region3".getBytes()));
72
73 assertEquals(0 * megabyte, calculator.getRegionSize("otherTableRegion".getBytes()));
74
75 assertEquals(3, calculator.getRegionSizeMap().size());
76 }
77
78
79
80
81
82
83 @Test
84 public void testLargeRegion() throws Exception {
85
86 RegionLocator regionLocator = mockRegionLocator("largeRegion");
87
88 Admin admin = mockAdmin(
89 mockServer(
90 mockRegion("largeRegion", Integer.MAX_VALUE)
91 )
92 );
93
94 RegionSizeCalculator calculator = new RegionSizeCalculator(regionLocator, admin);
95
96 assertEquals(((long) Integer.MAX_VALUE) * megabyte, calculator.getRegionSize("largeRegion".getBytes()));
97 }
98
99
100 @Test
101 public void testDisabled() throws Exception {
102 String regionName = "cz.goout:/index.html";
103 RegionLocator table = mockRegionLocator(regionName);
104
105 Admin admin = mockAdmin(
106 mockServer(
107 mockRegion(regionName, 999)
108 )
109 );
110
111
112 RegionSizeCalculator calculator = new RegionSizeCalculator(table, admin);
113 assertEquals(999 * megabyte, calculator.getRegionSize(regionName.getBytes()));
114
115
116 configuration.setBoolean(RegionSizeCalculator.ENABLE_REGIONSIZECALCULATOR, false);
117 RegionSizeCalculator disabledCalculator = new RegionSizeCalculator(table, admin);
118 assertEquals(0 * megabyte, disabledCalculator.getRegionSize(regionName.getBytes()));
119
120 assertEquals(0, disabledCalculator.getRegionSizeMap().size());
121 }
122
123
124
125
126 private RegionLocator mockRegionLocator(String... regionNames) throws IOException {
127 RegionLocator mockedTable = Mockito.mock(RegionLocator.class);
128 when(mockedTable.getName()).thenReturn(TableName.valueOf("sizeTestTable"));
129 List<HRegionLocation> regionLocations = new ArrayList<>();
130 when(mockedTable.getAllRegionLocations()).thenReturn(regionLocations);
131
132 for (String regionName : regionNames) {
133 HRegionInfo info = Mockito.mock(HRegionInfo.class);
134 when(info.getRegionName()).thenReturn(regionName.getBytes());
135 regionLocations.add(new HRegionLocation(info, null));
136 }
137
138 return mockedTable;
139 }
140
141
142
143
144 private Admin mockAdmin(ServerLoad... servers) throws Exception {
145
146 Admin mockAdmin = Mockito.mock(Admin.class);
147 ClusterStatus clusterStatus = mockCluster(servers);
148 when(mockAdmin.getConfiguration()).thenReturn(configuration);
149 when(mockAdmin.getClusterStatus()).thenReturn(clusterStatus);
150 return mockAdmin;
151 }
152
153
154
155
156
157
158 private RegionLoad mockRegion(String regionName, int fileSizeMb) {
159 RegionLoad region = Mockito.mock(RegionLoad.class);
160 when(region.getName()).thenReturn(regionName.getBytes());
161 when(region.getNameAsString()).thenReturn(regionName);
162 when(region.getStorefileSizeMB()).thenReturn(fileSizeMb);
163 return region;
164 }
165
166 private ClusterStatus mockCluster(ServerLoad[] servers) {
167 List<ServerName> serverNames = new ArrayList<ServerName>();
168
169 ClusterStatus clusterStatus = Mockito.mock(ClusterStatus.class);
170 when(clusterStatus.getServers()).thenReturn(serverNames);
171
172 int serverCounter = 0;
173 for (ServerLoad server : servers) {
174 ServerName serverName = mock(ServerName.class);
175 when(serverName.getServerName()).thenReturn("server" + (serverCounter++));
176 serverNames.add(serverName);
177 when(clusterStatus.getLoad(serverName)).thenReturn(server);
178 }
179
180 return clusterStatus;
181 }
182
183
184 private ServerLoad mockServer(RegionLoad... regions) {
185 ServerLoad serverLoad = Mockito.mock(ServerLoad.class);
186 Map<byte[], RegionLoad> regionMap = new TreeMap<byte[], RegionLoad>(Bytes.BYTES_COMPARATOR);
187
188 for (RegionLoad regionName : regions) {
189 regionMap.put(regionName.getName(), regionName);
190 }
191
192 when(serverLoad.getRegionsLoad()).thenReturn(regionMap);
193 return serverLoad;
194 }
195
196 }