Author: jxiang
Date: Fri Apr 11 15:59:26 2014
New Revision: 1586705

URL: http://svn.apache.org/r1586705
Log:
HBASE-10897 On master start, deadlock if refresh UI

Modified:
    
hbase/trunk/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
    
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
    
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
    
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java

Modified: 
hbase/trunk/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon?rev=1586705&r1=1586704&r2=1586705&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
 (original)
+++ 
hbase/trunk/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon
 Fri Apr 11 15:59:26 2014
@@ -198,7 +198,9 @@ AssignmentManager assignmentManager = ma
                 </div>
             </div>
         </section>
+        <%if master.getAssignmentManager() != null %>
         <& AssignmentManagerStatusTmpl; 
assignmentManager=master.getAssignmentManager()&>
+        </%if>
        <%else>
         <section>
             <& BackupMasterStatusTmpl; master = master &>
@@ -266,7 +268,8 @@ AssignmentManager assignmentManager = ma
                        </tr>
                        <tr>
                            <td>Load average</td>
-                           <td><% 
StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad()) %></td>
+                           <td><% master.getServerManager() == null ? "0.00" :
+                             
StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad()) %></td>
                            <td>Average number of regions per regionserver. 
Naive computation.</td>
                        </tr>
                        <%if frags != null %>
@@ -278,7 +281,8 @@ AssignmentManager assignmentManager = ma
                        </%if>
                        <tr>
                            <td>Coprocessors</td>
-                           <td><% 
java.util.Arrays.toString(master.getMasterCoprocessors()) %></td>
+                           <td><% master.getMasterCoprocessorHost() == null ? 
"[]" :
+                             
java.util.Arrays.toString(master.getMasterCoprocessors()) %></td>
                            <td>Coprocessors currently loaded by the master</td>
                        </tr>
                 </%if>
@@ -295,10 +299,10 @@ AssignmentManager assignmentManager = ma
 
 <%def catalogTables>
 <%java>
- HTableDescriptor[] sysTables = 
admin.listTableDescriptorsByNamespace(NamespaceDescriptor
- .SYSTEM_NAMESPACE_NAME_STR);
+ HTableDescriptor[] sysTables = master.isInitialized() ? 
admin.listTableDescriptorsByNamespace(
+   NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR) : null;
 </%java>
-
+<%if (sysTables != null && sysTables.length > 0)%>
 <table class="table table-striped">
 <tr>
     <th>Table Name</th>
@@ -326,11 +330,12 @@ AssignmentManager assignmentManager = ma
 </tr>
 </%for>
 </table>
+</%if>
 </%def>
 
 <%def userTables>
 <%java>
-   HTableDescriptor[] tables = admin.listTables();
+   HTableDescriptor[] tables = master.isInitialized() ? admin.listTables() : 
null;
 </%java>
 <%if (tables != null && tables.length > 0)%>
 <table class="table table-striped">
@@ -360,7 +365,7 @@ AssignmentManager assignmentManager = ma
 
 <%def userSnapshots>
 <%java>
-   List<SnapshotDescription> snapshots = admin.listSnapshots();
+   List<SnapshotDescription> snapshots = master.isInitialized() ? 
admin.listSnapshots() : null;
 </%java>
 <%if (snapshots != null && snapshots.size() > 0)%>
 <table class="table table-striped">

Modified: 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1586705&r1=1586704&r2=1586705&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
 (original)
+++ 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
 Fri Apr 11 15:59:26 2014
@@ -722,6 +722,11 @@ public class HMaster extends HRegionServ
     tableNamespaceManager.start();
   }
 
+  boolean isCatalogJanitorEnabled() {
+    return catalogJanitorChore != null ?
+      catalogJanitorChore.getEnabled() : false;
+  }
+
   private void splitMetaLogBeforeAssignment(ServerName currentMetaServer) 
throws IOException {
     if (this.distributedLogReplay) {
       // In log replay mode, we mark hbase:meta region as recovering in ZK
@@ -1503,14 +1508,22 @@ public class HMaster extends HRegionServ
         return s1.getServerName().compareTo(s2.getServerName());
       }});
 
