From f418917c1182e3c4521376bb648a8fc7015d9fac Mon Sep 17 00:00:00 2001 From: jingyuntian Date: Thu, 1 Nov 2018 18:21:43 +0800 Subject: [PATCH] HBASE-21410 A helper page that help find all problematic regions and procedures --- .../tmpl/master/AssignmentManagerStatusTmpl.jamon | 2 +- .../hbase/tmpl/master/MasterStatusTmpl.jamon | 12 +-- .../main/resources/hbase-webapps/master/rits.jsp | 111 +++++++++++++++++++++ 3 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 hbase-server/src/main/resources/hbase-webapps/master/rits.jsp 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);

Regions in Transition

-

<% numOfRITs %> region(s) in transition. +

<% numOfRITs %> region(s) in transition. <%if ritStat.hasRegionsTwiceOverThreshold() %> <%elseif ritStat.hasRegionsOverThreshold() %> 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 3180c56..cf183b2 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 @@ -534,12 +534,12 @@ AssignmentManager assignmentManager = master.getAssignmentManager(); <% tableState.getState() %> <% openRegionsCount %> - <% openingRegionsCount %> - <% closedRegionsCount %> - <% closingRegionsCount %> - <% offlineRegionsCount %> - <% failedRegionsCount %> - <% splitRegionsCount %> + <%if (openingRegionsCount > 0) %> <% openingRegionsCount %> <%else><% openingRegionsCount %> + <%if (closedRegionsCount > 0) %> <% closedRegionsCount %> <%else><% closedRegionsCount %> + <%if (closingRegionsCount > 0) %> <% closingRegionsCount %> <%else><% closingRegionsCount %> + <%if (offlineRegionsCount > 0) %> <% offlineRegionsCount %> <%else><% offlineRegionsCount %> + <%if (failedRegionsCount > 0) %> <% failedRegionsCount %> <%else><% failedRegionsCount %> + <%if (splitRegionsCount > 0) %> <% splitRegionsCount %> <%else><% splitRegionsCount %> <% otherRegionsCount %> <% htDesc.toStringCustomizedValues() %> 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..114e836 --- /dev/null +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -0,0 +1,111 @@ +<%-- +/** + * 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 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() { + @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")) { %> + + + +

+
+ +
+
+ + + + + + + + + <% for (RegionStateNode regionStateNode : rit) { %> + + + + + + + + <% } %> +
RegionTableRegionStateProcedureProcedureState
<%= regionStateNode.getRegionInfo().getEncodedName() %><%= regionStateNode.getRegionInfo().getTable() %><%= regionStateNode.getState() %><%= regionStateNode.getProcedure().getProcId() %><%= escapeXml(regionStateNode.getProcedure().getState().toString() + (regionStateNode.getProcedure().isBypass() ? "(Bypass)" : "")) %>
+
+ + +<% } else { %> +
+
+

+ <% + if (filter.equals("region")) { + for (RegionStateNode regionStateNode : rit) { %> + <%= regionStateNode.getRegionInfo().getEncodedName() %>
+ <% } + } else if (filter.equals("procedure")) { + for (RegionStateNode regionStateNode : rit) { %> + <%= regionStateNode.getProcedure().getProcId() %>
+ <% } + } else { %> + "Not a valid filter" + <% } %> +

+
+
+<% } %> \ No newline at end of file -- 2.7.4