Skip to content

Commit 944108c

Browse files
virajjasaniopeninx
authored andcommitted
HBASE-22903 : Table to RegionStatesCount metrics - Use for broken alter_status command (#611)
Signed-off-by: huzheng <openinx@gmail.com>
1 parent ca0d9f3 commit 944108c

File tree

10 files changed

+466
-10
lines changed

10 files changed

+466
-10
lines changed

hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetrics.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.List;
2424
import java.util.Map;
2525
import org.apache.hadoop.hbase.client.RegionInfo;
26+
import org.apache.hadoop.hbase.client.RegionStatesCount;
2627
import org.apache.hadoop.hbase.master.RegionState;
2728
import org.apache.yetus.audience.InterfaceAudience;
2829

@@ -152,6 +153,14 @@ default double getAverageLoad() {
152153
return (double)getRegionCount() / (double)serverSize;
153154
}
154155

156+
/**
157+
* Provide region states count for given table.
158+
* e.g howmany regions of give table are opened/closed/rit etc
159+
*
160+
* @return map of table to region states count
161+
*/
162+
Map<TableName, RegionStatesCount> getTableRegionStatesCount();
163+
155164
/**
156165
* Kinds of ClusterMetrics
157166
*/
@@ -199,6 +208,10 @@ enum Option {
199208
/**
200209
* metrics about live region servers name
201210
*/
202-
SERVERS_NAME
211+
SERVERS_NAME,
212+
/**
213+
* metrics about table to no of regions status count
214+
*/
215+
TABLE_TO_REGIONS_COUNT,
203216
}
204217
}

hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetricsBuilder.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.util.Map;
2727
import java.util.TreeMap;
2828
import java.util.stream.Collectors;
29+
30+
import org.apache.hadoop.hbase.client.RegionStatesCount;
2931
import org.apache.hadoop.hbase.master.RegionState;
3032
import org.apache.yetus.audience.InterfaceAudience;
3133

