From 18c555644831078e047f1df2ab9eb5eea9ab301f Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Tue, 27 Jul 2021 10:29:15 -0700 Subject: [PATCH 1/6] HBASE-25469 Create RIT servlet in HMaster to track more detailed RIT info not captured in metrics --- .../apache/hadoop/hbase/master/HMaster.java | 2 + .../hadoop/hbase/master/http/RitServlet.java | 93 +++++++++++++++++++ .../resources/hbase-webapps/master/rits.jsp | 21 ++++- 3 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index e6ae03a91245..342a69f401b6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -114,6 +114,7 @@ import org.apache.hadoop.hbase.master.http.MasterDumpServlet; import org.apache.hadoop.hbase.master.http.MasterRedirectServlet; import org.apache.hadoop.hbase.master.http.MasterStatusServlet; +import org.apache.hadoop.hbase.master.http.RitServlet; import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; import org.apache.hadoop.hbase.master.locking.LockManager; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerFactory; @@ -654,6 +655,7 @@ protected RSRpcServices createRpcServices() throws IOException { @Override protected void configureInfoServer() { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); + infoServer.addPrivilegedServlet("rits", "/rits", RitServlet.class); infoServer.setAttribute(MASTER, this); if (maintenanceMode) { super.configureInfoServer(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java new file mode 100644 index 000000000000..73a8590b3755 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java @@ -0,0 +1,93 @@ +/** + * + * 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. + */ +package org.apache.hadoop.hbase.master.http; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.master.RegionState; +import org.apache.hadoop.hbase.master.assignment.AssignmentManager; +import org.apache.hadoop.hbase.master.assignment.RegionStateNode; +import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure; +import org.apache.hadoop.hbase.util.GsonUtil; +import org.apache.hbase.thirdparty.com.google.gson.Gson; +import org.apache.hbase.thirdparty.org.eclipse.jetty.servlet.DefaultServlet; +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class RitServlet extends DefaultServlet { + private static final long serialVersionUID = 1L; + private static final Gson GSON = GsonUtil.createGson().create(); + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException { + HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER); + assert master != null : "No Master in context!"; + + response.setContentType("application/json"); + OutputStream os = response.getOutputStream(); + + try (PrintWriter out = new PrintWriter(os)) { + + AssignmentManager am = master.getAssignmentManager(); + if (am == null) { + out.println("AssignmentManager is not initialized"); + return; + } + + Map>> map = new HashMap<>(); + List> rits = new ArrayList<>(); + map.put("rits", rits); + for (RegionStateNode regionStateNode : am.getRegionsInTransition()) { + Map rit = new HashMap<>(); + rit.put("region", regionStateNode.getRegionInfo().getEncodedName()); + rit.put("table", regionStateNode.getRegionInfo().getTable().getNameAsString()); + rit.put("state", regionStateNode.getState()); + rit.put("server", regionStateNode.getRegionLocation().getServerName()); + + TransitRegionStateProcedure procedure = regionStateNode.getProcedure(); + if (procedure != null) { + rit.put("procedureId", procedure.getProcId()); + rit.put("procedureState", procedure.getState().toString()); + } + + RegionState rs = regionStateNode.toRegionState(); + rit.put("startTime", rs.getStamp()); + rit.put("duration", System.currentTimeMillis() - rs.getStamp()); + + rits.add(rit); + } + + if (rits.isEmpty()) { + out.write("There are currently no regions in transition."); + } else { + out.write(GSON.toJson(map)); + } + out.flush(); + } + } +} diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp index 17d0090cb6ef..dbc7b208bb4c 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -27,6 +27,7 @@ import="org.apache.hadoop.hbase.master.assignment.RegionStateNode" import="org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure" %> +<%@ page import="org.apache.hadoop.hbase.master.RegionState" %> <% HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER); List rit = master.getAssignmentManager().getRegionsInTransition(); @@ -69,24 +70,29 @@ - <% if (rit != null && rit.size() > 0) { %> + <% if (rit != null && rit.size() > 0) { %> + + + <% for (RegionStateNode regionStateNode : rit) { %> + <% TransitRegionStateProcedure procedure = regionStateNode.getProcedure(); @@ -98,13 +104,18 @@ <% } %> + + <% RegionState rs = regionStateNode.toRegionState(); %> + + <% } %>

<%= rit.size() %> region(s) in transition.

Region Table RegionStateServer Procedure ProcedureStateStart TimeDuration (ms)
<%= regionStateNode.getRegionInfo().getEncodedName() %> <%= regionStateNode.getRegionInfo().getTable() %> <%= regionStateNode.getState() %><%= regionStateNode.getRegionLocation().getServerName() %><%= procedure.getProcId() %> <%= escapeXml(procedure.getState().toString() + (procedure.isBypass() ? "(Bypassed)" : "")) %><%= rs.getStamp() %><%= System.currentTimeMillis() - rs.getStamp() %>
- <% } else { %> -

no region in transition right now.

- <% } %> + <% } else { %> +

no region in transition right now.

+ <% } %> + @@ -127,4 +138,4 @@

