hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From t...@apache.org
Subject svn commit: r1099198 - in /hbase/trunk: ./ src/main/jamon/ src/main/jamon/org/ src/main/jamon/org/apache/ src/main/jamon/org/apache/hbase/ src/main/jamon/org/apache/hbase/tmpl/ src/main/jamon/org/apache/hbase/tmpl/master/ src/main/jamon/org/apache/hbas...
Date Tue, 03 May 2011 19:07:01 GMT
Author: todd
Date: Tue May  3 19:07:00 2011
New Revision: 1099198

URL: http://svn.apache.org/viewvc?rev=1099198&view=rev
Log:
HBASE-3835 Switch master and region server pages to Jamon-based templates

Added:
    hbase/trunk/src/main/jamon/
    hbase/trunk/src/main/jamon/org/
    hbase/trunk/src/main/jamon/org/apache/
    hbase/trunk/src/main/jamon/org/apache/hbase/
    hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/
    hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/
    hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/MasterStatusTmpl.jamon
    hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/
    hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/RSStatusTmpl.jamon
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RSStatusServlet.java
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRSStatusServlet.java
Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/pom.xml
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/trunk/src/main/resources/hbase-webapps/master/index.html
    hbase/trunk/src/main/resources/hbase-webapps/master/master.jsp
    hbase/trunk/src/main/resources/hbase-webapps/regionserver/index.html
    hbase/trunk/src/main/resources/hbase-webapps/regionserver/regionserver.jsp

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Tue May  3 19:07:00 2011
@@ -203,6 +203,7 @@ Release 0.91.0 - Unreleased
    HBASE-3796  Per-Store Enties in Compaction Queue
    HBASE-3670  Fix error handling in get(List<Get> gets)
                (Harsh J Chouraria)
+   HBASE-3835  Switch master and region server pages to Jamon-based templates
 
   TASKS
    HBASE-3559  Move report of split to master OFF the heartbeat channel

Modified: hbase/trunk/pom.xml
URL: http://svn.apache.org/viewvc/hbase/trunk/pom.xml?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/pom.xml (original)
+++ hbase/trunk/pom.xml Tue May  3 19:07:00 2011
@@ -511,6 +511,47 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.jamon</groupId>
+        <artifactId>jamon-maven-plugin</artifactId>
+        <version>2.3.4</version>
+        <executions>
+          <execution>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>translate</goal>
+            </goals>
+            <configuration>
+              <templateSourceDir>src/main/jamon</templateSourceDir>
+              <templateOutputDir>target/generated-jamon</templateOutputDir>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-eclipse-plugin</artifactId>
+        <configuration>
+          <additionalProjectnatures>
+            <projectnature>org.jamon.project.jamonnature</projectnature>
+          </additionalProjectnatures>
+          <buildcommands>
+            <buildcommand>org.jamon.project.templateBuilder</buildcommand>
+            <buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
+            <buildcommand>org.jamon.project.markerUpdater</buildcommand>
+          </buildcommands>
+          <additionalConfig>
+             <file>
+                 <name>.settings/org.jamon.prefs</name>
+                 <content># now
+    eclipse.preferences.version=1
+    templateSourceDir=src/main/jamon
+    templateOutputDir=target/generated-jamon
+    </content>
+            </file>
+          </additionalConfig>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
@@ -771,6 +812,12 @@
       </exclusions>
     </dependency>
 
+    <dependency>
+      <groupId>org.jamon</groupId>
+      <artifactId>jamon-runtime</artifactId>
+      <version>2.3.1</version>
+    </dependency>
+
     <!-- REST dependencies -->
     <dependency>
       <groupId>com.google.protobuf</groupId>

