2121 import =" static org.apache.commons.lang3.StringEscapeUtils.escapeXml"
2222 import =" java.util.Collections"
2323 import =" java.util.Comparator"
24+ import =" java.util.ArrayList"
2425 import =" java.util.List"
26+ import =" java.util.HashMap"
27+ import =" java.util.Map"
2528 import =" java.util.stream.Collectors"
2629 import =" org.apache.hadoop.hbase.master.HMaster"
30+ import =" org.apache.hadoop.hbase.master.RegionState"
2731 import =" org.apache.hadoop.hbase.master.assignment.RegionStateNode"
2832 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"
2935%>
3036<%
3137 HMaster master = (HMaster ) getServletContext(). getAttribute(HMaster . MASTER );
6975 <div class =" page-header" >
7076 <a href =" /rits.jsp?format=txt&filter=region&table=<%= table % > &state=<%= state % >" class =" btn btn-primary" >Regions in text format</a >
7177 <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 >
7279 <p >regions and procedures in text format can be copied and passed to command-line utils such as hbck2</p >
7380 </div >
7481 </div >
7986 <th >Region</th >
8087 <th >Table</th >
8188 <th >RegionState</th >
89+ <th >Server</th >
8290 <th >Procedure</th >
8391 <th >ProcedureState</th >
92+ <th >Start Time</th >
93+ <th >Duration (ms)</th >
8494 </tr >
8595 <% for (RegionStateNode regionStateNode : rit) { % >
8696 <tr >
8797 <td ><%= regionStateNode. getRegionInfo(). getEncodedName() % > </td >
8898 <td ><%= regionStateNode. getRegionInfo(). getTable() % > </td >
8999 <td ><%= regionStateNode. getState() % > </td >
100+ <td ><%= regionStateNode. getRegionLocation(). getServerName() % > </td >
90101 <%
91102 TransitRegionStateProcedure procedure = regionStateNode. getProcedure();
92103
98109 <td ><%= procedure. getProcId() % > </td >
99110 <td ><%= escapeXml(procedure. getState(). toString() + (procedure. isBypass() ? " (Bypassed)" : " " )) % > </td >
100111 <% } % >
112+
113+ <% RegionState rs = regionStateNode. toRegionState(); % >
114+ <td ><%= rs. getStamp() % > </td >
115+ <td ><%= System . currentTimeMillis() - rs. getStamp() % > </td >
101116 </tr >
102117 <% } % >
103118 <p ><%= rit. size() % > region(s) in transition.</p >
107122 <% } % >
108123</div >
109124<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) % >
111149<% } else { % >
112150<div class =" container-fluid content" >
113151 <div class =" row" >
127165 </p >
128166 </div >
129167</div >
130- <% } % >
168+ <% } % >
0 commit comments