-<% } %> \ No newline at end of file +<% } %> From 1a78a7554713961a2812830cebb37a4540dc9f86 Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Mon, 2 Aug 2021 15:29:20 -0700 Subject: [PATCH 2/6] address review comments --- .../main/java/org/apache/hadoop/hbase/master/HMaster.java | 2 +- .../org/apache/hadoop/hbase/master/http/RitServlet.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 342a69f401b6..0e0356abd868 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -655,7 +655,7 @@ protected RSRpcServices createRpcServices() throws IOException { @Override protected void configureInfoServer() { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); - infoServer.addPrivilegedServlet("rits", "/rits", RitServlet.class); + infoServer.addPrivilegedServlet("rit", "/rit", RitServlet.class); infoServer.setAttribute(MASTER, this); if (maintenanceMode) { super.configureInfoServer(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java index 73a8590b3755..893d9ee3626d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java @@ -82,11 +82,7 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) rits.add(rit); } - if (rits.isEmpty()) { - out.write("There are currently no regions in transition."); - } else { - out.write(GSON.toJson(map)); - } + out.write(GSON.toJson(map)); out.flush(); } } From a6d234b5bbd006aa4a51a5e46094da6f821bdee8 Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Mon, 2 Aug 2021 16:19:04 -0700 Subject: [PATCH 3/6] change link --- hbase-server/src/main/resources/hbase-webapps/master/rits.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp index dbc7b208bb4c..0102a418e3df 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -70,7 +70,7 @@ From 15387222c2865ec3b66e6dd8687f729892784bff Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Tue, 3 Aug 2021 11:19:23 -0700 Subject: [PATCH 4/6] consolidiate into rit.jsp file --- .../apache/hadoop/hbase/master/HMaster.java | 2 - .../hadoop/hbase/master/http/RitServlet.java | 89 ------------------- .../resources/hbase-webapps/master/rits.jsp | 35 +++++++- 3 files changed, 33 insertions(+), 93 deletions(-) delete mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 0e0356abd868..e6ae03a91245 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -114,7 +114,6 @@ import org.apache.hadoop.hbase.master.http.MasterDumpServlet; import org.apache.hadoop.hbase.master.http.MasterRedirectServlet; import org.apache.hadoop.hbase.master.http.MasterStatusServlet; -import org.apache.hadoop.hbase.master.http.RitServlet; import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; import org.apache.hadoop.hbase.master.locking.LockManager; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerFactory; @@ -655,7 +654,6 @@ protected RSRpcServices createRpcServices() throws IOException { @Override protected void configureInfoServer() { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); - infoServer.addPrivilegedServlet("rit", "/rit", RitServlet.class); infoServer.setAttribute(MASTER, this); if (maintenanceMode) { super.configureInfoServer(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java deleted file mode 100644 index 893d9ee3626d..000000000000 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/RitServlet.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * - * 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. - */ -package org.apache.hadoop.hbase.master.http; - -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.hadoop.hbase.master.HMaster; -import org.apache.hadoop.hbase.master.RegionState; -import org.apache.hadoop.hbase.master.assignment.AssignmentManager; -import org.apache.hadoop.hbase.master.assignment.RegionStateNode; -import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure; -import org.apache.hadoop.hbase.util.GsonUtil; -import org.apache.hbase.thirdparty.com.google.gson.Gson; -import org.apache.hbase.thirdparty.org.eclipse.jetty.servlet.DefaultServlet; -import org.apache.yetus.audience.InterfaceAudience; - -@InterfaceAudience.Private -public class RitServlet extends DefaultServlet { - private static final long serialVersionUID = 1L; - private static final Gson GSON = GsonUtil.createGson().create(); - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException { - HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER); - assert master != null : "No Master in context!"; - - response.setContentType("application/json"); - OutputStream os = response.getOutputStream(); - - try (PrintWriter out = new PrintWriter(os)) { - - AssignmentManager am = master.getAssignmentManager(); - if (am == null) { - out.println("AssignmentManager is not initialized"); - return; - } - - Map>> map = new HashMap<>(); - List> rits = new ArrayList<>(); - map.put("rits", rits); - for (RegionStateNode regionStateNode : am.getRegionsInTransition()) { - Map rit = new HashMap<>(); - rit.put("region", regionStateNode.getRegionInfo().getEncodedName()); - rit.put("table", regionStateNode.getRegionInfo().getTable().getNameAsString()); - rit.put("state", regionStateNode.getState()); - rit.put("server", regionStateNode.getRegionLocation().getServerName()); - - TransitRegionStateProcedure procedure = regionStateNode.getProcedure(); - if (procedure != null) { - rit.put("procedureId", procedure.getProcId()); - rit.put("procedureState", procedure.getState().toString()); - } - - RegionState rs = regionStateNode.toRegionState(); - rit.put("startTime", rs.getStamp()); - rit.put("duration", System.currentTimeMillis() - rs.getStamp()); - - rits.add(rit); - } - - out.write(GSON.toJson(map)); - out.flush(); - } - } -} diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp index 0102a418e3df..d961d25178e9 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -21,13 +21,18 @@ import="static org.apache.commons.lang3.StringEscapeUtils.escapeXml" import="java.util.Collections" import="java.util.Comparator" + import="java.util.ArrayList" import="java.util.List" + import="java.util.HashMap" + import="java.util.Map" import="java.util.stream.Collectors" import="org.apache.hadoop.hbase.master.HMaster" + import="org.apache.hadoop.hbase.master.RegionState" import="org.apache.hadoop.hbase.master.assignment.RegionStateNode" import="org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure" + import="org.apache.hadoop.hbase.util.GsonUtil" + import="org.apache.hbase.thirdparty.com.google.gson.Gson" %> -<%@ page import="org.apache.hadoop.hbase.master.RegionState" %> <% HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER); List rit = master.getAssignmentManager().getRegionsInTransition(); @@ -70,7 +75,7 @@ @@ -118,7 +123,33 @@ +<% } else if (format.equals("json")) { %> + <% + Gson GSON = GsonUtil.createGson().create(); + Map>> map = new HashMap<>(); + List> rits = new ArrayList<>(); + map.put("rits", rits); + for (RegionStateNode regionStateNode : rit) { + Map r = new HashMap<>(); + r.put("region", regionStateNode.getRegionInfo().getEncodedName()); + r.put("table", regionStateNode.getRegionInfo().getTable().getNameAsString()); + r.put("state", regionStateNode.getState()); + r.put("server", regionStateNode.getRegionLocation().getServerName()); + TransitRegionStateProcedure procedure = regionStateNode.getProcedure(); + if (procedure != null) { + r.put("procedureId", procedure.getProcId()); + r.put("procedureState", procedure.getState().toString()); + } + + RegionState rs = regionStateNode.toRegionState(); + r.put("startTime", rs.getStamp()); + r.put("duration", System.currentTimeMillis() - rs.getStamp()); + + rits.add(r); + } + %> + <%= GSON.toJson(map) %> <% } else { %>
From cc426dcb295003ce129b1feaed0e5a7020a5b514 Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Tue, 3 Aug 2021 12:24:35 -0700 Subject: [PATCH 5/6] add filters --- hbase-server/src/main/resources/hbase-webapps/master/rits.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp index d961d25178e9..f7d361e40704 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -75,7 +75,7 @@
From 83dfb184d89c96fb0506a731448ef60512497747 Mon Sep 17 00:00:00 2001 From: Caroline Zhou Date: Wed, 4 Aug 2021 14:47:51 -0700 Subject: [PATCH 6/6] format --- .../src/main/resources/hbase-webapps/master/rits.jsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp index f7d361e40704..802a66b58906 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/rits.jsp @@ -80,7 +80,7 @@
- <% if (rit != null && rit.size() > 0) { %> + <% if (rit != null && rit.size() > 0) { %> @@ -117,9 +117,9 @@ <% } %>

<%= rit.size() %> region(s) in transition.

Region
- <% } else { %> -

no region in transition right now.

- <% } %> + <% } else { %> +

no region in transition right now.

+ <% } %>