HBASE-21410 A helper page that help find all problematic regions and procedures
Signed-off-by: Guanghao Zhang <zg...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/fa637366 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/fa637366 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/fa637366 Branch: refs/heads/master Commit: fa6373660f622e7520a9f2639485cc386f18ede0 Parents: 13b4351 Author: jingyuntian <tianjy1...@gmail.com> Authored: Thu Nov 8 15:30:30 2018 +0800 Committer: Guanghao Zhang <zg...@apache.org> Committed: Fri Nov 9 14:01:49 2018 +0800 ---------------------------------------------------------------------- .../master/AssignmentManagerStatusTmpl.jamon | 2 +- .../hbase/tmpl/master/MasterStatusTmpl.jamon | 10 +- .../resources/hbase-webapps/master/rits.jsp | 120 +++++++++++++++++++ 3 files changed, 126 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/fa637366/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon index b94ba43..9c6916e 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/AssignmentManagerStatusTmpl.jamon @@ -50,7 +50,7 @@ int numOfPages = (int) Math.ceil(numOfRITs * 1.0 / ritsPerPage); </%java> <section> <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() %> <span class="label label-danger" style="font-size:100%;font-weight:normal"> <%elseif ritStat.hasRegionsOverThreshold() %> http://git-wip-us.apache.org/repos/asf/hbase/blob/fa637366/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon index f3ce3c8..03056e1 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon @@ -215,6 +215,9 @@ AssignmentManager assignmentManager = master.getAssignmentManager(); or re-run HBCK in repair mode. </div> </%if> + <%if master.getAssignmentManager() != null %> + <& AssignmentManagerStatusTmpl; assignmentManager=master.getAssignmentManager()&> + </%if> <%if master.getMasterCoprocessorHost().findCoprocessor("RSGroupAdminEndpoint") != null %> <section> <h2><a name="rsgroup">RSGroup</a></h2> @@ -267,9 +270,6 @@ AssignmentManager assignmentManager = master.getAssignmentManager(); <h2><a name="peers">Peers</a></h2> <& peerConfigs &> </section> - <%if master.getAssignmentManager() != null %> - <& AssignmentManagerStatusTmpl; assignmentManager=master.getAssignmentManager()&> - </%if> <%else> <section> <& BackupMasterStatusTmpl; master = master &> @@ -534,9 +534,9 @@ AssignmentManager assignmentManager = master.getAssignmentManager(); </%if> <td><% tableState.getState() %></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><% 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><% failedRegionsCount %></td> <td><% splitRegionsCount %></td> http://git-wip-us.apache.org/repos/asf/hbase/blob/fa637366/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp new file mode 100644 index 0000000..78bc32e --- /dev/null +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -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> +<% } %> \ No newline at end of file