Added: hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/MasterStatusTmpl.jamon
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/MasterStatusTmpl.jamon?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/MasterStatusTmpl.jamon (added)
+++ hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/master/MasterStatusTmpl.jamon Tue May  3 19:07:00 2011
@@ -0,0 +1,201 @@
+<%doc>
+Copyright 2011 The Apache Software Foundation
+
+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.
+</%doc>
+<%args>
+HMaster master;
+HBaseAdmin admin;
+Map<String, Integer> frags = null;
+ServerName rootLocation = null;
+ServerName metaLocation = null;
+List<ServerName> servers = null;
+boolean showAppendWarning = false;
+</%args>
+<%import>
+java.util.*;
+org.apache.hadoop.util.StringUtils;
+org.apache.hadoop.hbase.util.Bytes;
+org.apache.hadoop.hbase.util.JvmVersion;
+org.apache.hadoop.hbase.util.FSUtils;
+org.apache.hadoop.hbase.master.HMaster;
+org.apache.hadoop.hbase.HConstants;
+org.apache.hadoop.hbase.HServerLoad;
+org.apache.hadoop.hbase.ServerName;
+org.apache.hadoop.hbase.client.HBaseAdmin;
+org.apache.hadoop.hbase.client.HConnectionManager;
+org.apache.hadoop.hbase.HTableDescriptor;
+</%import>
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+<title>HBase Master: <% master.getServerName().getHostAndPort() %></title>
+<link rel="stylesheet" type="text/css" href="/static/hbase.css" />
+</head>
+<body>
+<a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
+<h1 id="page_title">Master: <% master.getServerName().getHostname() %>:<% master.getServerName().getPort() %></h1>
+<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a></p>
+
+<!-- Various warnings that cluster admins should be aware of -->
+<%if JvmVersion.isBadJvmVersion() %>
+  <div class="warning">
+  Your current JVM version <% System.getProperty("java.version") %> is known to be
+  unstable with HBase. Please see the
+  <a href="http://wiki.apache.org/hadoop/Hbase/Troubleshooting#A18">HBase wiki</a>
+  for details.
+  </div>
+</%if>
+<%if showAppendWarning %> 
+  <div class="warning">
+  You are currently running the HMaster without HDFS append support enabled.
+  This may result in data loss.
+  Please see the <a href="http://wiki.apache.org/hadoop/Hbase/HdfsSyncSupport">HBase wiki</a>
+  for details.
+  </div>
+</%if>
+
+<hr id="head_rule" />
+
+<h2>Master Attributes</h2>
+<table>
+<tr><th>Attribute Name</th><th>Value</th><th>Description</th></tr>
+<tr><td>HBase Version</td><td><% org.apache.hadoop.hbase.util.VersionInfo.getVersion() %>, r<% org.apache.hadoop.hbase.util.VersionInfo.getRevision() %></td><td>HBase version and svn revision</td></tr>
+<tr><td>HBase Compiled</td><td><% org.apache.hadoop.hbase.util.VersionInfo.getDate() %>, <% org.apache.hadoop.hbase.util.VersionInfo.getUser() %></td><td>When HBase version was compiled and by whom</td></tr>
+<tr><td>Hadoop Version</td><td><% org.apache.hadoop.util.VersionInfo.getVersion() %>, r<% org.apache.hadoop.util.VersionInfo.getRevision() %></td><td>Hadoop version and svn revision</td></tr>
+<tr><td>Hadoop Compiled</td><td><% org.apache.hadoop.util.VersionInfo.getDate() %>, <% org.apache.hadoop.util.VersionInfo.getUser() %></td><td>When Hadoop version was compiled and by whom</td></tr>
+<tr><td>HBase Root Directory</td><td><% FSUtils.getRootDir(master.getConfiguration()).toString() %></td><td>Location of HBase home directory</td></tr>
+<tr><td>HBase Cluster ID</td><td><% master.getClusterId() != null ? master.getClusterId() : "Not set" %><td>Unique identifier generated for each HBase cluster</td></tr>
+<tr><td>Load average</td><td><% StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad()) %></td><td>Average number of regions per regionserver. Naive computation.</td></tr>
+<%if frags != null %>
+        <tr><td>Fragmentation</td><td><% frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a" %></td><td>Overall fragmentation of all tables, including .META. and -ROOT-.</td></tr>
+</%if>
+<tr><td>Zookeeper Quorum</td><td><% master.getZooKeeperWatcher().getQuorum() %></td><td>Addresses of all registered ZK servers. For more, see <a href="/zk.jsp">zk dump</a>.</td></tr>
+</table>
+<%if (rootLocation != null) %>
+<& catalogTables &>
+</%if>
+<%if (metaLocation != null) %>
+<& userTables &>
+</%if>
+<%if (servers != null) %>
+<& regionServers &>
+</%if>
+</body>
+</html>
+
+
+<%def catalogTables>
+<h2>Catalog Tables</h2>
+<table>
+<tr>
+    <th>Table</th>
+    <%if (frags != null) %>
+        <th title="Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.">Frag.</th>
+    </%if>
+    <th>Description</th>
+</tr>
+<tr>
+    <td><a href="table.jsp?name=<% Bytes.toString(HConstants.ROOT_TABLE_NAME) %>"><% Bytes.toString(HConstants.ROOT_TABLE_NAME) %></a></td>
+  <%if (frags != null)%>
+        <td align="center"><% frags.get("-ROOT-") != null ? frags.get("-ROOT-").intValue() + "%" : "n/a" %></td>
+  </%if>
+    <td>The -ROOT- table holds references to all .META. regions.</td>
+</tr>
+  <%if (metaLocation != null) %>
+<tr>
+    <td><a href="table.jsp?name=<% Bytes.toString(HConstants.META_TABLE_NAME) %>"><% Bytes.toString(HConstants.META_TABLE_NAME) %></a></td>
+    <%if (frags != null)%>
+        <td align="center"><% frags.get(".META.") != null ? frags.get(".META.").intValue() + "%" : "n/a" %></td>
+    </%if>
+    <td>The .META. table holds references to all User Table regions</td>
+</tr>
+  
+  </%if>
+</table>
+</%def>
+
+<%def userTables>
+<h2>User Tables</h2>
+<%java>
+   HTableDescriptor[] tables = admin.listTables();
+   HConnectionManager.deleteConnection(admin.getConfiguration(), false);
+</%java>
+<%if (tables != null && tables.length > 0)%>
+<table>
+<tr>
+    <th>Table</th>
+<%if (frags != null) %>
+        <th title="Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.">Frag.</th>
+</%if>
+    <th>Description</th>
+</tr>
+<%for HTableDescriptor htDesc : tables%>
+<tr>
+    <td><a href=table.jsp?name=<% htDesc.getNameAsString() %>><% htDesc.getNameAsString() %></a> </td>
+    <%if (frags != null) %>
+        <td align="center"><% frags.get(htDesc.getNameAsString()) != null ? frags.get(htDesc.getNameAsString()).intValue() + "%" : "n/a" %></td>
+    </%if>
+    <td><% htDesc.toString() %></td>
+</tr>
+</%for>
+
+<p> <% tables.length %> table(s) in set.</p>
+</table>
+</%if>
+</%def>
+
+<%def regionServers>
+<h2>Region Servers</h2>
+<%if (servers != null && servers.size() > 0)%>
+<%java>
+     int totalRegions = 0;
+     int totalRequests = 0; 
+</%java>
+
+<table>
+<tr><th rowspan="<% servers.size() + 1%>"></th><th>Address</th><th>Start Code</th><th>Load</th></tr>
+<%java>
+   ServerName [] serverNames = servers.toArray(new ServerName[servers.size()]);
+     Arrays.sort(serverNames);
+     for (ServerName serverName: serverNames) {
+       // TODO: this is incorrect since this conf might differ from RS to RS
+       // or be set to 0 to get ephemeral ports
+       int infoPort = conf.getInt("hbase.regionserver.info.port", 60030);
+       String hostname = serverName.getHostname() + ":" + infoPort;
+       String hostname = serverName.getHostname() + ":60030";
+       String url = "http://" + hostname + "/";
+       HServerLoad hsl = master.getServerManager().getLoad(serverName);
+       String loadStr = hsl == null? "-": hsl.toString();
+       if (hsl != null) {
+         totalRegions += hsl.getNumberOfRegions();
+         totalRequests += hsl.getNumberOfRequests();
+       }
+       long startCode = serverName.getStartcode();
+</%java>
+<tr><td><a href="<% url %>"><% hostname %></a></td><td><% startCode %><% serverName %></td><td><% loadStr %></td></tr>
+<%java>
+    }
+</%java>
+<tr><th>Total: </th><td>servers: <% servers.size() %></td><td>&nbsp;</td><td>requests=<% totalRequests %>, regions=<% totalRegions %></td></tr>
+</table>
+
+<p>Load is requests per second and count of regions loaded</p>
+</%if>
+</%def>

