Skip to content

Commit 3caaf2d

Browse files
authored
HBASE-28778 NPE may occur when opening master-status or table.jsp or procedure.jsp while Master is initializing (#6152)
Signed-off-by: Duo Zhang <[email protected]>
1 parent 01e2d16 commit 3caaf2d

File tree

4 files changed

+54
-25
lines changed

4 files changed

+54
-25
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/MasterStatusServlet.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
7777
private ServerName getMetaLocationOrNull(HMaster master) {
7878
RegionStateNode rsn = master.getAssignmentManager().getRegionStates()
7979
.getRegionStateNode(RegionInfoBuilder.FIRST_META_REGIONINFO);
80-
return rsn.isInState(RegionState.State.OPEN) ? rsn.getRegionLocation() : null;
80+
if (rsn != null) {
81+
return rsn.isInState(RegionState.State.OPEN) ? rsn.getRegionLocation() : null;
82+
}
83+
return null;
8184
}
8285

8386
private Map<String, Integer> getFragmentationInfo(HMaster master, Configuration conf)

hbase-server/src/main/resources/hbase-webapps/master/procedures.jsp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,28 @@
4747
<%@ page import="org.apache.hadoop.hbase.metrics.Histogram" %>
4848
<%@ page import="java.util.TreeMap" %>
4949
<%@ page import="org.apache.hadoop.hbase.metrics.impl.HistogramImpl" %>
50+
51+
<jsp:include page="header.jsp">
52+
<jsp:param name="pageTitle" value="${pageTitle}"/>
53+
</jsp:include>
54+
5055
<%
5156
HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER);
57+
if (!master.isInitialized()) {
58+
%>
59+
<div class="container-fluid content">
60+
<div class="row inner_header">
61+
<div class="page-header">
62+
<h1>Master is initializing</h1>
63+
</div>
64+
</div>
65+
<p><hr><p>
66+
<jsp:include page="redirect.jsp" />
67+
</div>
68+
<% return;
69+
} %>
70+
71+
<%
5272
ProcedureExecutor<MasterProcedureEnv> procExecutor = master.getMasterProcedureExecutor();
5373
List<Procedure<MasterProcedureEnv>> procedures = procExecutor.getProcedures();
5474
Collections.sort(procedures, new Comparator<Procedure>() {
@@ -63,9 +83,6 @@
6383
List<LockedResource> lockedResources = master.getLocks();
6484
pageContext.setAttribute("pageTitle", "HBase Master Procedures: " + master.getServerName());
6585
%>
66-
<jsp:include page="header.jsp">
67-
<jsp:param name="pageTitle" value="${pageTitle}"/>
68-
</jsp:include>
6986

7087
<div class="container-fluid content">
7188
<div class="row top_header">

hbase-server/src/main/resources/hbase-webapps/master/table.jsp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,32 @@
148148
return "";
149149
}
150150
%>
151+
152+
<jsp:include page="header.jsp">
153+
<jsp:param name="pageTitle" value="${pageTitle}"/>
154+
</jsp:include>
155+
151156
<%
152157
final String ZEROMB = "0 MB";
153158
HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER);
154159
Configuration conf = master.getConfiguration();
155160
String fqtn = request.getParameter("name");
161+
// handle the case for fqtn is null or master is not initialized with error message + redirect
162+
if (fqtn == null || !master.isInitialized()) {
163+
%>
164+
<div class="container-fluid content">
165+
<div class="row inner_header">
166+
<div class="page-header">
167+
<h1>Table not ready</h1>
168+
</div>
169+
</div>
170+
<p><hr><p>
171+
<jsp:include page="redirect.jsp" />
172+
</div>
173+
<% return;
174+
} %>
175+
176+
<%
156177
final String escaped_fqtn = StringEscapeUtils.escapeHtml4(fqtn);
157178
Table table = master.getConnection().getTable(TableName.valueOf(fqtn));
158179
boolean showFragmentation = conf.getBoolean("hbase.master.ui.fragmentation.enabled", false);
@@ -201,24 +222,6 @@
201222
final MetaBrowser metaBrowser = new MetaBrowser(connection, request);
202223
%>
203224

204-
<jsp:include page="header.jsp">
205-
<jsp:param name="pageTitle" value="${pageTitle}"/>
206-
</jsp:include>
207-
208-
<% // handle the case for fqtn is null or master is not initialized with error message + redirect
209-
if (fqtn == null || ! master.isInitialized()) { %>
210-
<div class="container-fluid content">
211-
<div class="row inner_header">
212-
<div class="page-header">
213-
<h1>Table not ready</h1>
214-
</div>
215-
</div>
216-
<p><hr><p>
217-
<jsp:include page="redirect.jsp" />
218-
</div>
219-
<% return;
220-
} %>
221-
222225
<% // unknow table
223226
if (! admin.tableExists(TableName.valueOf(fqtn)).get()) { %>
224227
<div class="container-fluid content">

hbase-server/src/main/resources/hbase-webapps/regionserver/region.jsp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,22 @@
3939
String regionName = request.getParameter("name");
4040
HRegionServer rs = (HRegionServer) getServletContext().getAttribute(HRegionServer.REGIONSERVER);
4141
FileSystem fs = rs.getFileSystem();
42-
43-
HRegion region = rs.getRegion(regionName);
42+
HRegion region = null;
43+
if (regionName != null) {
44+
region = rs.getRegion(regionName);
45+
}
4446
String displayName;
4547
boolean isReplicaRegion = false;
4648
if (region != null) {
4749
displayName = RegionInfoDisplay.getRegionNameAsStringForDisplay(region.getRegionInfo(),
4850
rs.getConfiguration());
4951
isReplicaRegion = region.getRegionInfo().getReplicaId() > RegionInfo.DEFAULT_REPLICA_ID;
5052
} else {
51-
displayName = "region {" + regionName + "} is not currently online on this region server";
53+
if (regionName != null) {
54+
displayName = "region {" + regionName + "} is not currently online on this region server";
55+
} else {
56+
displayName = "you must specify a region name when accessing this page";
57+
}
5258
}
5359
pageContext.setAttribute("pageTitle", "HBase RegionServer: " + rs.getServerName());
5460
%>

0 commit comments

Comments
 (0)