HBASE-21410 A helper page that help find all problematic regions and procedures
This commit is contained in:
parent
c4b2315706
commit
3c34073988
@ -50,7 +50,7 @@ int numOfPages = (int) Math.ceil(numOfRITs * 1.0 / ritsPerPage);
|
|||||||
</%java>
|
</%java>
|
||||||
<section>
|
<section>
|
||||||
<h2><a name="rit">Regions in Transition</a></h2>
|
<h2><a name="rit">Regions in Transition</a></h2>
|
||||||
<p><% numOfRITs %> region(s) in transition.
|
<p><a href="/rits.jsp"><% numOfRITs %> region(s) in transition.</a>
|
||||||
<%if ritStat.hasRegionsTwiceOverThreshold() %>
|
<%if ritStat.hasRegionsTwiceOverThreshold() %>
|
||||||
<span class="label label-danger" style="font-size:100%;font-weight:normal">
|
<span class="label label-danger" style="font-size:100%;font-weight:normal">
|
||||||
<%elseif ritStat.hasRegionsOverThreshold() %>
|
<%elseif ritStat.hasRegionsOverThreshold() %>
|
||||||
|
@ -215,6 +215,9 @@ AssignmentManager assignmentManager = master.getAssignmentManager();
|
|||||||
or re-run HBCK in repair mode.
|
or re-run HBCK in repair mode.
|
||||||
</div>
|
</div>
|
||||||
</%if>
|
</%if>
|
||||||
|
<%if master.getAssignmentManager() != null %>
|
||||||
|
<& AssignmentManagerStatusTmpl; assignmentManager=master.getAssignmentManager()&>
|
||||||
|
</%if>
|
||||||
<%if master.getMasterCoprocessorHost().findCoprocessor("RSGroupAdminEndpoint") != null %>
|
<%if master.getMasterCoprocessorHost().findCoprocessor("RSGroupAdminEndpoint") != null %>
|
||||||
<section>
|
<section>
|
||||||
<h2><a name="rsgroup">RSGroup</a></h2>
|
<h2><a name="rsgroup">RSGroup</a></h2>
|
||||||
@ -267,9 +270,6 @@ AssignmentManager assignmentManager = master.getAssignmentManager();
|
|||||||
<h2><a name="peers">Peers</a></h2>
|
<h2><a name="peers">Peers</a></h2>
|
||||||
<& peerConfigs &>
|
<& peerConfigs &>
|
||||||
</section>
|
</section>
|
||||||
<%if master.getAssignmentManager() != null %>
|
|
||||||
<& AssignmentManagerStatusTmpl; assignmentManager=master.getAssignmentManager()&>
|
|
||||||
</%if>
|
|
||||||
<%else>
|
<%else>
|
||||||
<section>
|
<section>
|
||||||
<& BackupMasterStatusTmpl; master = master &>
|
<& BackupMasterStatusTmpl; master = master &>
|
||||||
@ -534,9 +534,9 @@ AssignmentManager assignmentManager = master.getAssignmentManager();
|
|||||||
</%if>
|
</%if>
|
||||||
<td><% tableState.getState() %></td>
|
<td><% tableState.getState() %></td>
|
||||||
<td><% openRegionsCount %></td>
|
<td><% openRegionsCount %></td>
|
||||||
<td><% openingRegionsCount %></td>
|
<%if (openingRegionsCount > 0) %> <td><a href="/rits.jsp?table=<% tableName.getNameAsString() %>&state=OPENING"><% openingRegionsCount %></td> <%else><td><% openingRegionsCount %></td> </%if>
|
||||||
<td><% closedRegionsCount %></td>
|
<td><% closedRegionsCount %></td>
|
||||||
<td><% closingRegionsCount %></td>
|
<%if (closingRegionsCount > 0) %> <td><a href="/rits.jsp?table=<% tableName.getNameAsString() %>&state=CLOSING"><% closingRegionsCount %></td> <%else><td><% closingRegionsCount %></td> </%if>
|
||||||
<td><% offlineRegionsCount %></td>
|
<td><% offlineRegionsCount %></td>
|
||||||
<td><% failedRegionsCount %></td>
|
<td><% failedRegionsCount %></td>
|
||||||
<td><% splitRegionsCount %></td>
|
<td><% splitRegionsCount %></td>
|
||||||
|
120
hbase-server/src/main/resources/hbase-webapps/master/rits.jsp
Normal file
120
hbase-server/src/main/resources/hbase-webapps/master/rits.jsp
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<%--
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
--%>
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8"
|
||||||
|
import="static org.apache.commons.lang3.StringEscapeUtils.escapeXml"
|
||||||
|
import="java.util.Collections"
|
||||||
|
import="java.util.Comparator"
|
||||||
|
import="java.util.List"
|
||||||
|
import="org.apache.hadoop.hbase.master.HMaster"
|
||||||
|
import="org.apache.hadoop.hbase.master.assignment.RegionStateNode"
|
||||||
|
%>
|
||||||
|
<%@ page import="java.util.stream.Collectors" %>
|
||||||
|
<%
|
||||||
|
HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER);
|
||||||
|
List<RegionStateNode> rit = master.getAssignmentManager().getRegionsInTransition();
|
||||||
|
String table = request.getParameter("table");
|
||||||
|
String state = request.getParameter("state");
|
||||||
|
if (table != null && state != null && !table.equals("null") && !state.equals("null")) {
|
||||||
|
rit = rit.stream().filter(regionStateNode -> regionStateNode.getTable().getNameAsString().equals(table))
|
||||||
|
.filter(regionStateNode -> regionStateNode.getState().name().equals(state))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
String format = request.getParameter("format");
|
||||||
|
if(format == null || format.isEmpty()){
|
||||||
|
format = "html";
|
||||||
|
}
|
||||||
|
String filter = request.getParameter("filter");
|
||||||
|
Collections.sort(rit, new Comparator<RegionStateNode>() {
|
||||||
|
@Override
|
||||||
|
public int compare(RegionStateNode o1, RegionStateNode o2) {
|
||||||
|
if (o1.getState() != o2.getState()){
|
||||||
|
return o1.getState().ordinal() - o2.getState().ordinal();
|
||||||
|
}
|
||||||
|
return o1.compareTo(o2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
%>
|
||||||
|
|
||||||
|
|
||||||
|
<% if (format.equals("html")) { %>
|
||||||
|
<jsp:include page="header.jsp">
|
||||||
|
<jsp:param name="pageTitle" value="${pageTitle}"/>
|
||||||
|
</jsp:include>
|
||||||
|
<div class="container-fluid content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="page-header">
|
||||||
|
<h1>Regions in transition</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="page-header">
|
||||||
|
<a href="/rits.jsp?format=txt&filter=region&table=<%=table%>&state=<%=state%>" class="btn btn-primary">Regions in text format</a>
|
||||||
|
<a href="/rits.jsp?format=txt&filter=procedure&table=<%=table%>&state=<%=state%>" class="btn btn-info">Procedures in text format</a>
|
||||||
|
<p>regions and procedures in text format can be copied and passed to command-line utils such as hbck2</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% if (rit != null && rit.size() > 0) { %>
|
||||||
|
<table class="table table-striped">
|
||||||
|
<tr>
|
||||||
|
<th>Region</th>
|
||||||
|
<th>Table</th>
|
||||||
|
<th>RegionState</th>
|
||||||
|
<th>Procedure</th>
|
||||||
|
<th>ProcedureState</th>
|
||||||
|
</tr>
|
||||||
|
<% for (RegionStateNode regionStateNode : rit) { %>
|
||||||
|
<tr>
|
||||||
|
<td><%= regionStateNode.getRegionInfo().getEncodedName() %></td>
|
||||||
|
<td><%= regionStateNode.getRegionInfo().getTable() %></td>
|
||||||
|
<td><%= regionStateNode.getState() %></td>
|
||||||
|
<td><%= regionStateNode.getProcedure().getProcId() %></td>
|
||||||
|
<td><%= escapeXml(regionStateNode.getProcedure().getState().toString() + (regionStateNode.getProcedure().isBypass() ? "(Bypassed)" : "")) %></td>
|
||||||
|
</tr>
|
||||||
|
<% } %>
|
||||||
|
<p><%= rit.size() %> region(s) in transition.</p>
|
||||||
|
</table>
|
||||||
|
<% } else { %>
|
||||||
|
<p> no region in transition right now. </p>
|
||||||
|
<% } %>
|
||||||
|
</div>
|
||||||
|
<jsp:include page="footer.jsp" />
|
||||||
|
|
||||||
|
<% } else { %>
|
||||||
|
<div class="container-fluid content">
|
||||||
|
<div class="row">
|
||||||
|
<p>
|
||||||
|
<%
|
||||||
|
if (filter.equals("region")) {
|
||||||
|
for (RegionStateNode regionStateNode : rit) { %>
|
||||||
|
<%= regionStateNode.getRegionInfo().getEncodedName() %><br>
|
||||||
|
<% }
|
||||||
|
} else if (filter.equals("procedure")) {
|
||||||
|
for (RegionStateNode regionStateNode : rit) { %>
|
||||||
|
<%= regionStateNode.getProcedure().getProcId() %><br>
|
||||||
|
<% }
|
||||||
|
} else { %>
|
||||||
|
"Not a valid filter"
|
||||||
|
<% } %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
Loading…
x
Reference in New Issue
Block a user