getPerServerFailuresCount() {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
index ae5c0bbdca5b..92176861b7f0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
@@ -6,9 +6,9 @@
* 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
- *
+ *
+ * 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.
@@ -17,6 +17,8 @@
*/
package org.apache.hadoop.hbase.tool;
+import java.io.IOException;
+import java.io.StringWriter;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
@@ -28,8 +30,6 @@
import org.junit.Test;
import org.junit.experimental.categories.Category;
-import java.io.IOException;
-import java.io.StringWriter;
@Category({ SmallTests.class })
public class TestCanaryStatusServlet {
From 102c8e3385a603c12a14051c75b9a1c95b4bc73b Mon Sep 17 00:00:00 2001
From: Zhuoyue Huang <215175212@qq.com>
Date: Fri, 10 Apr 2020 22:11:57 +0800
Subject: [PATCH 5/6] HBASE-23994:Add WebUI to Canary(Revise according to
comments)
---
.../hadoop/hbase/tool/CanaryStatusServlet.java | 7 +++++--
.../apache/hadoop/hbase/tool/CanaryTool.java | 18 +++++++++---------
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
index 510ee4b228b2..1ea6abbddd78 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
@@ -27,7 +27,6 @@
import org.apache.yetus.audience.InterfaceAudience;
-
@InterfaceAudience.Private
public class CanaryStatusServlet extends HttpServlet {
@Override
@@ -36,7 +35,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
CanaryTool.RegionStdOutSink sink =
(CanaryTool.RegionStdOutSink) getServletContext().getAttribute(
"sink");
- assert sink != null : "No tool in context!";
+
+ if (sink == null) {
+ throw new ServletException(
+ "RegionStdOutSink is null! The CanaryTool's InfoServer is not initialized correctly");
+ }
resp.setContentType("text/html");
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java
index db11e3ade0ae..ed59ab70d6ba 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryTool.java
@@ -131,28 +131,28 @@ public class CanaryTool implements Tool, Canary {
public static final String HBASE_CANARY_INFO_BINDADDRESS = "hbase.canary.info.bindAddress";
+ private InfoServer infoServer;
private void putUpWebUI() throws IOException {
+ int port = conf.getInt(HBASE_CANARY_INFO_PORT, DEFAULT_CANARY_INFOPORT);
+ // -1 is for disabling info server
+ if (port < 0) {
+ return;
+ }
if (zookeeperMode) {
LOG.info("WebUI is not supported in Zookeeper mode");
} else if (regionServerMode) {
LOG.info("WebUI is not supported in RegionServer mode");
} else {
- Configuration conf = new Configuration();
- int port = conf.getInt(HBASE_CANARY_INFO_PORT, DEFAULT_CANARY_INFOPORT);
- // -1 is for disabling info server
- if (port < 0) {
- return;
- }
String addr = conf.get(HBASE_CANARY_INFO_BINDADDRESS, "0.0.0.0");
try {
- InfoServer infoServer = new InfoServer("canary", addr, port, false, conf);
+ infoServer = new InfoServer("canary", addr, port, false, conf);
infoServer.addUnprivilegedServlet("canary", "/canary-status", CanaryStatusServlet.class);
infoServer.setAttribute("sink", this.sink);
infoServer.start();
- LOG.info("Bind Canary http info server to port: " + port);
+ LOG.info("Bind Canary http info server to {}:{} ", addr, port);
} catch (BindException e) {
- LOG.warn("Failed binding Canary http info server to port: " + port, e);
+ LOG.warn("Failed binding Canary http info server to {}:{}", addr, port, e);
}
}
}
From d5403ea1e80986e77ca5b643c99fc5820930f6bd Mon Sep 17 00:00:00 2001
From: Zhuoyue Huang <215175212@qq.com>
Date: Mon, 13 Apr 2020 22:03:55 +0800
Subject: [PATCH 6/6] HBASE-23994:Add WebUI to Canary(Purge tabs and add
assertions to TestCanaryStatusServlet)
---
.../hbase/tmpl/tool/CanaryStatusTmpl.jamon | 50 +++++++++----------
.../hbase/tool/CanaryStatusServlet.java | 1 -
.../hbase/tool/TestCanaryStatusServlet.java | 29 +++++++++--
3 files changed, 50 insertions(+), 30 deletions(-)
diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/tool/CanaryStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/tool/CanaryStatusTmpl.jamon
index 03a33f389e8b..e2d29eef2803 100644
--- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/tool/CanaryStatusTmpl.jamon
+++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/tool/CanaryStatusTmpl.jamon
@@ -57,9 +57,9 @@ org.apache.hadoop.hbase.tool.CanaryTool.RegionStdOutSink;
-
-
- Failed Servers
+
+
+ Failed Servers
<%java>
Map perServerFailuresCount = sink.getPerServerFailuresCount();
%java>
@@ -78,28 +78,28 @@ org.apache.hadoop.hbase.tool.CanaryTool.RegionStdOutSink;
%if>
| Total Failed Servers: <% (perServerFailuresCount != null) ? perServerFailuresCount.size() : 0 %> |
-
-
- Failed Tables
- <%java>
- Map perTableFailuresCount = sink.getPerTableFailuresCount();
- %java>
-
-
- | Table |
- Failures Count |
-
- <%if (perTableFailuresCount != null && perTableFailuresCount.size() > 0)%>
- <%for Map.Entry entry : perTableFailuresCount.entrySet()%>
-
- | <% entry.getKey() %> |
- <% entry.getValue() %> |
-
- %for>
- %if>
- | Total Failed Tables: <% (perTableFailuresCount != null) ? perTableFailuresCount.size() : 0 %> |
-
-
+
+
+ Failed Tables
+ <%java>
+ Map perTableFailuresCount = sink.getPerTableFailuresCount();
+ %java>
+
+
+ | Table |
+ Failures Count |
+
+ <%if (perTableFailuresCount != null && perTableFailuresCount.size() > 0)%>
+ <%for Map.Entry entry : perTableFailuresCount.entrySet()%>
+
+ | <% entry.getKey() %> |
+ <% entry.getValue() %> |
+
+ %for>
+ %if>
+ | Total Failed Tables: <% (perTableFailuresCount != null) ? perTableFailuresCount.size() : 0 %> |
+
+
Software Attributes
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
index 1ea6abbddd78..ce214a7a2973 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/tool/CanaryStatusServlet.java
@@ -35,7 +35,6 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
CanaryTool.RegionStdOutSink sink =
(CanaryTool.RegionStdOutSink) getServletContext().getAttribute(
"sink");
-
if (sink == null) {
throw new ServletException(
"RegionStdOutSink is null! The CanaryTool's InfoServer is not initialized correctly");
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
index 92176861b7f0..56c02a52fad0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/tool/TestCanaryStatusServlet.java
@@ -26,6 +26,7 @@
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.apache.hadoop.hbase.tmpl.tool.CanaryStatusTmpl;
+import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -54,7 +55,14 @@ public void testFailures() throws IOException {
regionStdOutSink.publishReadFailure(serverName1, regionInfo1, new IOException());
regionStdOutSink.publishWriteFailure(serverName2, regionInfo2, new IOException());
CanaryStatusTmpl tmpl = new CanaryStatusTmpl();
- tmpl.render(new StringWriter(), regionStdOutSink);
+ StringWriter renderResultWriter = new StringWriter();
+ tmpl.render(renderResultWriter, regionStdOutSink);
+ String renderResult = renderResultWriter.toString();
+ Assert.assertTrue(renderResult.contains("staging-st04.server,22600"));
+ Assert.assertTrue(renderResult.contains("fakeTableName1"));
+ Assert.assertTrue(renderResult.contains("staging-st05.server,22600"));
+ Assert.assertTrue(renderResult.contains("fakeTableName2"));
+
}
@Test
@@ -68,7 +76,11 @@ public void testReadFailuresOnly() throws IOException {
regionStdOutSink.publishReadFailure(serverName1, regionInfo1, new IOException());
CanaryStatusTmpl tmpl = new CanaryStatusTmpl();
- tmpl.render(new StringWriter(), regionStdOutSink);
+ StringWriter renderResultWriter = new StringWriter();
+ tmpl.render(renderResultWriter, regionStdOutSink);
+ String renderResult = renderResultWriter.toString();
+ Assert.assertTrue(renderResult.contains("staging-st04.server,22600"));
+ Assert.assertTrue(renderResult.contains("fakeTableName1"));
}
@Test
@@ -82,14 +94,23 @@ public void testWriteFailuresOnly() throws IOException {
regionStdOutSink.publishReadFailure(serverName2, regionInfo2, new IOException());
CanaryStatusTmpl tmpl = new CanaryStatusTmpl();
- tmpl.render(new StringWriter(), regionStdOutSink);
+ StringWriter renderResultWriter = new StringWriter();
+ tmpl.render(renderResultWriter, regionStdOutSink);
+ String renderResult = renderResultWriter.toString();
+ Assert.assertTrue(renderResult.contains("staging-st05.server,22600"));
+ Assert.assertTrue(renderResult.contains("fakeTableName2"));
+
}
@Test
public void testNoFailures() throws IOException {
CanaryTool.RegionStdOutSink regionStdOutSink = new CanaryTool.RegionStdOutSink();
CanaryStatusTmpl tmpl = new CanaryStatusTmpl();
- tmpl.render(new StringWriter(), regionStdOutSink);
+ StringWriter renderResultWriter = new StringWriter();
+ tmpl.render(renderResultWriter, regionStdOutSink);
+ String renderResult = renderResultWriter.toString();
+ Assert.assertTrue(renderResult.contains("Total Failed Servers: 0"));
+ Assert.assertTrue(renderResult.contains("Total Failed Tables: 0"));
}
}