Added: hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/RSStatusTmpl.jamon
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/RSStatusTmpl.jamon?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/RSStatusTmpl.jamon (added)
+++ hbase/trunk/src/main/jamon/org/apache/hbase/tmpl/regionserver/RSStatusTmpl.jamon Tue May  3 19:07:00 2011
@@ -0,0 +1,104 @@
+<%doc>
+Copyright 2011 The Apache Software Foundation
+
+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.
+</%doc>
+<%args>
+HRegionServer regionServer;
+</%args>
+<%import>
+java.util.*;
+java.io.IOException;
+org.apache.hadoop.io.Text;
+org.apache.hadoop.hbase.regionserver.HRegionServer;
+org.apache.hadoop.hbase.regionserver.HRegion;
+org.apache.hadoop.hbase.regionserver.metrics.RegionServerMetrics;
+org.apache.hadoop.hbase.util.Bytes;
+org.apache.hadoop.hbase.HConstants;
+org.apache.hadoop.hbase.HServerInfo;
+org.apache.hadoop.hbase.HServerLoad;
+org.apache.hadoop.hbase.HRegionInfo;
+</%import>
+<%java>
+  HServerInfo serverInfo = null;
+  try {
+    serverInfo = regionServer.getHServerInfo();
+  } catch (IOException e) {
+    e.printStackTrace();
+  }
+  RegionServerMetrics metrics = regionServer.getMetrics();
+  List<HRegionInfo> onlineRegions = regionServer.getOnlineRegions();
+  int interval = regionServer.getConfiguration().getInt("hbase.regionserver.msginterval", 3000)/1000;
+</%java>
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+<title>HBase Region Server: <% serverInfo.getServerAddress().getHostname() %>:<% serverInfo.getServerAddress().getPort() %></title>
+<link rel="stylesheet" type="text/css" href="/static/hbase.css" />
+</head>
+
+<body>
+<a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
+<h1 id="page_title">Region Server: <% serverInfo.getServerAddress().getHostname() %>:<% serverInfo.getServerAddress().getPort() %></h1>
+<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a></p>
+<hr id="head_rule" />
+
+<h2>Region Server Attributes</h2>
+<table>
+<tr><th>Attribute Name</th><th>Value</th><th>Description</th></tr>
+<tr><td>HBase Version</td><td><% org.apache.hadoop.hbase.util.VersionInfo.getVersion() %>, r<% org.apache.hadoop.hbase.util.VersionInfo.getRevision() %></td><td>HBase version and svn revision</td></tr>
+<tr><td>HBase Compiled</td><td><% org.apache.hadoop.hbase.util.VersionInfo.getDate() %>, <% org.apache.hadoop.hbase.util.VersionInfo.getUser() %></td><td>When HBase version was compiled and by whom</td></tr>
+<tr><td>Metrics</td><td><% metrics.toString() %></td><td>RegionServer Metrics; file and heap sizes are in megabytes</td></tr>
+<tr><td>Zookeeper Quorum</td><td><% regionServer.getZooKeeper().getQuorum() %></td><td>Addresses of all registered ZK servers</td></tr>
+</table>
+
+<h2>Online Regions</h2>
+<%if (onlineRegions != null && onlineRegions.size() > 0) %>
+<table>
+<tr><th>Region Name</th><th>Start Key</th><th>End Key</th><th>Metrics</th></tr>
+<%java>   
+  Collections.sort(onlineRegions);
+</%java>
+<%for HRegionInfo r: onlineRegions %>
+<%java> 
+        HServerLoad.RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
+</%java>
+<tr><td><% r.getRegionNameAsString() %></td>
+    <td><% Bytes.toStringBinary(r.getStartKey()) %></td><td><% Bytes.toStringBinary(r.getEndKey()) %></td>
+    <td><% load == null? "null": load.toString() %></td>
+    </tr>
+</%for>
+</table>
+<p>Region names are made of the containing table's name, a comma,
+the start key, a comma, and a randomly generated region id.  To illustrate,
+the region named
+<em>domains,apache.org,5464829424211263407</em> is party to the table 
+<em>domains</em>, has an id of <em>5464829424211263407</em> and the first key
+in the region is <em>apache.org</em>.  The <em>-ROOT-</em>
+and <em>.META.</em> 'tables' are internal sytem tables (or 'catalog' tables in db-speak).
+The -ROOT- keeps a list of all regions in the .META. table.  The .META. table
+keeps a list of all regions in the system. The empty key is used to denote
+table start and table end.  A region with an empty start key is the first region in a table.
+If region has both an empty start and an empty end key, its the only region in the table.  See
+<a href="http://hbase.org">HBase Home</a> for further explication.<p>
+<%else>
+<p>Not serving regions</p>
+</%if>
+</body>
+</html>
\ No newline at end of file

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Tue May  3 19:07:00 2011
@@ -597,6 +597,7 @@ implements HMasterInterface, HMasterRegi
    if (port >= 0) {
      String a = this.conf.get("hbase.master.info.bindAddress", "0.0.0.0");
      this.infoServer = new InfoServer(MASTER, a, port, false);
+     this.infoServer.addServlet("status", "/master-status", MasterStatusServlet.class);
      this.infoServer.setAttribute(MASTER, this);
      this.infoServer.start();
     }

