Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 002B0108E8 for ; Wed, 2 Oct 2013 17:26:09 +0000 (UTC) Received: (qmail 63130 invoked by uid 500); 2 Oct 2013 17:26:08 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 62913 invoked by uid 500); 2 Oct 2013 17:26:08 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 62906 invoked by uid 99); 2 Oct 2013 17:26:08 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Oct 2013 17:26:08 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Oct 2013 17:26:06 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 6D13323889ED; Wed, 2 Oct 2013 17:25:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1528571 - in /hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/master: HMaster.java TableNamespaceManager.java Date: Wed, 02 Oct 2013 17:25:46 -0000 To: commits@hbase.apache.org From: jdcryans@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131002172546.6D13323889ED@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 listNamespaceDescriptors() throws IOException { + if (!isTableNamespaceManagerReady()) { + return Lists.newArrayList(); + } return Lists.newArrayList(tableNamespaceManager.list()); } @Override public List 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 listTableNamesByNamespace(String name) throws IOException { - getNamespaceDescriptor(name); // check that namespace exists List 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(); + } }