You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zg...@apache.org on 2018/11/09 05:56:19 UTC

hbase git commit: HBASE-21410 A helper page that help find all problematic regions and procedures

Repository: hbase
Updated Branches:
  refs/heads/master c4b231570 -> 3c3407398


HBASE-21410 A helper page that help find all problematic regions and procedures


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/3c340739
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/3c340739
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/3c340739

Branch: refs/heads/master
Commit: 3c3407398894abf79b874480499429bd880f411b
Parents: c4b2315
Author: jingyuntian <ti...@gmail.com>
Authored: Thu Nov 8 15:30:30 2018 +0800
Committer: Guanghao Zhang <zg...@apache.org>
Committed: Fri Nov 9 13:53:00 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/3c340739/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/3c340739/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/3c340739/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