21
21
import =" static org.apache.commons.lang3.StringEscapeUtils.escapeXml"
22
22
import =" java.util.Collections"
23
23
import =" java.util.Comparator"
24
+ import =" java.util.ArrayList"
24
25
import =" java.util.List"
26
+ import =" java.util.HashMap"
27
+ import =" java.util.Map"
25
28
import =" java.util.stream.Collectors"
26
29
import =" org.apache.hadoop.hbase.master.HMaster"
30
+ import =" org.apache.hadoop.hbase.master.RegionState"
27
31
import =" org.apache.hadoop.hbase.master.assignment.RegionStateNode"
28
32
import =" org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure"
33
+ import =" org.apache.hadoop.hbase.util.GsonUtil"
34
+ import =" org.apache.hbase.thirdparty.com.google.gson.Gson"
29
35
%>
30
36
<%
31
37
HMaster master = (HMaster ) getServletContext(). getAttribute(HMaster . MASTER );
69
75
<div class =" page-header" >
70
76
<a href =" /rits.jsp?format=txt&filter=region&table=<%= table % > &state=<%= state % >" class =" btn btn-primary" >Regions in text format</a >
71
77
<a href =" /rits.jsp?format=txt&filter=procedure&table=<%= table % > &state=<%= state % >" class =" btn btn-info" >Procedures in text format</a >
78
+ <a href =" /rits.jsp?format=json&table=<%= table % > &state=<%= state % >" class =" btn btn-info" >RIT info as JSON</a >
72
79
<p >regions and procedures in text format can be copied and passed to command-line utils such as hbck2</p >
73
80
</div >
74
81
</div >
79
86
<th >Region</th >
80
87
<th >Table</th >
81
88
<th >RegionState</th >
89
+ <th >Server</th >
82
90
<th >Procedure</th >
83
91
<th >ProcedureState</th >
92
+ <th >Start Time</th >
93
+ <th >Duration (ms)</th >
84
94
</tr >
85
95
<% for (RegionStateNode regionStateNode : rit) { % >
86
96
<tr >
87
97
<td ><%= regionStateNode. getRegionInfo(). getEncodedName() % > </td >
88
98
<td ><%= regionStateNode. getRegionInfo(). getTable() % > </td >
89
99
<td ><%= regionStateNode. getState() % > </td >
100
+ <td ><%= regionStateNode. getRegionLocation(). getServerName() % > </td >
90
101
<%
91
102
TransitRegionStateProcedure procedure = regionStateNode. getProcedure();
92
103
98
109
<td ><%= procedure. getProcId() % > </td >
99
110
<td ><%= escapeXml(procedure. getState(). toString() + (procedure. isBypass() ? " (Bypassed)" : " " )) % > </td >
100
111
<% } % >
112
+
113
+ <% RegionState rs = regionStateNode. toRegionState(); % >
114
+ <td ><%= rs. getStamp() % > </td >
115
+ <td ><%= System . currentTimeMillis() - rs. getStamp() % > </td >
101
116
</tr >
102
117
<% } % >
103
118
<p ><%= rit. size() % > region(s) in transition.</p >
107
122
<% } % >
108
123
</div >
109
124
<jsp:include page =" footer.jsp" />
110
-
125
+ <% } else if (format. equals(" json" )) { % >
126
+ <%
127
+ Gson GSON = GsonUtil . createGson(). create();
128
+ Map<String , List<Map<String , Object > > > map = new HashMap<> ();
129
+ List<Map<String , Object > > rits = new ArrayList<> ();
130
+ map. put(" rits" , rits);
131
+ for (RegionStateNode regionStateNode : rit) {
132
+ Map<String , Object > r = new HashMap<> ();
133
+ r. put(" region" , regionStateNode. getRegionInfo(). getEncodedName());
134
+ r. put(" table" , regionStateNode. getRegionInfo(). getTable(). getNameAsString());
135
+ r. put(" state" , regionStateNode. getState());
136
+ r. put(" server" , regionStateNode. getRegionLocation(). getServerName());
137
+ TransitRegionStateProcedure procedure = regionStateNode. getProcedure();
138
+ if (procedure != null ) {
139
+ r. put(" procedureId" , procedure. getProcId());
140
+ r. put(" procedureState" , procedure. getState(). toString());
141
+ }
142
+ RegionState rs = regionStateNode. toRegionState();
143
+ r. put(" startTime" , rs. getStamp());
144
+ r. put(" duration" , System . currentTimeMillis() - rs. getStamp());
145
+ rits. add(r);
146
+ }
147
+ % >
148
+ <%= GSON . toJson(map) % >
111
149
<% } else { % >
112
150
<div class =" container-fluid content" >
113
151
<div class =" row" >
127
165
</p >
128
166
</div >
129
167
</div >
130
- <% } % >
168
+ <% } % >
0 commit comments