@@ -70,7 +72,14 @@ public static ClusterStatusProtos.ClusterStatus toClusterStatus(ClusterMetrics m
7072
.collect(Collectors.toList()))
7173
.setMasterInfoPort(metrics.getMasterInfoPort())
7274
.addAllServersName(metrics.getServersName().stream().map(ProtobufUtil::toServerName)
73-
.collect(Collectors.toList()));
75+
.collect(Collectors.toList()))
76+
.addAllTableRegionStatesCount(metrics.getTableRegionStatesCount().entrySet().stream()
77+
.map(status ->
78+
ClusterStatusProtos.TableRegionStatesCount.newBuilder()
79+
.setTableName(ProtobufUtil.toProtoTableName((status.getKey())))
80+
.setRegionStatesCount(ProtobufUtil.toTableRegionStatesCount(status.getValue()))
81+
.build())
82+
.collect(Collectors.toList()));
7483
if (metrics.getMasterName() != null) {
7584
builder.setMaster(ProtobufUtil.toServerName((metrics.getMasterName())));
7685
}
@@ -108,7 +117,12 @@ public static ClusterMetrics toClusterMetrics(
108117
.map(HBaseProtos.Coprocessor::getName)
109118
.collect(Collectors.toList()))
110119
.setServerNames(proto.getServersNameList().stream().map(ProtobufUtil::toServerName)
111-
.collect(Collectors.toList()));
120+
.collect(Collectors.toList()))
121+
.setTableRegionStatesCount(
122+
proto.getTableRegionStatesCountList().stream()
123+
.collect(Collectors.toMap(
124+
e -> ProtobufUtil.toTableName(e.getTableName()),
125+
e -> ProtobufUtil.toTableRegionStatesCount(e.getRegionStatesCount()))));
112126
if (proto.hasClusterId()) {
113127
builder.setClusterId(ClusterId.convert(proto.getClusterId()).toString());
114128
}
@@ -149,6 +163,7 @@ public static ClusterMetrics.Option toOption(ClusterStatusProtos.Option option)
149163
case BALANCER_ON: return ClusterMetrics.Option.BALANCER_ON;
150164
case SERVERS_NAME: return ClusterMetrics.Option.SERVERS_NAME;
151165
case MASTER_INFO_PORT: return ClusterMetrics.Option.MASTER_INFO_PORT;
166+
case TABLE_TO_REGIONS_COUNT: return ClusterMetrics.Option.TABLE_TO_REGIONS_COUNT;
152167
// should not reach here
153168
default: throw new IllegalArgumentException("Invalid option: " + option);
154169
}
@@ -172,6 +187,7 @@ public static ClusterStatusProtos.Option toOption(ClusterMetrics.Option option)
172187
case BALANCER_ON: return ClusterStatusProtos.Option.BALANCER_ON;
173188
case SERVERS_NAME: return Option.SERVERS_NAME;
174189
case MASTER_INFO_PORT: return ClusterStatusProtos.Option.MASTER_INFO_PORT;
190+
case TABLE_TO_REGIONS_COUNT: return ClusterStatusProtos.Option.TABLE_TO_REGIONS_COUNT;
175191
// should not reach here
176192
default: throw new IllegalArgumentException("Invalid option: " + option);
177193
}
@@ -214,6 +230,7 @@ public static ClusterMetricsBuilder newBuilder() {
214230
private Boolean balancerOn;
215231
private int masterInfoPort;
216232
private List<ServerName> serversName = Collections.emptyList();
233+
private Map<TableName, RegionStatesCount> tableRegionStatesCount = Collections.emptyMap();
217234

218235
private ClusterMetricsBuilder() {
219236
}
@@ -263,6 +280,13 @@ public ClusterMetricsBuilder setServerNames(List<ServerName> serversName) {
263280
this.serversName = serversName;
264281
return this;
265282
}
283+
284+
public ClusterMetricsBuilder setTableRegionStatesCount(
285+
Map<TableName, RegionStatesCount> tableRegionStatesCount) {
286+
this.tableRegionStatesCount = tableRegionStatesCount;
287+
return this;
288+
}
289+
266290
public ClusterMetrics build() {
267291
return new ClusterMetricsImpl(
268292
hbaseVersion,
@@ -275,7 +299,9 @@ public ClusterMetrics build() {
275299
masterCoprocessorNames,
276300
balancerOn,
277301
masterInfoPort,
278-
serversName);
302+
serversName,
303+
tableRegionStatesCount
304+
);
279305
}
280306
private static class ClusterMetricsImpl implements ClusterMetrics {
281307
@Nullable
@@ -293,6 +319,7 @@ private static class ClusterMetricsImpl implements ClusterMetrics {
293319
private final Boolean balancerOn;
294320
private final int masterInfoPort;
295321
private final List<ServerName> serversName;
322+
private final Map<TableName, RegionStatesCount> tableRegionStatesCount;
296323

297324
ClusterMetricsImpl(String hbaseVersion, List<ServerName> deadServerNames,
298325
Map<ServerName, ServerMetrics> liveServerMetrics,
@@ -303,7 +330,8 @@ private static class ClusterMetricsImpl implements ClusterMetrics {
303330
List<String> masterCoprocessorNames,
304331
Boolean balancerOn,
305332
int masterInfoPort,
306-
List<ServerName> serversName) {
333+
List<ServerName> serversName,
334+
Map<TableName, RegionStatesCount> tableRegionStatesCount) {
307335
this.hbaseVersion = hbaseVersion;
308336
this.deadServerNames = Preconditions.checkNotNull(deadServerNames);
309337
this.liveServerMetrics = Preconditions.checkNotNull(liveServerMetrics);
@@ -315,6 +343,7 @@ private static class ClusterMetricsImpl implements ClusterMetrics {
315343
this.balancerOn = balancerOn;
316344
this.masterInfoPort = masterInfoPort;
317345
this.serversName = serversName;
346+
this.tableRegionStatesCount = Preconditions.checkNotNull(tableRegionStatesCount);
318347
}
319348

320349
@Override
@@ -372,6 +401,11 @@ public List<ServerName> getServersName() {
372401
return Collections.unmodifiableList(serversName);
373402
}
374403

404+
@Override
405+
public Map<TableName, RegionStatesCount> getTableRegionStatesCount() {
406+
return Collections.unmodifiableMap(tableRegionStatesCount);
407+
}
408+
375409
@Override
376410
public String toString() {
377411
StringBuilder sb = new StringBuilder(1024);
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/*
2+
*
3+
* Licensed to the Apache Software Foundation (ASF) under one
4+
* or more contributor license agreements. See the NOTICE file
5+
* distributed with this work for additional information
6+
* regarding copyright ownership. The ASF licenses this file
7+
* to you under the Apache License, Version 2.0 (the
8+
* "License"); you may not use this file except in compliance
9+
* with the License. You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
20+
package org.apache.hadoop.hbase.client;
21+
22+
import org.apache.yetus.audience.InterfaceAudience;
23+
24+
@InterfaceAudience.Private
25+
public final class RegionStatesCount {
26+
27+
private int openRegions;
28+
private int splitRegions;
29+
private int closedRegions;
30+
private int regionsInTransition;
31+
private int totalRegions;
32+
33+
private RegionStatesCount() {
34+
}
35+
36+
public int getClosedRegions() {
37+
return closedRegions;
38+
}
39+
40+
public int getOpenRegions() {
41+
return openRegions;
42+
}
43+
44+
public int getSplitRegions() {
45+
return splitRegions;
46+
}
47+
48+
public int getRegionsInTransition() {
49+
return regionsInTransition;
50+
}
51+
52+
public int getTotalRegions() {
53+
return totalRegions;
54+
}
55+
56+
private void setClosedRegions(int closedRegions) {
57+
this.closedRegions = closedRegions;
58+
}
59+
60+
private void setOpenRegions(int openRegions) {
61+
this.openRegions = openRegions;
62+
}
63+
64+
private void setSplitRegions(int splitRegions) {
65+
this.splitRegions = splitRegions;
66+
}
67+
68+
private void setRegionsInTransition(int regionsInTransition) {
69+
this.regionsInTransition = regionsInTransition;
70+
}
71+
72+
private void setTotalRegions(int totalRegions) {
73+
this.totalRegions = totalRegions;
74+
}
75+
76+
public static class RegionStatesCountBuilder {
77+
private int openRegions;
78+
private int splitRegions;
79+
private int closedRegions;
80+
private int regionsInTransition;
81+
private int totalRegions;
82+
83+
public RegionStatesCountBuilder setOpenRegions(int openRegions) {
84+
this.openRegions = openRegions;
85+
return this;
86+
}
87+
88+
public RegionStatesCountBuilder setSplitRegions(int splitRegions) {
89+
this.splitRegions = splitRegions;
90+
return this;
91+
}
92+
93+
public RegionStatesCountBuilder setClosedRegions(int closedRegions) {
94+
this.closedRegions = closedRegions;
95+
return this;
96+
}
97+
98+
public RegionStatesCountBuilder setRegionsInTransition(int regionsInTransition) {
99+
this.regionsInTransition = regionsInTransition;
100+
return this;
101+
}
102+
103+
public RegionStatesCountBuilder setTotalRegions(int totalRegions) {
104+
this.totalRegions = totalRegions;
105+
return this;
106+
}
107+
108+
public RegionStatesCount build() {
109+
RegionStatesCount regionStatesCount=new RegionStatesCount();
110+
regionStatesCount.setOpenRegions(openRegions);
111+
regionStatesCount.setClosedRegions(closedRegions);
112+
regionStatesCount.setRegionsInTransition(regionsInTransition);
113+
regionStatesCount.setSplitRegions(splitRegions);
114+
regionStatesCount.setTotalRegions(totalRegions);
115+
return regionStatesCount;
116+
}
117+
}
118+
119+
@Override
120+
public String toString() {
121+
final StringBuilder sb = new StringBuilder("RegionStatesCount{");
122+
sb.append("openRegions=").append(openRegions);
123+
sb.append(", splitRegions=").append(splitRegions);
124+
sb.append(", closedRegions=").append(closedRegions);
125+
sb.append(", regionsInTransition=").append(regionsInTransition);
126+
sb.append(", totalRegions=").append(totalRegions);
127+
sb.append('}');
128+
return sb.toString();
129+
}
130+
131+
@Override
132+
public boolean equals(Object o) {
133+
if (this == o) {
134+
return true;
135+
}
136+
if (o == null || getClass() != o.getClass()) {
137+
return false;
138+
}
139+
140+
RegionStatesCount that = (RegionStatesCount) o;
141+
142+
if (openRegions != that.openRegions) {
143+
return false;
144+
}
145+
if (splitRegions != that.splitRegions) {
146+
return false;
147+
}
148+
if (closedRegions != that.closedRegions) {
149+
return false;
150+
}
151+
if (regionsInTransition != that.regionsInTransition) {
152+
return false;
153+
}
154+
return totalRegions == that.totalRegions;
155+
}
156+
157+
@Override
158+
public int hashCode() {
159+
int result = openRegions;
160+
result = 31 * result + splitRegions;
161+
result = 31 * result + closedRegions;
162+
result = 31 * result + regionsInTransition;
163+
result = 31 * result + totalRegions;
164+
return result;
165+
}
166+
167+
}

hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.apache.hadoop.hbase.client.Put;
8080
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
8181
import org.apache.hadoop.hbase.client.RegionLoadStats;
82+
import org.apache.hadoop.hbase.client.RegionStatesCount;
8283
import org.apache.hadoop.hbase.client.Result;
8384
import org.apache.hadoop.hbase.client.Scan;
8485
import org.apache.hadoop.hbase.client.SnapshotDescription;
@@ -3297,4 +3298,51 @@ public static Set<String> toCompactedStoreFiles(byte[] bytes) throws IOException
32973298
}
32983299
return Collections.emptySet();
32993300
}
3301+
3302+
public static ClusterStatusProtos.RegionStatesCount toTableRegionStatesCount(
3303+
RegionStatesCount regionStatesCount) {
3304+
int openRegions = 0;
3305+
int splitRegions = 0;
3306+
int closedRegions = 0;
3307+
int regionsInTransition = 0;
3308+
int totalRegions = 0;
3309+
if (regionStatesCount != null) {
3310+
openRegions = regionStatesCount.getOpenRegions();
3311+
splitRegions = regionStatesCount.getSplitRegions();
3312+
closedRegions = regionStatesCount.getClosedRegions();
3313+
regionsInTransition = regionStatesCount.getRegionsInTransition();
3314+
totalRegions = regionStatesCount.getTotalRegions();
3315+
}
3316+
return ClusterStatusProtos.RegionStatesCount.newBuilder()
3317+
.setOpenRegions(openRegions)
3318+
.setSplitRegions(splitRegions)
3319+
.setClosedRegions(closedRegions)
3320+
.setRegionsInTransition(regionsInTransition)
3321+
.setTotalRegions(totalRegions)
3322+
.build();
3323+
}
3324+
3325+
public static RegionStatesCount toTableRegionStatesCount(
3326+
ClusterStatusProtos.RegionStatesCount regionStatesCount) {
3327+
int openRegions = 0;
3328+
int splitRegions = 0;
3329+
int closedRegions = 0;
3330+
int regionsInTransition = 0;
3331+
int totalRegions = 0;
3332+
if (regionStatesCount != null) {
3333+
closedRegions = regionStatesCount.getClosedRegions();
3334+
regionsInTransition = regionStatesCount.getRegionsInTransition();
3335+
openRegions = regionStatesCount.getOpenRegions();
3336+
splitRegions = regionStatesCount.getSplitRegions();
3337+
totalRegions = regionStatesCount.getTotalRegions();
3338+
}
3339+
return new RegionStatesCount.RegionStatesCountBuilder()
3340+
.setOpenRegions(openRegions)
3341+
.setSplitRegions(splitRegions)
3342+
.setClosedRegions(closedRegions)
3343+
.setRegionsInTransition(regionsInTransition)
3344+
.setTotalRegions(totalRegions)
3345+
.build();
3346+
}
3347+
33003348
}

0 commit comments

Comments
 (0)