Added: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java (added)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java Tue May  3 19:07:00 2011
@@ -0,0 +1,102 @@
+/**
+ * Copyright 2011 The Apache Software Foundation
+ *
+ * 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;
+
+import java.io.IOException;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hbase.tmpl.master.MasterStatusTmpl;
+
+/**
+ * The servlet responsible for rendering the index page of the
+ * master.
+ */
+public class MasterStatusServlet extends HttpServlet {
+  private static final Log LOG = LogFactory.getLog(MasterStatusServlet.class);
+  private static final long serialVersionUID = 1L;
+
+  @Override
+  public void doGet(HttpServletRequest request, HttpServletResponse response)
+    throws IOException
+  {
+    HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER);
+    assert master != null : "No Master in context!";
+    
+    Configuration conf = master.getConfiguration();
+    HBaseAdmin admin = new HBaseAdmin(conf);    
+        
+    Map<String, Integer> frags = getFragmentationInfo(master, conf);
+    
+    ServerName rootLocation = getRootLocationOrNull(master);
+    ServerName metaLocation = master.getCatalogTracker().getMetaLocation();
+    List<ServerName> servers = master.getServerManager().getOnlineServersList();
+
+    response.setContentType("text/html");
+    new MasterStatusTmpl()
+      .setFrags(frags)
+      .setShowAppendWarning(shouldShowAppendWarning(conf))
+      .setRootLocation(rootLocation)
+      .setMetaLocation(metaLocation)
+      .setServers(servers)
+      .render(response.getWriter(),
+          master, admin);
+  }
+
+  private ServerName getRootLocationOrNull(HMaster master) {
+    try {
+      return master.getCatalogTracker().getRootLocation();
+    } catch (InterruptedException e) {
+      LOG.warn("Unable to get root location", e);
+      return null;
+    }
+  }
+
+  private Map<String, Integer> getFragmentationInfo(
+      HMaster master, Configuration conf) throws IOException {
+    boolean showFragmentation = conf.getBoolean(
+        "hbase.master.ui.fragmentation.enabled", false);    
+    if (showFragmentation) {
+      return FSUtils.getTableFragmentation(master);
+    } else {
+      return null;
+    }
+  }
+
+  static boolean shouldShowAppendWarning(Configuration conf) {
+    try {
+      return !FSUtils.isAppendSupported(conf) && FSUtils.isHDFS(conf);
+    } catch (IOException e) {
+      LOG.warn("Unable to determine if append is supported", e);
+      return false;
+    }
+  }
+}

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue May  3 19:07:00 2011
@@ -1286,7 +1286,8 @@ public class HRegionServer implements HR
     while (true) {
       try {
         this.infoServer = new InfoServer("regionserver", addr, port, false);
-        this.infoServer.setAttribute("regionserver", this);
+        this.infoServer.addServlet("status", "/rs-status", RSStatusServlet.class); 
+        this.infoServer.setAttribute(REGIONSERVER, this);
         this.infoServer.start();
         break;
       } catch (BindException e) {

Added: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RSStatusServlet.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RSStatusServlet.java?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RSStatusServlet.java (added)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/RSStatusServlet.java Tue May  3 19:07:00 2011
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2011 The Apache Software Foundation
+ *
+ * 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.regionserver;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.hbase.tmpl.regionserver.RSStatusTmpl;
+
+public class RSStatusServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException
+    {
+    HRegionServer hrs = (HRegionServer)getServletContext().getAttribute(
+        HRegionServer.REGIONSERVER);
+    assert hrs != null : "No RS in context!";
+    
+    resp.setContentType("text/html");
+    new RSStatusTmpl().render(resp.getWriter(), hrs);
+  }
+
+}

Modified: hbase/trunk/src/main/resources/hbase-webapps/master/index.html
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/hbase-webapps/master/index.html?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/resources/hbase-webapps/master/index.html (original)
+++ hbase/trunk/src/main/resources/hbase-webapps/master/index.html Tue May  3 19:07:00 2011
@@ -1 +1 @@
-<meta HTTP-EQUIV="REFRESH" content="0;url=master.jsp"/>
+<meta HTTP-EQUIV="REFRESH" content="0;url=/master-status"/>

Modified: hbase/trunk/src/main/resources/hbase-webapps/master/master.jsp
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/hbase-webapps/master/master.jsp?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/resources/hbase-webapps/master/master.jsp (original)
+++ hbase/trunk/src/main/resources/hbase-webapps/master/master.jsp Tue May  3 19:07:00 2011
@@ -1,168 +1 @@
-<%@ page contentType="text/html;charset=UTF-8"
-  import="java.util.*"
-  import="org.apache.hadoop.conf.Configuration"
-  import="org.apache.hadoop.util.StringUtils"
-  import="org.apache.hadoop.hbase.util.Bytes"
-  import="org.apache.hadoop.hbase.util.JvmVersion"
-  import="org.apache.hadoop.hbase.util.FSUtils"
-  import="org.apache.hadoop.hbase.master.HMaster"
-  import="org.apache.hadoop.hbase.HConstants"
-  import="org.apache.hadoop.hbase.ServerName"
-  import="org.apache.hadoop.hbase.HServerLoad"
-  import="org.apache.hadoop.hbase.client.HBaseAdmin"
-  import="org.apache.hadoop.hbase.client.HConnectionManager"
-  import="org.apache.hadoop.hbase.HTableDescriptor" %><%
-  HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER);
-  Configuration conf = master.getConfiguration();
-  ServerName rootLocation = master.getCatalogTracker().getRootLocation();
-  boolean metaOnline = master.getCatalogTracker().getMetaLocation() != null;
-  List<ServerName> servers = master.getServerManager().getOnlineServersList();
-  int interval = conf.getInt("hbase.regionserver.msginterval", 1000)/1000;
-  if (interval == 0) {
-      interval = 1;
-  }
-  boolean showFragmentation = conf.getBoolean("hbase.master.ui.fragmentation.enabled", false);
-  Map<String, Integer> frags = null;
-  if (showFragmentation) {
-      frags = FSUtils.getTableFragmentation(master);
-  }
-%><?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
-<title>HBase Master: <%= master.getServerName().getHostAndPort() %></title>
-<link rel="stylesheet" type="text/css" href="/static/hbase.css" />
-</head>
-<body>
-<a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
-<h1 id="page_title">Master: <%=master.getServerName().getHostname()%>:<%=master.getServerName().getPort()%></h1>
-<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a></p>
-
-<!-- Various warnings that cluster admins should be aware of -->
-<% if (JvmVersion.isBadJvmVersion()) { %>
-  <div class="warning">
-  Your current JVM version <%= System.getProperty("java.version") %> is known to be
-  unstable with HBase. Please see the
-  <a href="http://wiki.apache.org/hadoop/Hbase/Troubleshooting#A18">HBase wiki</a>
-  for details.
-  </div>
-<% } %>
-<% if (!FSUtils.isAppendSupported(conf) && FSUtils.isHDFS(conf)) { %>
-  <div class="warning">
-  You are currently running the HMaster without HDFS append support enabled.
-  This may result in data loss.
-  Please see the <a href="http://wiki.apache.org/hadoop/Hbase/HdfsSyncSupport">HBase wiki</a>
-  for details.
-  </div>
-<% } %>
-
-<hr id="head_rule" />
-
-<h2>Master Attributes</h2>
-<table>
-<tr><th>Attribute Name</th><th>Value</th><th>Description</th></tr>
-<tr><td>HBase Version</td><td><%= org.apache.hadoop.hbase.util.VersionInfo.getVersion() %>, r<%= org.apache.hadoop.hbase.util.VersionInfo.getRevision() %></td><td>HBase version and svn revision</td></tr>
-<tr><td>HBase Compiled</td><td><%= org.apache.hadoop.hbase.util.VersionInfo.getDate() %>, <%= org.apache.hadoop.hbase.util.VersionInfo.getUser() %></td><td>When HBase version was compiled and by whom</td></tr>
-<tr><td>Hadoop Version</td><td><%= org.apache.hadoop.util.VersionInfo.getVersion() %>, r<%= org.apache.hadoop.util.VersionInfo.getRevision() %></td><td>Hadoop version and svn revision</td></tr>
-<tr><td>Hadoop Compiled</td><td><%= org.apache.hadoop.util.VersionInfo.getDate() %>, <%= org.apache.hadoop.util.VersionInfo.getUser() %></td><td>When Hadoop version was compiled and by whom</td></tr>
-<tr><td>HBase Root Directory</td><td><%= FSUtils.getRootDir(master.getConfiguration()).toString() %></td><td>Location of HBase home directory</td></tr>
-<tr><td>HBase Cluster ID</td><td><%= master.getClusterId() != null ? master.getClusterId() : "Not set" %><td>Unique identifier generated for each HBase cluster</td></tr>
-<tr><td>Load average</td><td><%= StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad()) %></td><td>Average number of regions per regionserver. Naive computation.</td></tr>
-<%  if (showFragmentation) { %>
-        <tr><td>Fragmentation</td><td><%= frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a" %></td><td>Overall fragmentation of all tables, including .META. and -ROOT-.</td></tr>
-<%  } %>
-<tr><td>Zookeeper Quorum</td><td><%= master.getZooKeeperWatcher().getQuorum() %></td><td>Addresses of all registered ZK servers. For more, see <a href="/zk.jsp">zk dump</a>.</td></tr>
-</table>
-
-<h2>Catalog Tables</h2>
-<% 
-  if (rootLocation != null) { %>
-<table>
-<tr>
-    <th>Table</th>
-<%  if (showFragmentation) { %>
-        <th title="Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.">Frag.</th>
-<%  } %>
-    <th>Description</th>
-</tr>
-<tr>
-    <td><a href="table.jsp?name=<%= Bytes.toString(HConstants.ROOT_TABLE_NAME) %>"><%= Bytes.toString(HConstants.ROOT_TABLE_NAME) %></a></td>
-<%  if (showFragmentation) { %>
-        <td align="center"><%= frags.get("-ROOT-") != null ? frags.get("-ROOT-").intValue() + "%" : "n/a" %></td>
-<%  } %>
-    <td>The -ROOT- table holds references to all .META. regions.</td>
-</tr>
-<%
-    if (metaOnline) { %>
-<tr>
-    <td><a href="table.jsp?name=<%= Bytes.toString(HConstants.META_TABLE_NAME) %>"><%= Bytes.toString(HConstants.META_TABLE_NAME) %></a></td>
-<%  if (showFragmentation) { %>
-        <td align="center"><%= frags.get(".META.") != null ? frags.get(".META.").intValue() + "%" : "n/a" %></td>
-<%  } %>
-    <td>The .META. table holds references to all User Table regions</td>
-</tr>
-  
-<%  } %>
-</table>
-<%} %>
-
-<h2>User Tables</h2>
-<%
-   HBaseAdmin hba = new HBaseAdmin(conf);
-   HTableDescriptor[] tables = hba.listTables();
-   HConnectionManager.deleteConnection(hba.getConfiguration(), false);
-   if(tables != null && tables.length > 0) { %>
-<table>
-<tr>
-    <th>Table</th>
-<%  if (showFragmentation) { %>
-        <th title="Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.">Frag.</th>
-<%  } %>
-    <th>Description</th>
-</tr>
-<%   for(HTableDescriptor htDesc : tables ) { %>
-<tr>
-    <td><a href=table.jsp?name=<%= htDesc.getNameAsString() %>><%= htDesc.getNameAsString() %></a> </td>
-<%  if (showFragmentation) { %>
-        <td align="center"><%= frags.get(htDesc.getNameAsString()) != null ? frags.get(htDesc.getNameAsString()).intValue() + "%" : "n/a" %></td>
-<%  } %>
-    <td><%= htDesc.toString() %></td>
-</tr>
-<%   }  %>
-
-<p> <%= tables.length %> table(s) in set.</p>
-</table>
-<% } %>
-
-<h2>Region Servers</h2>
-<% if (servers != null && servers.size() > 0) { %>
-<%   int totalRegions = 0;
-     int totalRequests = 0; 
-%>
-
-<table>
-<tr><th rowspan="<%= servers.size() + 1%>"></th><th>Address</th><th>Start Code</th><th>Load</th></tr>
-<%   ServerName [] serverNames = servers.toArray(new ServerName[servers.size()]);
-     Arrays.sort(serverNames);
-     for (ServerName serverName: serverNames) {
-       int infoPort = conf.getInt("hbase.regionserver.info.port", 60030);
-       String hostname = serverName.getHostname() + ":" + infoPort;
-       String url = "http://" + hostname + "/";
-       HServerLoad hsl = master.getServerManager().getLoad(serverName);
-       String loadStr = hsl == null? "-": hsl.toString();
-       if (hsl != null) {
-         totalRegions += hsl.getNumberOfRegions();
-         totalRequests += hsl.getNumberOfRequests();
-       }
-       long startCode = serverName.getStartcode();
-%>
-<tr><td><a href="<%= url %>"><%= hostname %></a></td><td><%= startCode %><%= serverName %></td><td><%= loadStr %></td></tr>
-<%   } %>
-<tr><th>Total: </th><td>servers: <%= servers.size() %></td><td>&nbsp;</td><td>requests=<%= totalRequests %>, regions=<%= totalRegions %></td></tr>
-</table>
-
-<p>Load is requests per second and count of regions loaded</p>
-<% } %>
-</body>
-</html>
+<meta HTTP-EQUIV="REFRESH" content="0;url=/master-status"/>

