1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.rest.model;
20
21 import com.fasterxml.jackson.annotation.JsonProperty;
22
23 import java.io.IOException;
24 import java.io.Serializable;
25 import java.util.ArrayList;
26 import java.util.List;
27
28 import javax.xml.bind.annotation.XmlAttribute;
29 import javax.xml.bind.annotation.XmlElement;
30 import javax.xml.bind.annotation.XmlElementWrapper;
31 import javax.xml.bind.annotation.XmlRootElement;
32
33 import org.apache.hadoop.hbase.classification.InterfaceAudience;
34 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
35 import org.apache.hadoop.hbase.rest.ProtobufMessageHandler;
36 import org.apache.hadoop.hbase.rest.protobuf.generated.StorageClusterStatusMessage.StorageClusterStatus;
37 import org.apache.hadoop.hbase.util.ByteStringer;
38 import org.apache.hadoop.hbase.util.Bytes;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 @XmlRootElement(name="ClusterStatus")
97 @InterfaceAudience.Private
98 public class StorageClusterStatusModel implements Serializable, ProtobufMessageHandler {
99 private static final long serialVersionUID = 1L;
100
101
102
103
104 public static class Node implements Serializable {
105 private static final long serialVersionUID = 1L;
106
107
108
109
110 public static class Region implements Serializable {
111 private static final long serialVersionUID = -1326683840086398193L;
112
113 private byte[] name;
114 private int stores;
115 private int storefiles;
116 private int storefileSizeMB;
117 private int memstoreSizeMB;
118 private int storefileIndexSizeMB;
119 private long readRequestsCount;
120 private long writeRequestsCount;
121 private int rootIndexSizeKB;
122 private int totalStaticIndexSizeKB;
123 private int totalStaticBloomSizeKB;
124 private long totalCompactingKVs;
125 private long currentCompactedKVs;
126
127
128
129
130 public Region() {
131 }
132
133
134
135
136
137 public Region(byte[] name) {
138 this.name = name;
139 }
140
141
142
143
144
145
146
147
148
149
150 public Region(byte[] name, int stores, int storefiles,
151 int storefileSizeMB, int memstoreSizeMB, int storefileIndexSizeMB,
152 long readRequestsCount, long writeRequestsCount, int rootIndexSizeKB,
153 int totalStaticIndexSizeKB, int totalStaticBloomSizeKB,
154 long totalCompactingKVs, long currentCompactedKVs) {
155 this.name = name;
156 this.stores = stores;
157 this.storefiles = storefiles;
158 this.storefileSizeMB = storefileSizeMB;
159 this.memstoreSizeMB = memstoreSizeMB;
160 this.storefileIndexSizeMB = storefileIndexSizeMB;
161 this.readRequestsCount = readRequestsCount;
162 this.writeRequestsCount = writeRequestsCount;
163 this.rootIndexSizeKB = rootIndexSizeKB;
164 this.totalStaticIndexSizeKB = totalStaticIndexSizeKB;
165 this.totalStaticBloomSizeKB = totalStaticBloomSizeKB;
166 this.totalCompactingKVs = totalCompactingKVs;
167 this.currentCompactedKVs = currentCompactedKVs;
168 }
169
170
171
172
173 @XmlAttribute
174 public byte[] getName() {
175 return name;
176 }
177
178
179
180
181 @XmlAttribute
182 public int getStores() {
183 return stores;
184 }
185
186
187
188
189 @XmlAttribute
190 public int getStorefiles() {
191 return storefiles;
192 }
193
194
195
196
197 @XmlAttribute
198 public int getStorefileSizeMB() {
199 return storefileSizeMB;
200 }
201
202
203
204
205 @XmlAttribute
206 public int getMemstoreSizeMB() {
207 return memstoreSizeMB;
208 }
209
210
211
212
213 @XmlAttribute
214 public int getStorefileIndexSizeMB() {
215 return storefileIndexSizeMB;
216 }
217
218
219
220
221 @XmlAttribute
222 public long getReadRequestsCount() {
223 return readRequestsCount;
224 }
225
226
227
228
229 @XmlAttribute
230 public long getWriteRequestsCount() {
231 return writeRequestsCount;
232 }
233
234
235
236
237 @XmlAttribute
238 public int getRootIndexSizeKB() {
239 return rootIndexSizeKB;
240 }
241
242
243
244
245 @XmlAttribute
246 public int getTotalStaticIndexSizeKB() {
247 return totalStaticIndexSizeKB;
248 }
249
250
251
252
253 @XmlAttribute
254 public int getTotalStaticBloomSizeKB() {
255 return totalStaticBloomSizeKB;
256 }
257
258
259
260
261 @XmlAttribute
262 public long getTotalCompactingKVs() {
263 return totalCompactingKVs;
264 }
265
266
267
268
269 @XmlAttribute
270 public long getCurrentCompactedKVs() {
271 return currentCompactedKVs;
272 }
273
274
275
276
277 public void setReadRequestsCount(long readRequestsCount) {
278 this.readRequestsCount = readRequestsCount;
279 }
280
281
282
283
284
285 public void setRootIndexSizeKB(int rootIndexSizeKB) {
286 this.rootIndexSizeKB = rootIndexSizeKB;
287 }
288
289
290
291
292 public void setWriteRequestsCount(long writeRequestsCount) {
293 this.writeRequestsCount = writeRequestsCount;
294 }
295
296
297
298
299
300 public void setCurrentCompactedKVs(long currentCompactedKVs) {
301 this.currentCompactedKVs = currentCompactedKVs;
302 }
303
304
305
306
307
308 public void setTotalCompactingKVs(long totalCompactingKVs) {
309 this.totalCompactingKVs = totalCompactingKVs;
310 }
311
312
313
314
315
316 public void setTotalStaticBloomSizeKB(int totalStaticBloomSizeKB) {
317 this.totalStaticBloomSizeKB = totalStaticBloomSizeKB;
318 }
319
320
321
322
323
324 public void setTotalStaticIndexSizeKB(int totalStaticIndexSizeKB) {
325 this.totalStaticIndexSizeKB = totalStaticIndexSizeKB;
326 }
327
328
329
330
331 public void setName(byte[] name) {
332 this.name = name;
333 }
334
335
336
337
338 public void setStores(int stores) {
339 this.stores = stores;
340 }
341
342
343
344
345 public void setStorefiles(int storefiles) {
346 this.storefiles = storefiles;
347 }
348
349
350
351
352 public void setStorefileSizeMB(int storefileSizeMB) {
353 this.storefileSizeMB = storefileSizeMB;
354 }
355
356
357
358
359 public void setMemstoreSizeMB(int memstoreSizeMB) {
360 this.memstoreSizeMB = memstoreSizeMB;
361 }
362
363
364
365
366 public void setStorefileIndexSizeMB(int storefileIndexSizeMB) {
367 this.storefileIndexSizeMB = storefileIndexSizeMB;
368 }
369 }
370
371 private String name;
372 private long startCode;
373 private long requests;
374 private int heapSizeMB;
375 private int maxHeapSizeMB;
376 private List<Region> regions = new ArrayList<>();
377
378
379
380
381
382 public void addRegion(byte[] name, int stores, int storefiles,
383 int storefileSizeMB, int memstoreSizeMB, int storefileIndexSizeMB,
384 long readRequestsCount, long writeRequestsCount, int rootIndexSizeKB,
385 int totalStaticIndexSizeKB, int totalStaticBloomSizeKB,
386 long totalCompactingKVs, long currentCompactedKVs) {
387 regions.add(new Region(name, stores, storefiles, storefileSizeMB,
388 memstoreSizeMB, storefileIndexSizeMB, readRequestsCount,
389 writeRequestsCount, rootIndexSizeKB, totalStaticIndexSizeKB,
390 totalStaticBloomSizeKB, totalCompactingKVs, currentCompactedKVs));
391 }
392
393
394
395
396
397 public Region getRegion(int index) {
398 return regions.get(index);
399 }
400
401
402
403
404 public Node() {}
405
406
407
408
409
410
411 public Node(String name, long startCode) {
412 this.name = name;
413 this.startCode = startCode;
414 }
415
416
417
418
419 @XmlAttribute
420 public String getName() {
421 return name;
422 }
423
424
425
426
427 @XmlAttribute
428 public long getStartCode() {
429 return startCode;
430 }
431
432
433
434
435 @XmlAttribute
436 public int getHeapSizeMB() {
437 return heapSizeMB;
438 }
439
440
441
442
443 @XmlAttribute
444 public int getMaxHeapSizeMB() {
445 return maxHeapSizeMB;
446 }
447
448
449
450
451 @XmlElement(name="Region")
452 public List<Region> getRegions() {
453 return regions;
454 }
455
456
457
458
459 @XmlAttribute
460 public long getRequests() {
461 return requests;
462 }
463
464
465
466
467 public void setName(String name) {
468 this.name = name;
469 }
470
471
472
473
474 public void setStartCode(long startCode) {
475 this.startCode = startCode;
476 }
477
478
479
480
481 public void setHeapSizeMB(int heapSizeMB) {
482 this.heapSizeMB = heapSizeMB;
483 }
484
485
486
487
488 public void setMaxHeapSizeMB(int maxHeapSizeMB) {
489 this.maxHeapSizeMB = maxHeapSizeMB;
490 }
491
492
493
494
495 public void setRegions(List<Region> regions) {
496 this.regions = regions;
497 }
498
499
500
501
502 public void setRequests(long requests) {
503 this.requests = requests;
504 }
505 }
506
507 private List<Node> liveNodes = new ArrayList<>();
508 private List<String> deadNodes = new ArrayList<>();
509 private int regions;
510 private long requests;
511 private double averageLoad;
512
513
514
515
516
517
518
519
520 public Node addLiveNode(String name, long startCode, int heapSizeMB, int maxHeapSizeMB) {
521 Node node = new Node(name, startCode);
522 node.setHeapSizeMB(heapSizeMB);
523 node.setMaxHeapSizeMB(maxHeapSizeMB);
524 liveNodes.add(node);
525 return node;
526 }
527
528
529
530
531
532 public Node getLiveNode(int index) {
533 return liveNodes.get(index);
534 }
535
536
537
538
539
540 public void addDeadNode(String node) {
541 deadNodes.add(node);
542 }
543
544
545
546
547
548 public String getDeadNode(int index) {
549 return deadNodes.get(index);
550 }
551
552
553
554
555 public StorageClusterStatusModel() {
556 }
557
558
559
560
561 @XmlElement(name = "Node")
562 @XmlElementWrapper(name = "LiveNodes")
563
564 @JsonProperty("LiveNodes")
565 public List<Node> getLiveNodes() {
566 return liveNodes;
567 }
568
569
570
571
572 @XmlElement(name = "Node")
573 @XmlElementWrapper(name = "DeadNodes")
574
575 @JsonProperty("DeadNodes")
576 public List<String> getDeadNodes() {
577 return deadNodes;
578 }
579
580
581
582
583 @XmlAttribute
584 public int getRegions() {
585 return regions;
586 }
587
588
589
590
591
592 @XmlAttribute
593 public long getRequests() {
594 return requests;
595 }
596
597
598
599
600 @XmlAttribute
601 public double getAverageLoad() {
602 return averageLoad;
603 }
604
605
606
607
608 public void setLiveNodes(List<Node> nodes) {
609 this.liveNodes = nodes;
610 }
611
612
613
614
615 public void setDeadNodes(List<String> nodes) {
616 this.deadNodes = nodes;
617 }
618
619
620
621
622 public void setRegions(int regions) {
623 this.regions = regions;
624 }
625
626
627
628
629 public void setRequests(int requests) {
630 this.requests = requests;
631 }
632
633
634
635
636 public void setAverageLoad(double averageLoad) {
637 this.averageLoad = averageLoad;
638 }
639
640 @Override
641 public String toString() {
642 StringBuilder sb = new StringBuilder();
643 sb.append(String.format("%d live servers, %d dead servers, " +
644 "%.4f average load%n%n", liveNodes.size(), deadNodes.size(),
645 averageLoad));
646 if (!liveNodes.isEmpty()) {
647 sb.append(liveNodes.size());
648 sb.append(" live servers\n");
649 for (Node node : liveNodes) {
650 sb.append(" ");
651 sb.append(node.name);
652 sb.append(' ');
653 sb.append(node.startCode);
654 sb.append("\n requests=");
655 sb.append(node.requests);
656 sb.append(", regions=");
657 sb.append(node.regions.size());
658 sb.append("\n heapSizeMB=");
659 sb.append(node.heapSizeMB);
660 sb.append("\n maxHeapSizeMB=");
661 sb.append(node.maxHeapSizeMB);
662 sb.append("\n\n");
663 for (Node.Region region : node.regions) {
664 sb.append(" ");
665 sb.append(Bytes.toString(region.name));
666 sb.append("\n stores=");
667 sb.append(region.stores);
668 sb.append("\n storefiless=");
669 sb.append(region.storefiles);
670 sb.append("\n storefileSizeMB=");
671 sb.append(region.storefileSizeMB);
672 sb.append("\n memstoreSizeMB=");
673 sb.append(region.memstoreSizeMB);
674 sb.append("\n storefileIndexSizeMB=");
675 sb.append(region.storefileIndexSizeMB);
676 sb.append("\n readRequestsCount=");
677 sb.append(region.readRequestsCount);
678 sb.append("\n writeRequestsCount=");
679 sb.append(region.writeRequestsCount);
680 sb.append("\n rootIndexSizeKB=");
681 sb.append(region.rootIndexSizeKB);
682 sb.append("\n totalStaticIndexSizeKB=");
683 sb.append(region.totalStaticIndexSizeKB);
684 sb.append("\n totalStaticBloomSizeKB=");
685 sb.append(region.totalStaticBloomSizeKB);
686 sb.append("\n totalCompactingKVs=");
687 sb.append(region.totalCompactingKVs);
688 sb.append("\n currentCompactedKVs=");
689 sb.append(region.currentCompactedKVs);
690 sb.append('\n');
691 }
692 sb.append('\n');
693 }
694 }
695 if (!deadNodes.isEmpty()) {
696 sb.append('\n');
697 sb.append(deadNodes.size());
698 sb.append(" dead servers\n");
699 for (String node : deadNodes) {
700 sb.append(" ");
701 sb.append(node);
702 sb.append('\n');
703 }
704 }
705 return sb.toString();
706 }
707
708 @Override
709 public byte[] createProtobufOutput() {
710 StorageClusterStatus.Builder builder = StorageClusterStatus.newBuilder();
711 builder.setRegions(regions);
712 builder.setRequests(requests);
713 builder.setAverageLoad(averageLoad);
714 for (Node node : liveNodes) {
715 StorageClusterStatus.Node.Builder nodeBuilder =
716 StorageClusterStatus.Node.newBuilder();
717 nodeBuilder.setName(node.name);
718 nodeBuilder.setStartCode(node.startCode);
719 nodeBuilder.setRequests(node.requests);
720 nodeBuilder.setHeapSizeMB(node.heapSizeMB);
721 nodeBuilder.setMaxHeapSizeMB(node.maxHeapSizeMB);
722 for (Node.Region region : node.regions) {
723 StorageClusterStatus.Region.Builder regionBuilder =
724 StorageClusterStatus.Region.newBuilder();
725 regionBuilder.setName(ByteStringer.wrap(region.name));
726 regionBuilder.setStores(region.stores);
727 regionBuilder.setStorefiles(region.storefiles);
728 regionBuilder.setStorefileSizeMB(region.storefileSizeMB);
729 regionBuilder.setMemstoreSizeMB(region.memstoreSizeMB);
730 regionBuilder.setStorefileIndexSizeMB(region.storefileIndexSizeMB);
731 regionBuilder.setReadRequestsCount(region.readRequestsCount);
732 regionBuilder.setWriteRequestsCount(region.writeRequestsCount);
733 regionBuilder.setRootIndexSizeKB(region.rootIndexSizeKB);
734 regionBuilder.setTotalStaticIndexSizeKB(region.totalStaticIndexSizeKB);
735 regionBuilder.setTotalStaticBloomSizeKB(region.totalStaticBloomSizeKB);
736 regionBuilder.setTotalCompactingKVs(region.totalCompactingKVs);
737 regionBuilder.setCurrentCompactedKVs(region.currentCompactedKVs);
738 nodeBuilder.addRegions(regionBuilder);
739 }
740 builder.addLiveNodes(nodeBuilder);
741 }
742 for (String node : deadNodes) {
743 builder.addDeadNodes(node);
744 }
745 return builder.build().toByteArray();
746 }
747
748 @Override
749 public ProtobufMessageHandler getObjectFromMessage(byte[] message) throws IOException {
750 StorageClusterStatus.Builder builder = StorageClusterStatus.newBuilder();
751 ProtobufUtil.mergeFrom(builder, message);
752 if (builder.hasRegions()) {
753 regions = builder.getRegions();
754 }
755 if (builder.hasRequests()) {
756 requests = builder.getRequests();
757 }
758 if (builder.hasAverageLoad()) {
759 averageLoad = builder.getAverageLoad();
760 }
761 for (StorageClusterStatus.Node node : builder.getLiveNodesList()) {
762 long startCode = node.hasStartCode() ? node.getStartCode() : -1;
763 StorageClusterStatusModel.Node nodeModel =
764 addLiveNode(node.getName(), startCode, node.getHeapSizeMB(),
765 node.getMaxHeapSizeMB());
766 long requests = node.hasRequests() ? node.getRequests() : 0;
767 nodeModel.setRequests(requests);
768 for (StorageClusterStatus.Region region : node.getRegionsList()) {
769 nodeModel.addRegion(
770 region.getName().toByteArray(),
771 region.getStores(),
772 region.getStorefiles(),
773 region.getStorefileSizeMB(),
774 region.getMemstoreSizeMB(),
775 region.getStorefileIndexSizeMB(),
776 region.getReadRequestsCount(),
777 region.getWriteRequestsCount(),
778 region.getRootIndexSizeKB(),
779 region.getTotalStaticIndexSizeKB(),
780 region.getTotalStaticBloomSizeKB(),
781 region.getTotalCompactingKVs(),
782 region.getCurrentCompactedKVs());
783 }
784 }
785 for (String node : builder.getDeadNodesList()) {
786 addDeadNode(node);
787 }
788 return this;
789 }
790 }