1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase;
21
22 import com.google.protobuf.ByteString;
23 import org.apache.hadoop.classification.InterfaceAudience;
24 import org.apache.hadoop.classification.InterfaceStability;
25 import org.apache.hadoop.hbase.master.RegionState;
26 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
27 import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos;
28 import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos.LiveServerInfo;
29 import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos.RegionInTransition;
30 import org.apache.hadoop.hbase.protobuf.generated.FSProtos.HBaseVersionFileContent;
31 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
32 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;
33 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
34 import org.apache.hadoop.hbase.util.Bytes;
35 import org.apache.hadoop.io.VersionedWritable;
36
37 import java.util.ArrayList;
38 import java.util.Arrays;
39 import java.util.Collection;
40 import java.util.Collections;
41 import java.util.HashMap;
42 import java.util.Map;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 @InterfaceAudience.Public
64 @InterfaceStability.Evolving
65 public class ClusterStatus extends VersionedWritable {
66
67
68
69
70
71
72
73
74
75
76 private static final byte VERSION = 2;
77
78 private String hbaseVersion;
79 private Map<ServerName, ServerLoad> liveServers;
80 private Collection<ServerName> deadServers;
81 private ServerName master;
82 private Collection<ServerName> backupMasters;
83 private Map<String, RegionState> intransition;
84 private String clusterId;
85 private String[] masterCoprocessors;
86 private Boolean balancerOn;
87
88
89
90
91
92 @Deprecated
93 public ClusterStatus() {
94 super();
95 }
96
97 public ClusterStatus(final String hbaseVersion, final String clusterid,
98 final Map<ServerName, ServerLoad> servers,
99 final Collection<ServerName> deadServers,
100 final ServerName master,
101 final Collection<ServerName> backupMasters,
102 final Map<String, RegionState> rit,
103 final String[] masterCoprocessors,
104 final Boolean balancerOn) {
105 this.hbaseVersion = hbaseVersion;
106
107 this.liveServers = servers;
108 this.deadServers = deadServers;
109 this.master = master;
110 this.backupMasters = backupMasters;
111 this.intransition = rit;
112 this.clusterId = clusterid;
113 this.masterCoprocessors = masterCoprocessors;
114 this.balancerOn = balancerOn;
115 }
116
117
118
119
120 public Collection<ServerName> getDeadServerNames() {
121 return Collections.unmodifiableCollection(deadServers);
122 }
123
124
125
126
127 public int getServersSize() {
128 return liveServers.size();
129 }
130
131
132
133
134 public int getDeadServers() {
135 return deadServers.size();
136 }
137
138
139
140
141 public double getAverageLoad() {
142 int load = getRegionsCount();
143 return (double)load / (double)getServersSize();
144 }
145
146
147
148
149 public int getRegionsCount() {
150 int count = 0;
151 for (Map.Entry<ServerName, ServerLoad> e: this.liveServers.entrySet()) {
152 count += e.getValue().getNumberOfRegions();
153 }
154 return count;
155 }
156
157
158
159
160 public int getRequestsCount() {
161 int count = 0;
162 for (Map.Entry<ServerName, ServerLoad> e: this.liveServers.entrySet()) {
163 count += e.getValue().getTotalNumberOfRequests();
164 }
165 return count;
166 }
167
168
169
170
171 public String getHBaseVersion() {
172 return hbaseVersion;
173 }
174
175
176
177
178 public boolean equals(Object o) {
179 if (this == o) {
180 return true;
181 }
182 if (!(o instanceof ClusterStatus)) {
183 return false;
184 }
185 return (getVersion() == ((ClusterStatus)o).getVersion()) &&
186 getHBaseVersion().equals(((ClusterStatus)o).getHBaseVersion()) &&
187 this.liveServers.equals(((ClusterStatus)o).liveServers) &&
188 this.deadServers.containsAll(((ClusterStatus)o).deadServers) &&
189 Arrays.equals(this.masterCoprocessors,
190 ((ClusterStatus)o).masterCoprocessors) &&
191 this.master.equals(((ClusterStatus)o).master) &&
192 this.backupMasters.containsAll(((ClusterStatus)o).backupMasters);
193 }
194
195
196
197
198 public int hashCode() {
199 return VERSION + hbaseVersion.hashCode() + this.liveServers.hashCode() +
200 this.deadServers.hashCode() + this.master.hashCode() +
201 this.backupMasters.hashCode();
202 }
203
204
205 public byte getVersion() {
206 return VERSION;
207 }
208
209
210
211
212
213
214
215
216
217
218
219 public Collection<ServerName> getServerInfo() {
220 return getServers();
221 }
222
223 public Collection<ServerName> getServers() {
224 return Collections.unmodifiableCollection(this.liveServers.keySet());
225 }
226
227
228
229
230
231 public ServerName getMaster() {
232 return this.master;
233 }
234
235
236
237
238 public int getBackupMastersSize() {
239 return this.backupMasters.size();
240 }
241
242
243
244
245 public Collection<ServerName> getBackupMasters() {
246 return Collections.unmodifiableCollection(this.backupMasters);
247 }
248
249
250
251
252
253 public ServerLoad getLoad(final ServerName sn) {
254 return this.liveServers.get(sn);
255 }
256
257 public Map<String, RegionState> getRegionsInTransition() {
258 return this.intransition;
259 }
260
261 public String getClusterId() {
262 return clusterId;
263 }
264
265 public String[] getMasterCoprocessors() {
266 return masterCoprocessors;
267 }
268
269
270 public boolean isBalancerOn() {
271 return balancerOn != null && balancerOn;
272 }
273
274 public Boolean getBalancerOn(){
275 return balancerOn;
276 }
277
278
279
280
281
282
283 public ClusterStatusProtos.ClusterStatus convert() {
284 ClusterStatusProtos.ClusterStatus.Builder builder =
285 ClusterStatusProtos.ClusterStatus.newBuilder();
286 builder.setHbaseVersion(HBaseVersionFileContent.newBuilder().setVersion(getHBaseVersion()));
287
288 if (liveServers != null){
289 for (Map.Entry<ServerName, ServerLoad> entry : liveServers.entrySet()) {
290 LiveServerInfo.Builder lsi =
291 LiveServerInfo.newBuilder().setServer(ProtobufUtil.toServerName(entry.getKey()));
292 lsi.setServerLoad(entry.getValue().obtainServerLoadPB());
293 builder.addLiveServers(lsi.build());
294 }
295 }
296
297 if (deadServers != null){
298 for (ServerName deadServer : deadServers) {
299 builder.addDeadServers(ProtobufUtil.toServerName(deadServer));
300 }
301 }
302
303 if (intransition != null) {
304 for (Map.Entry<String, RegionState> rit : getRegionsInTransition().entrySet()) {
305 ClusterStatusProtos.RegionState rs = rit.getValue().convert();
306 RegionSpecifier.Builder spec =
307 RegionSpecifier.newBuilder().setType(RegionSpecifierType.REGION_NAME);
308 spec.setValue(ByteString.copyFrom(Bytes.toBytes(rit.getKey())));
309
310 RegionInTransition pbRIT =
311 RegionInTransition.newBuilder().setSpec(spec.build()).setRegionState(rs).build();
312 builder.addRegionsInTransition(pbRIT);
313 }
314 }
315
316 if (clusterId != null) {
317 builder.setClusterId(new ClusterId(clusterId).convert());
318 }
319
320 if (masterCoprocessors != null) {
321 for (String coprocessor : masterCoprocessors) {
322 builder.addMasterCoprocessors(HBaseProtos.Coprocessor.newBuilder().setName(coprocessor));
323 }
324 }
325
326 if (master != null){
327 builder.setMaster(ProtobufUtil.toServerName(getMaster()));
328 }
329
330 if (backupMasters != null) {
331 for (ServerName backup : backupMasters) {
332 builder.addBackupMasters(ProtobufUtil.toServerName(backup));
333 }
334 }
335
336 if (balancerOn != null){
337 builder.setBalancerOn(balancerOn);
338 }
339
340 return builder.build();
341 }
342
343
344
345
346
347
348
349 public static ClusterStatus convert(ClusterStatusProtos.ClusterStatus proto) {
350
351 Map<ServerName, ServerLoad> servers = null;
352 if (proto.getLiveServersList() != null) {
353 servers = new HashMap<ServerName, ServerLoad>(proto.getLiveServersList().size());
354 for (LiveServerInfo lsi : proto.getLiveServersList()) {
355 servers.put(ProtobufUtil.toServerName(
356 lsi.getServer()), new ServerLoad(lsi.getServerLoad()));
357 }
358 }
359
360 Collection<ServerName> deadServers = null;
361 if (proto.getDeadServersList() != null) {
362 deadServers = new ArrayList<ServerName>(proto.getDeadServersList().size());
363 for (HBaseProtos.ServerName sn : proto.getDeadServersList()) {
364 deadServers.add(ProtobufUtil.toServerName(sn));
365 }
366 }
367
368 Collection<ServerName> backupMasters = null;
369 if (proto.getBackupMastersList() != null) {
370 backupMasters = new ArrayList<ServerName>(proto.getBackupMastersList().size());
371 for (HBaseProtos.ServerName sn : proto.getBackupMastersList()) {
372 backupMasters.add(ProtobufUtil.toServerName(sn));
373 }
374 }
375
376 Map<String, RegionState> rit = null;
377 if (proto.getRegionsInTransitionList() != null) {
378 rit = new HashMap<String, RegionState>(proto.getRegionsInTransitionList().size());
379 for (RegionInTransition region : proto.getRegionsInTransitionList()) {
380 String key = new String(region.getSpec().getValue().toByteArray());
381 RegionState value = RegionState.convert(region.getRegionState());
382 rit.put(key, value);
383 }
384 }
385
386 String[] masterCoprocessors = null;
387 if (proto.getMasterCoprocessorsList() != null) {
388 final int numMasterCoprocessors = proto.getMasterCoprocessorsCount();
389 masterCoprocessors = new String[numMasterCoprocessors];
390 for (int i = 0; i < numMasterCoprocessors; i++) {
391 masterCoprocessors[i] = proto.getMasterCoprocessors(i).getName();
392 }
393 }
394
395 return new ClusterStatus(proto.getHbaseVersion().getVersion(),
396 ClusterId.convert(proto.getClusterId()).toString(),servers,deadServers,
397 ProtobufUtil.toServerName(proto.getMaster()),backupMasters,rit,masterCoprocessors,
398 proto.getBalancerOn());
399 }
400 }