Modified: hbase/trunk/src/main/resources/hbase-webapps/regionserver/index.html
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/hbase-webapps/regionserver/index.html?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/resources/hbase-webapps/regionserver/index.html (original)
+++ hbase/trunk/src/main/resources/hbase-webapps/regionserver/index.html Tue May  3 19:07:00 2011
@@ -1 +1 @@
-<meta HTTP-EQUIV="REFRESH" content="0;url=regionserver.jsp"/>
+<meta HTTP-EQUIV="REFRESH" content="0;url=/rs-status"/>

Modified: hbase/trunk/src/main/resources/hbase-webapps/regionserver/regionserver.jsp
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/hbase-webapps/regionserver/regionserver.jsp?rev=1099198&r1=1099197&r2=1099198&view=diff
==============================================================================
--- hbase/trunk/src/main/resources/hbase-webapps/regionserver/regionserver.jsp (original)
+++ hbase/trunk/src/main/resources/hbase-webapps/regionserver/regionserver.jsp Tue May  3 19:07:00 2011
@@ -1,79 +1 @@
-<%@ page contentType="text/html;charset=UTF-8"
-  import="java.util.*"
-  import="java.io.IOException"
-  import="org.apache.hadoop.io.Text"
-  import="org.apache.hadoop.hbase.regionserver.HRegionServer"
-  import="org.apache.hadoop.hbase.regionserver.HRegion"
-  import="org.apache.hadoop.hbase.regionserver.metrics.RegionServerMetrics"
-  import="org.apache.hadoop.hbase.util.Bytes"
-  import="org.apache.hadoop.hbase.HConstants"
-  import="org.apache.hadoop.hbase.HServerInfo"
-  import="org.apache.hadoop.hbase.HServerLoad"
-  import="org.apache.hadoop.hbase.HRegionInfo" %><%
-  HRegionServer regionServer = (HRegionServer)getServletContext().getAttribute(HRegionServer.REGIONSERVER);
-  HServerInfo serverInfo = null;
-  try {
-    serverInfo = regionServer.getHServerInfo();
-  } catch (IOException e) {
-    e.printStackTrace();
-  }
-  RegionServerMetrics metrics = regionServer.getMetrics();
-  List<HRegionInfo> onlineRegions = regionServer.getOnlineRegions();
-  int interval = regionServer.getConfiguration().getInt("hbase.regionserver.msginterval", 3000)/1000;
-
-%><?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
-<title>HBase Region Server: <%= serverInfo.getServerAddress().getHostname() %>:<%= serverInfo.getServerAddress().getPort() %></title>
-<link rel="stylesheet" type="text/css" href="/static/hbase.css" />
-</head>
-
-<body>
-<a id="logo" href="http://wiki.apache.org/lucene-hadoop/Hbase"><img src="/static/hbase_logo_med.gif" alt="HBase Logo" title="HBase Logo" /></a>
-<h1 id="page_title">Region Server: <%= serverInfo.getServerAddress().getHostname() %>:<%= serverInfo.getServerAddress().getPort() %></h1>
-<p id="links_menu"><a href="/logs/">Local logs</a>, <a href="/stacks">Thread Dump</a>, <a href="/logLevel">Log Level</a></p>
-<hr id="head_rule" />
-
-<h2>Region Server Attributes</h2>
-<table>
-<tr><th>Attribute Name</th><th>Value</th><th>Description</th></tr>
-<tr><td>HBase Version</td><td><%= org.apache.hadoop.hbase.util.VersionInfo.getVersion() %>, r<%= org.apache.hadoop.hbase.util.VersionInfo.getRevision() %></td><td>HBase version and svn revision</td></tr>
-<tr><td>HBase Compiled</td><td><%= org.apache.hadoop.hbase.util.VersionInfo.getDate() %>, <%= org.apache.hadoop.hbase.util.VersionInfo.getUser() %></td><td>When HBase version was compiled and by whom</td></tr>
-<tr><td>Metrics</td><td><%= metrics.toString() %></td><td>RegionServer Metrics; file and heap sizes are in megabytes</td></tr>
-<tr><td>Zookeeper Quorum</td><td><%= regionServer.getZooKeeper().getQuorum() %></td><td>Addresses of all registered ZK servers</td></tr>
-</table>
-
-<h2>Online Regions</h2>
-<% if (onlineRegions != null && onlineRegions.size() > 0) { %>
-<table>
-<tr><th>Region Name</th><th>Start Key</th><th>End Key</th><th>Metrics</th></tr>
-<%   
-  Collections.sort(onlineRegions);
-  for (HRegionInfo r: onlineRegions) { 
-        HServerLoad.RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
- %>
-<tr><td><%= r.getRegionNameAsString() %></td>
-    <td><%= Bytes.toStringBinary(r.getStartKey()) %></td><td><%= Bytes.toStringBinary(r.getEndKey()) %></td>
-    <td><%= load == null? "null": load.toString() %></td>
-    </tr>
-<%   } %>
-</table>
-<p>Region names are made of the containing table's name, a comma,
-the start key, a comma, and a randomly generated region id.  To illustrate,
-the region named
-<em>domains,apache.org,5464829424211263407</em> is party to the table 
-<em>domains</em>, has an id of <em>5464829424211263407</em> and the first key
-in the region is <em>apache.org</em>.  The <em>-ROOT-</em>
-and <em>.META.</em> 'tables' are internal sytem tables (or 'catalog' tables in db-speak).
-The -ROOT- keeps a list of all regions in the .META. table.  The .META. table
-keeps a list of all regions in the system. The empty key is used to denote
-table start and table end.  A region with an empty start key is the first region in a table.
-If region has both an empty start and an empty end key, its the only region in the table.  See
-<a href="http://hbase.org">HBase Home</a> for further explication.<p>
-<% } else { %>
-<p>Not serving regions</p>
-<% } %>
-</body>
-</html>
+<meta HTTP-EQUIV="REFRESH" content="0;url=/rs-status"/>
\ No newline at end of file

