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