You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2013/10/02 19:25:46 UTC

svn commit: r1528571 - in /hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master: HMaster.java TableNamespaceManager.java

Author: jdcryans
Date: Wed Oct  2 17:25:45 2013
New Revision: 1528571

URL: http://svn.apache.org/r1528571
Log:
HBASE-9602 Cluster can't start when log splitting at startup time and the
           master's web UI is refreshed a few times

Modified:
    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/TableNamespaceManager.java

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=1528571&r1=1528570&r2=1528571&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 Wed Oct  2 17:25:45 2013
@@ -3096,6 +3096,9 @@ MasterServices, Server {
 
   @Override
   public NamespaceDescriptor getNamespaceDescriptor(String name) throws IOException {
+    if (!isTableNamespaceManagerReady()) {
+      throw new IOException("Table Namespace Manager not ready yet, try again later");
+    }
     NamespaceDescriptor nsd = tableNamespaceManager.get(name);
     if (nsd == null) {
       throw new NamespaceNotFoundException(name);
@@ -3105,23 +3108,41 @@ MasterServices, Server {
 
   @Override
   public List<NamespaceDescriptor> listNamespaceDescriptors() throws IOException {
+    if (!isTableNamespaceManagerReady()) {
+      return Lists.newArrayList();
+    }
     return Lists.newArrayList(tableNamespaceManager.list());
   }
 
   @Override
   public List<HTableDescriptor> listTableDescriptorsByNamespace(String name) throws IOException {
+    if (!isTableNamespaceManagerReady()) {
+      return Lists.newArrayList();
+    }
     getNamespaceDescriptor(name); // check that namespace exists
     return Lists.newArrayList(tableDescriptors.getByNamespace(name).values());
   }
 
   @Override
   public List<TableName> listTableNamesByNamespace(String name) throws IOException {
-    getNamespaceDescriptor(name); // check that namespace exists
     List<TableName> tableNames = Lists.newArrayList();
+    if (!isTableNamespaceManagerReady()) {
+      return tableNames;
+    }
+    getNamespaceDescriptor(name); // check that namespace exists
     for (HTableDescriptor descriptor: tableDescriptors.getByNamespace(name).values()) {
       tableNames.add(descriptor.getTableName());
     }
     return tableNames;
   }
 
+  private boolean isTableNamespaceManagerReady() throws IOException {
+    boolean ready = tableNamespaceManager != null &&
+        tableNamespaceManager.isTableAvailableAndInitialized();
+    if (!ready) {
+      LOG.warn("Table Namespace Manager not ready yet");
+    }
+    return ready;
+  }
+
 }

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java?rev=1528571&r1=1528570&r2=1528571&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java Wed Oct  2 17:25:45 2013
@@ -79,9 +79,8 @@ public class TableNamespaceManager {
   }
 
   public void start() throws IOException {
-    TableName tableName = TableName.NAMESPACE_TABLE_NAME;
     if (!MetaReader.tableExists(masterServices.getCatalogTracker(),
-        tableName)) {
+        TableName.NAMESPACE_TABLE_NAME)) {
       LOG.info("Namespace table not found. Creating...");
       createNamespaceTable(masterServices);
     }
@@ -92,8 +91,7 @@ public class TableNamespaceManager {
       // So that it should be initialized later on lazily.
       long startTime = EnvironmentEdgeManager.currentTimeMillis();
       int timeout = conf.getInt(NS_INIT_TIMEOUT, DEFAULT_NS_INIT_TIMEOUT);
-      while(masterServices.getAssignmentManager()
-          .getRegionStates().getRegionsOfTable(tableName).isEmpty()) {
+      while (!isTableAssigned()) {
         if (EnvironmentEdgeManager.currentTimeMillis() - startTime + 100 > timeout) {
           LOG.warn("Timedout waiting for namespace table to be assigned.");
           return;
@@ -105,47 +103,12 @@ public class TableNamespaceManager {
     }
 
     // initialize namespace table
-    getNamespaceTable();
+    isTableAvailableAndInitialized();
   }
 
-  @SuppressWarnings("deprecation")
   private synchronized HTable getNamespaceTable() throws IOException {
-    if (!initialized) {
-      try {
-        nsTable = new HTable(conf, TableName.NAMESPACE_TABLE_NAME);
-        zkNamespaceManager = new ZKNamespaceManager(masterServices.getZooKeeper());
-        zkNamespaceManager.start();
-
-        if (get(nsTable, NamespaceDescriptor.DEFAULT_NAMESPACE.getName()) == null) {
-          create(nsTable, NamespaceDescriptor.DEFAULT_NAMESPACE);
-        }
-        if (get(nsTable, NamespaceDescriptor.SYSTEM_NAMESPACE.getName()) == null) {
-          create(nsTable, NamespaceDescriptor.SYSTEM_NAMESPACE);
-        }
-
-        ResultScanner scanner = nsTable.getScanner(HTableDescriptor.NAMESPACE_FAMILY_INFO_BYTES);
-        try {
-          for(Result result : scanner) {
-            byte[] val =  CellUtil.cloneValue(result.getColumnLatest(HTableDescriptor.NAMESPACE_FAMILY_INFO_BYTES,
-                HTableDescriptor.NAMESPACE_COL_DESC_BYTES));
-            NamespaceDescriptor ns =
-                ProtobufUtil.toNamespaceDescriptor(
-                    HBaseProtos.NamespaceDescriptor.parseFrom(val));
-            zkNamespaceManager.update(ns);
-          }
-        } finally {
-          scanner.close();
-        }
-        initialized = true;
-      } catch (IOException ie) {
-        LOG.warn("Caught exception in initializing namespace table manager", ie);
-        if (nsTable != null) {
-          nsTable.close();
-        }
-        throw ie;
-      }
-    } else if (nsTable.getConnection().isClosed()) {
-      nsTable = new HTable(conf, TableName.NAMESPACE_TABLE_NAME);
+    if (!isTableAvailableAndInitialized()) {
+      throw new IOException(this.getClass().getName() + " isn't ready to serve");
     }
     return nsTable;
   }
@@ -272,4 +235,68 @@ public class TableNamespaceManager {
             newRegions,
             masterServices).prepare());
   }
+
+  /**
+   * This method checks if the namespace table is assigned and then
+   * tries to create its HTable. If it was already created before, it also makes
+   * sure that the connection isn't closed.
+   * @return true if the namespace table manager is ready to serve, false
+   * otherwise
+   * @throws IOException
+   */
+  @SuppressWarnings("deprecation")
+  public synchronized boolean isTableAvailableAndInitialized() throws IOException {
+    // Did we already get a table? If so, still make sure it's available
+    if (initialized) {
+      if (nsTable.getConnection().isClosed()) {
+        nsTable = new HTable(conf, TableName.NAMESPACE_TABLE_NAME);
+      }
+      return true;
+    }
+
+    // Now check if the table is assigned, if not then fail fast
+    if (isTableAssigned()) {
+      try {
+        nsTable = new HTable(conf, TableName.NAMESPACE_TABLE_NAME);
+        zkNamespaceManager = new ZKNamespaceManager(masterServices.getZooKeeper());
+        zkNamespaceManager.start();
+
+        if (get(nsTable, NamespaceDescriptor.DEFAULT_NAMESPACE.getName()) == null) {
+          create(nsTable, NamespaceDescriptor.DEFAULT_NAMESPACE);
+        }
+        if (get(nsTable, NamespaceDescriptor.SYSTEM_NAMESPACE.getName()) == null) {
+          create(nsTable, NamespaceDescriptor.SYSTEM_NAMESPACE);
+        }
+
+        ResultScanner scanner = nsTable.getScanner(HTableDescriptor.NAMESPACE_FAMILY_INFO_BYTES);
+        try {
+          for (Result result : scanner) {
+            byte[] val =  CellUtil.cloneValue(result.getColumnLatest(
+                HTableDescriptor.NAMESPACE_FAMILY_INFO_BYTES,
+                HTableDescriptor.NAMESPACE_COL_DESC_BYTES));
+            NamespaceDescriptor ns =
+                ProtobufUtil.toNamespaceDescriptor(
+                    HBaseProtos.NamespaceDescriptor.parseFrom(val));
+            zkNamespaceManager.update(ns);
+          }
+        } finally {
+          scanner.close();
+        }
+        initialized = true;
+        return true;
+      } catch (IOException ie) {
+        LOG.warn("Caught exception in initializing namespace table manager", ie);
+        if (nsTable != null) {
+          nsTable.close();
+        }
+        throw ie;
+      }
+    }
+    return false;
+  }
+
+  private boolean isTableAssigned() {
+    return !masterServices.getAssignmentManager()
+        .getRegionStates().getRegionsOfTable(TableName.NAMESPACE_TABLE_NAME).isEmpty();
+  }
 }