Added: hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java (added)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/master/TestMasterStatusServlet.java Tue May  3 19:07:00 2011
@@ -0,0 +1,123 @@
+/**
+ * Copyright 2011 The Apache Software Foundation
+ *
+ * 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;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.List;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.ServerManager;
+import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+import org.apache.hbase.tmpl.master.MasterStatusTmpl;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Tests for the master status page and its template.
+ */
+public class TestMasterStatusServlet {
+  
+  private HMaster master;
+  private Configuration conf;
+  private HBaseAdmin admin;
+
+  @Before
+  public void setupBasicMocks() {
+    conf = HBaseConfiguration.create();
+    
+    master = Mockito.mock(HMaster.class);
+    Mockito.doReturn(new ServerName("fakehost", 12345, 1234567890))
+       .when(master).getServerName();
+    Mockito.doReturn(conf).when(master).getConfiguration();
+    
+    // Fake serverManager
+    ServerManager serverManager = Mockito.mock(ServerManager.class);
+    Mockito.doReturn(1.0).when(serverManager).getAverageLoad();
+    Mockito.doReturn(serverManager).when(master).getServerManager();
+
+    // Fake ZKW
+    ZooKeeperWatcher zkw = Mockito.mock(ZooKeeperWatcher.class);
+    Mockito.doReturn("fakequorum").when(zkw).getQuorum();
+    Mockito.doReturn(zkw).when(master).getZooKeeperWatcher();
+
+    // Mock admin
+    admin = Mockito.mock(HBaseAdmin.class); 
+  }
+  
+
+  private void setupMockTables() throws IOException {
+    HTableDescriptor tables[] = new HTableDescriptor[] {
+        new HTableDescriptor("foo"),
+        new HTableDescriptor("bar")
+    };
+    Mockito.doReturn(tables).when(admin).listTables();
+  }
+  
+  @Test
+  public void testStatusTemplateNoTables() throws IOException {
+    new MasterStatusTmpl().render(new StringWriter(),
+        master, admin);
+  }
+  
+  @Test
+  public void testStatusTemplateRootAvailable() throws IOException {
+    new MasterStatusTmpl()
+      .setRootLocation(new ServerName("rootserver:123,12345"))
+      .render(new StringWriter(),
+        master, admin);
+  }
+  
+  @Test
+  public void testStatusTemplateRootAndMetaAvailable() throws IOException {
+    setupMockTables();
+    
+    new MasterStatusTmpl()
+      .setRootLocation(new ServerName("rootserver:123,12345"))
+      .setMetaLocation(new ServerName("metaserver:123,12345"))
+      .render(new StringWriter(),
+        master, admin);
+  }
+
+  @Test
+  public void testStatusTemplateWithServers() throws IOException {
+    setupMockTables();
+    
+    List<ServerName> servers = Lists.newArrayList(
+        new ServerName("rootserver:123,12345"),
+        new ServerName("metaserver:123,12345"));
+                  
+    new MasterStatusTmpl()
+      .setRootLocation(new ServerName("rootserver:123,12345"))
+      .setMetaLocation(new ServerName("metaserver:123,12345"))
+      .setServers(servers)
+      .render(new StringWriter(),
+        master, admin);
+  }
+
+}

