You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2013/04/10 19:02:55 UTC
svn commit: r1466567 - in /hbase/branches/0.94/src:
main/java/org/apache/hadoop/hbase/master/handler/
main/java/org/apache/hadoop/hbase/zookeeper/
test/java/org/apache/hadoop/hbase/master/handler/
Author: ramkrishna
Date: Wed Apr 10 17:02:55 2013
New Revision: 1466567
URL: http://svn.apache.org/r1466567
Log:
HBASE-8266-Master cannot start if TableNotFoundException is thrown while partial table recovery (Ram)
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTable.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java?rev=1466567&r1=1466566&r2=1466567&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java Wed Apr 10 17:02:55 2013
@@ -142,8 +142,14 @@ public class CreateTableHandler extends
// again with the same Active master
// It will block the creation saying TableAlreadyExists.
if (exception != null) {
- this.assignmentManager.getZKTable().removeEnablingTable(
- this.hTableDescriptor.getNameAsString());
+ try {
+ this.assignmentManager.getZKTable().removeEnablingTable(
+ this.hTableDescriptor.getNameAsString(), false);
+ } catch (KeeperException e) {
+ // Keeper exception should not happen here
+ LOG.error("Got a keeper exception while removing the ENABLING table znode "
+ + this.hTableDescriptor.getNameAsString(), e);
+ }
}
}
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java?rev=1466567&r1=1466566&r2=1466567&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java Wed Apr 10 17:02:55 2013
@@ -66,7 +66,18 @@ public class EnableTableHandler extends
this.retainAssignment = skipTableStateCheck;
// Check if table exists
if (!MetaReader.tableExists(catalogTracker, this.tableNameStr)) {
- throw new TableNotFoundException(Bytes.toString(tableName));
+ // retainAssignment is true only during recovery. In normal case it is
+ // false
+ if (!this.retainAssignment) {
+ throw new TableNotFoundException(tableNameStr);
+ }
+ try {
+ this.assignmentManager.getZKTable().removeEnablingTable(tableNameStr, true);
+ } catch (KeeperException e) {
+ // TODO : Use HBCK to clear such nodes
+ LOG.warn("Failed to delete the ENABLING node for the table " + tableNameStr
+ + ". The table will remain unusable. Run HBCK to manually fix the problem.");
+ }
}
// There could be multiple client requests trying to disable or enable
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTable.java?rev=1466567&r1=1466566&r2=1466567&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTable.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKTable.java Wed Apr 10 17:02:55 2013
@@ -180,13 +180,21 @@ public class ZKTable {
/**
* If the table is found in ENABLING state the inmemory state is removed.
- * This helps in cases where CreateTable is to be retried by the client incase of failures
+ * This helps in cases where CreateTable is to be retried by the client incase of failures.
+ * If deleteZNode is true - the znode is also deleted
* @param tableName
+ * @param deleteZNode
+ * @throws KeeperException
*/
- public void removeEnablingTable(final String tableName) {
+ public void removeEnablingTable(final String tableName, boolean deleteZNode)
+ throws KeeperException {
synchronized (this.cache) {
if (isEnablingTable(tableName)) {
this.cache.remove(tableName);
+ if (deleteZNode) {
+ ZKUtil.deleteNodeFailSilent(this.watcher,
+ ZKUtil.joinZNode(this.watcher.masterTableZNode, tableName));
+ }
}
}
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java?rev=1466567&r1=1466566&r2=1466567&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java Wed Apr 10 17:02:55 2013
@@ -46,7 +46,9 @@ import org.apache.hadoop.hbase.master.Te
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.zookeeper.ZKTable;
import org.apache.hadoop.hbase.zookeeper.ZKUtil;
+import org.junit.After;
import org.junit.AfterClass;
+import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -57,16 +59,17 @@ public class TestCreateTableHandler {
private static final Log LOG = LogFactory.getLog(TestCreateTableHandler.class);
private static final byte[] TABLENAME = Bytes.toBytes("TestCreateTableHandler");
private static final byte[] FAMILYNAME = Bytes.toBytes("fam");
- public static boolean throwException = false;
+ private static boolean throwException = false;
- @BeforeClass
- public static void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
TEST_UTIL.startMiniCluster(1);
}
- @AfterClass
- public static void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TEST_UTIL.shutdownMiniCluster();
+ throwException = true;
}
@Test
@@ -95,6 +98,34 @@ public class TestCreateTableHandler {
assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(TABLENAME));
}
+
+ @Test (timeout=10000)
+ public void testMasterRestartAfterEnablingNodeIsCreated() throws Exception {
+ byte[] tableName = Bytes.toBytes("testMasterRestartAfterEnablingNodeIsCreated");
+ final MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
+ final HMaster m = cluster.getMaster();
+ final HTableDescriptor desc = new HTableDescriptor(tableName);
+ desc.addFamily(new HColumnDescriptor(FAMILYNAME));
+ final HRegionInfo[] hRegionInfos = new HRegionInfo[] { new HRegionInfo(desc.getName(), null,
+ null) };
+ CustomCreateTableHandler handler = new CustomCreateTableHandler(m, m.getMasterFileSystem(),
+ m.getServerManager(), desc, cluster.getConfiguration(), hRegionInfos,
+ m.getCatalogTracker(), m.getAssignmentManager());
+ throwException = true;
+ handler.process();
+ abortAndStartNewMaster(cluster);
+ assertTrue(cluster.getLiveMasterThreads().size() == 1);
+
+ }
+
+ private void abortAndStartNewMaster(final MiniHBaseCluster cluster) throws IOException {
+ cluster.abortMaster(0);
+ cluster.waitOnMaster(0);
+ LOG.info("Starting new master");
+ cluster.startMaster();
+ LOG.info("Waiting for master to become active.");
+ cluster.waitForActiveAndReadyMaster();
+ }
private static class CustomCreateTableHandler extends CreateTableHandler {
public CustomCreateTableHandler(Server server, MasterFileSystem fileSystemManager,