-    return new ClusterStatus(VersionInfo.getVersion(),
-      this.fileSystemManager.getClusterId().toString(),
-      this.serverManager.getOnlineServers(),
-      this.serverManager.getDeadServers().copyServerNames(),
-      this.serverName,
-      backupMasters,
-      this.assignmentManager.getRegionStates().getRegionsInTransition(),
-      this.getMasterCoprocessors(), this.loadBalancerTracker.isBalancerOn());
+    String clusterId = fileSystemManager != null ?
+      fileSystemManager.getClusterId().toString() : null;
+    Map<String, RegionState> regionsInTransition = assignmentManager != null ?
+      assignmentManager.getRegionStates().getRegionsInTransition() : null;
+    String[] coprocessors = cpHost != null ? getMasterCoprocessors() : null;
+    boolean balancerOn = loadBalancerTracker != null ?
+      loadBalancerTracker.isBalancerOn() : false;
+    Map<ServerName, ServerLoad> onlineServers = null;
+    Set<ServerName> deadServers = null;
+    if (serverManager != null) {
+      deadServers = serverManager.getDeadServers().copyServerNames();
+      onlineServers = serverManager.getOnlineServers();
+    }
+    return new ClusterStatus(VersionInfo.getVersion(), clusterId,
+      onlineServers, deadServers, serverName, backupMasters,
+      regionsInTransition, coprocessors, balancerOn);
   }
 
   /**

Modified: 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java?rev=1586705&r1=1586704&r2=1586705&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
 (original)
+++ 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
 Fri Apr 11 15:59:26 2014
@@ -814,9 +814,8 @@ public class MasterRpcServices extends R
   @Override
   public IsCatalogJanitorEnabledResponse isCatalogJanitorEnabled(RpcController 
c,
       IsCatalogJanitorEnabledRequest req) throws ServiceException {
-    boolean isEnabled = master.catalogJanitorChore != null ?
-      master.catalogJanitorChore.getEnabled() : false;
-    return 
IsCatalogJanitorEnabledResponse.newBuilder().setValue(isEnabled).build();
+    return IsCatalogJanitorEnabledResponse.newBuilder().setValue(
+      master.isCatalogJanitorEnabled()).build();
   }
 
   @Override

Modified: 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java?rev=1586705&r1=1586704&r2=1586705&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
 (original)
+++ 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterStatusServlet.java
 Fri Apr 11 15:59:26 2014
@@ -33,12 +33,9 @@ import org.apache.hadoop.classification.
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
-import org.apache.hadoop.hbase.protobuf.RequestConverter;
 import org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl;
 import org.apache.hadoop.hbase.util.FSUtils;
 
-import com.google.protobuf.ServiceException;
-
 /**
  * The servlet responsible for rendering the index page of the
  * master.
@@ -57,12 +54,6 @@ public class MasterStatusServlet extends
 
     response.setContentType("text/html");
 
-    if (!master.isOnline()) {
-      response.getWriter().write("The Master is initializing!");
-      response.getWriter().close();
-      return;
-    }
-
     Configuration conf = master.getConfiguration();
     HBaseAdmin admin = new HBaseAdmin(conf);
 
@@ -72,29 +63,21 @@ public class MasterStatusServlet extends
     Set<ServerName> deadServers = null;
     
     if(master.isActiveMaster()) {
-      if (!master.isInitialized()) {
-        response.sendError(503, "Master not ready");
-        return;
-      }
       metaLocation = getMetaLocationOrNull(master);
-      //ServerName metaLocation = master.getCatalogTracker().getMetaLocation();
-      servers = master.getServerManager().getOnlineServersList();
-      deadServers = 
master.getServerManager().getDeadServers().copyServerNames();
+      ServerManager serverManager = master.getServerManager();
+      if (serverManager != null) {
+        deadServers = serverManager.getDeadServers().copyServerNames();
+        servers = serverManager.getOnlineServersList();
+      }
     }
 
-    MasterStatusTmpl tmpl;
-    try {
-       tmpl = new MasterStatusTmpl()
+    MasterStatusTmpl tmpl = new MasterStatusTmpl()
       .setFrags(frags)
       .setMetaLocation(metaLocation)
       .setServers(servers)
       .setDeadServers(deadServers)
-      
.setCatalogJanitorEnabled(master.getMasterRpcServices().isCatalogJanitorEnabled(
-          null, 
RequestConverter.buildIsCatalogJanitorEnabledRequest()).getValue());
-    } catch (ServiceException s) {
-      admin.close();
-      throw new IOException(s);
-    }
+      .setCatalogJanitorEnabled(master.isCatalogJanitorEnabled());
+
     if (request.getParameter("filter") != null)
       tmpl.setFilter(request.getParameter("filter"));
     if (request.getParameter("format") != null)

Modified: 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=1586705&r1=1586704&r2=1586705&view=diff
==============================================================================
--- 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
 (original)
+++ 
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java
 Fri Apr 11 15:59:26 2014
@@ -427,13 +427,12 @@ public class ServerManager {
   public double getAverageLoad() {
     int totalLoad = 0;
     int numServers = 0;
-    double averageLoad;
     for (ServerLoad sl: this.onlineServers.values()) {
         numServers++;
         totalLoad += sl.getNumberOfRegions();
     }
-    averageLoad = (double)totalLoad / (double)numServers;
-    return averageLoad;
+    return numServers == 0 ? 0 :
+      (double)totalLoad / (double)numServers;
   }
 
   /**


Reply via email to