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