1
2
3
4 package org.apache.hadoop.hbase.tmpl.master;
5
6
7 import org.apache.hadoop.hbase.HRegionInfo;
8
9 import org.apache.hadoop.hbase.master.AssignmentManager;
10
11 import org.apache.hadoop.hbase.master.RegionState;
12
13 import org.apache.hadoop.conf.Configuration;
14
15 import org.apache.hadoop.hbase.HBaseConfiguration;
16
17 import org.apache.hadoop.hbase.HConstants;
18
19 import java.util.SortedSet;
20
21 import java.util.Iterator;
22
23 import java.util.List;
24
25 import java.util.ArrayList;
26
27 import java.util.Set;
28
29 import java.util.HashSet;
30
31 import java.lang.Integer;
32
33 import java.util.Map;
34
35 import java.util.concurrent.atomic.AtomicInteger;
36
37 public class AssignmentManagerStatusTmplImpl
38 extends org.jamon.AbstractTemplateImpl
39 implements org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl.Intf
40
41 {
42 private final AssignmentManager assignmentManager;
43 private final int limit;
44 protected static org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl.ImplData p_implData)
45 {
46 if(! p_implData.getLimit__IsNotDefault())
47 {
48 p_implData.setLimit(Integer.MAX_VALUE);
49 }
50 return p_implData;
51 }
52 public AssignmentManagerStatusTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl.ImplData p_implData)
53 {
54 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
55 assignmentManager = p_implData.getAssignmentManager();
56 limit = p_implData.getLimit();
57 }
58
59 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
60 throws java.io.IOException
61 {
62
63 SortedSet<RegionState> rit = assignmentManager
64 .getRegionStates().getRegionsInTransitionOrderedByTimestamp();
65 Map<String, AtomicInteger> failedRegionTracker = assignmentManager.getFailedOpenTracker();
66
67
68 if (!rit.isEmpty() )
69 {
70
71 jamonWriter.write("\n");
72
73
74 Set<String> ritsOverThreshold = new HashSet<>();
75 Set<String> ritsTwiceThreshold = new HashSet<>();
76
77 Configuration conf = HBaseConfiguration.create();
78 int ritThreshold = conf.getInt(HConstants.METRICS_RIT_STUCK_WARNING_THRESHOLD, 60000);
79 int numOfRITOverThreshold = 0;
80 long currentTime = System.currentTimeMillis();
81 List<RegionState> ritToDisplay = new ArrayList<>();
82 int count = 0;
83 for (RegionState rs : rit) {
84 long ritTime = currentTime - rs.getStamp();
85 if(ritTime > (ritThreshold * 2)) {
86 numOfRITOverThreshold++;
87 ritsTwiceThreshold.add(rs.getRegion().getEncodedName());
88 } else if (ritTime > ritThreshold) {
89 numOfRITOverThreshold++;
90 ritsOverThreshold.add(rs.getRegion().getEncodedName());
91 }
92 if (count++ < limit) {
93 ritToDisplay.add(rs);
94 }
95 }
96 int numOfRITs = rit.size();
97 int ritsPerPage = Math.min(5, numOfRITs);
98 int numOfPages = (int) Math.ceil(numOfRITs * 1.0 / ritsPerPage);
99
100
101 jamonWriter.write("<section>\n <h2>Regions in Transition</h2>\n <p>");
102
103 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(numOfRITs), jamonWriter);
104
105 jamonWriter.write(" region(s) in transition.\n ");
106
107 if (!ritsTwiceThreshold.isEmpty() )
108 {
109
110 jamonWriter.write("\n <span class=\"label label-danger\" style=\"font-size:100%;font-weight:normal\">\n ");
111 }
112
113 else if (!ritsOverThreshold.isEmpty() )
114 {
115
116 jamonWriter.write("\n <span class=\"label label-warning\" style=\"font-size:100%;font-weight:normal\">\n ");
117 }
118
119 else
120 {
121
122 jamonWriter.write("\n <span>\n ");
123 }
124
125 jamonWriter.write("\n ");
126
127 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(numOfRITOverThreshold), jamonWriter);
128
129 jamonWriter.write(" region(s) in transition for\n more than ");
130
131 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(ritThreshold), jamonWriter);
132
133 jamonWriter.write(" milliseconds.\n </span>\n </p>\n <div class=\"tabbable\">\n <div class=\"tab-content\">\n ");
134
135 int recordItr = 0;
136
137 for (RegionState rs : ritToDisplay )
138 {
139
140 jamonWriter.write("\n ");
141
142 if ((recordItr % ritsPerPage) == 0 )
143 {
144
145 jamonWriter.write("\n ");
146
147 if (recordItr == 0 )
148 {
149
150 jamonWriter.write("\n <div class=\"tab-pane active\" id=\"tab_rits");
151
152 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf((recordItr / ritsPerPage) + 1), jamonWriter);
153
154 jamonWriter.write("\">\n ");
155 }
156
157 else
158 {
159
160 jamonWriter.write("\n <div class=\"tab-pane\" id=\"tab_rits");
161
162 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf((recordItr / ritsPerPage) + 1), jamonWriter);
163
164 jamonWriter.write("\">\n ");
165 }
166
167 jamonWriter.write("\n <table class=\"table table-striped\" style=\"margin-bottom:0px;\"><tr><th>Region</th>\n <th>State</th><th>RIT time (ms)</th><th>Retries </th></tr>\n ");
168 }
169
170 jamonWriter.write("\n\n ");
171
172 if (ritsOverThreshold.contains(rs.getRegion().getEncodedName()) )
173 {
174
175 jamonWriter.write("\n <tr class=\"alert alert-warning\" role=\"alert\">\n ");
176 }
177
178 else if (ritsTwiceThreshold.contains(rs.getRegion().getEncodedName()) )
179 {
180
181 jamonWriter.write("\n <tr class=\"alert alert-danger\" role=\"alert\">\n ");
182 }
183
184 else
185 {
186
187 jamonWriter.write("\n <tr>\n ");
188 }
189
190 jamonWriter.write("\n ");
191
192
193 String retryStatus = "0";
194 AtomicInteger numOpenRetries = failedRegionTracker.get(
195 rs.getRegion().getEncodedName());
196 if (numOpenRetries != null ) {
197 retryStatus = Integer.toString(numOpenRetries.get());
198 } else if (rs.getState() == RegionState.State.FAILED_OPEN) {
199 retryStatus = "Failed";
200 }
201
202
203 jamonWriter.write("<td>");
204
205 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(rs.getRegion().getEncodedName()), jamonWriter);
206
207 jamonWriter.write("</td><td>\n ");
208
209 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(rs.toDescriptiveString()), jamonWriter);
210
211 jamonWriter.write("</td>\n <td>");
212
213 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf((currentTime - rs.getStamp())), jamonWriter);
214
215 jamonWriter.write(" </td>\n <td>");
216
217 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(retryStatus), jamonWriter);
218
219 jamonWriter.write(" </td>\n ");
220
221 recordItr++;
222
223 if ((recordItr % ritsPerPage) == 0 )
224 {
225
226 jamonWriter.write("\n </table>\n </div>\n ");
227 }
228
229 jamonWriter.write("\n ");
230 }
231
232 jamonWriter.write("\n ");
233
234 if ((recordItr % ritsPerPage) != 0 )
235 {
236
237 jamonWriter.write("\n ");
238
239 for (; (recordItr % ritsPerPage) != 0 ; recordItr++ )
240 {
241
242 jamonWriter.write("\n <tr><td colspan=\"3\" style=\"height:61px\"></td></tr>\n ");
243 }
244
245 jamonWriter.write("\n </table>\n </div>\n ");
246 }
247
248 jamonWriter.write("\n </div>\n <nav>\n <ul class=\"nav nav-pills pagination\">\n ");
249
250 for (int i = 1 ; i <= numOfPages; i++ )
251 {
252
253 jamonWriter.write("\n ");
254
255 if (i == 1 )
256 {
257
258 jamonWriter.write("\n <li class=\"active\">\n ");
259 }
260
261 else
262 {
263
264 jamonWriter.write("\n <li>\n ");
265 }
266
267 jamonWriter.write("\n <a href=\"#tab_rits");
268
269 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(i), jamonWriter);
270
271 jamonWriter.write("\">");
272
273 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(i), jamonWriter);
274
275 jamonWriter.write("</a></li>\n ");
276 }
277
278 jamonWriter.write("\n </ul>\n </nav>\n </div>\n </section>\n ");
279 }
280
281 jamonWriter.write("\n\n");
282 }
283
284
285 }