Added: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRSStatusServlet.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRSStatusServlet.java?rev=1099198&view=auto
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRSStatusServlet.java (added)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRSStatusServlet.java Tue May  3 19:07:00 2011
@@ -0,0 +1,94 @@
+/**
+ * Copyright 2011 The Apache Software Foundation
+ *
+ * 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.regionserver;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.List;
+
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HServerAddress;
+import org.apache.hadoop.hbase.HServerInfo;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.regionserver.metrics.RegionServerMetrics;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
+import org.apache.hbase.tmpl.regionserver.RSStatusTmpl;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Tests for the region server status page and its template.
+ */
+public class TestRSStatusServlet {
+  private HRegionServer rs;
+  
+  static final int FAKE_IPC_PORT = 1585;
+  static final int FAKE_WEB_PORT = 1586;
+  
+  @SuppressWarnings("deprecation")
+  private HServerAddress fakeAddress =
+    new HServerAddress("localhost", FAKE_IPC_PORT);
+  @SuppressWarnings("deprecation")
+  private HServerInfo fakeInfo =
+    new HServerInfo(fakeAddress, FAKE_WEB_PORT);
+  private RegionServerMetrics metrics =
+    new RegionServerMetrics();
+  
+  @SuppressWarnings("deprecation")
+  @Before
+  public void setupBasicMocks() throws IOException {
+    rs = Mockito.mock(HRegionServer.class);
+    Mockito.doReturn(HBaseConfiguration.create())
+      .when(rs).getConfiguration();
+    Mockito.doReturn(fakeInfo).when(rs).getHServerInfo();
+    Mockito.doReturn(metrics).when(rs).getMetrics();
+
+    // Fake ZKW
+    ZooKeeperWatcher zkw = Mockito.mock(ZooKeeperWatcher.class);
+    Mockito.doReturn("fakequorum").when(zkw).getQuorum();
+    Mockito.doReturn(zkw).when(rs).getZooKeeper();
+  }
+  
+  @Test
+  public void testBasic() throws IOException {
+    new RSStatusTmpl().render(new StringWriter(), rs);
+  }
+  
+  @Test
+  public void testWithRegions() throws IOException {
+    HTableDescriptor htd = new HTableDescriptor("mytable");
+    List<HRegionInfo> regions = Lists.newArrayList(
+        new HRegionInfo(htd, Bytes.toBytes("a"), Bytes.toBytes("d")),
+        new HRegionInfo(htd, Bytes.toBytes("d"), Bytes.toBytes("z"))
+        );
+    Mockito.doReturn(regions).when(rs).getOnlineRegions();
+    
+    new RSStatusTmpl().render(new StringWriter(), rs);    
+  }
+  
+  
+}



Mime
View raw message