diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterWalManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterWalManager.java index 27aca94..e67af14 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterWalManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterWalManager.java @@ -270,6 +270,11 @@ public class MasterWalManager { } logDirs.add(splitDir); } + } catch (IOException ioe) { + if (!checkFileSystem()) { + this.services.abort("Aborting due to filesystem unavailable", ioe); + throw ioe; + } } finally { if (needReleaseLock) { this.splitLogLock.unlock(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestCreateTableProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestCreateTableProcedure.java index c09016c..4b360a2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestCreateTableProcedure.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestCreateTableProcedure.java @@ -24,12 +24,17 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.ProcedureInfo; import org.apache.hadoop.hbase.TableExistsException; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.Waiter; import org.apache.hadoop.hbase.procedure2.ProcedureExecutor; import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.util.ModifyRegionUtils; +import org.apache.hadoop.hdfs.DistributedFileSystem; +import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.hdfs.protocol.HdfsConstants; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -38,6 +43,8 @@ import org.junit.rules.TestName; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.util.List; + @Category({MasterTests.class, MediumTests.class}) public class TestCreateTableProcedure extends TestTableDDLProcedureBase { @Rule @@ -59,6 +66,38 @@ public class TestCreateTableProcedure extends TestTableDDLProcedureBase { testSimpleCreate(tableName, splitKeys); } + @Test(timeout=60000) + public void testSafemodeBringsDownMaster() throws Exception { + final TableName tableName = TableName.valueOf(name.getMethodName()); + final byte[][] splitKeys = new byte[][] { + Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c") + }; + HRegionInfo[] regions = MasterProcedureTestingUtility.createTable( + getMasterProcedureExecutor(), tableName, splitKeys, "f1", "f2"); + MiniDFSCluster dfsCluster = UTIL.getDFSCluster(); + DistributedFileSystem dfs = (DistributedFileSystem) dfsCluster.getFileSystem(); + dfs.setSafeMode(HdfsConstants.SafeModeAction.SAFEMODE_ENTER); + final long timeOut = 180000; + long startTime = System.currentTimeMillis(); + int index = -1; + do { + index = UTIL.getMiniHBaseCluster().getServerWithMeta(); + } while (index == -1 && + startTime + timeOut < System.currentTimeMillis()); + + if (index != -1){ + UTIL.getMiniHBaseCluster().abortRegionServer(index); + UTIL.getMiniHBaseCluster().waitOnRegionServer(index); + } + UTIL.waitFor(timeOut, new Waiter.Predicate() { + @Override + public boolean evaluate() throws Exception { + List threads = UTIL.getMiniHBaseCluster().getLiveMasterThreads(); + return threads == null || threads.isEmpty(); + } + }); + dfs.setSafeMode(HdfsConstants.SafeModeAction.SAFEMODE_LEAVE); + } private void testSimpleCreate(final TableName tableName, byte[][] splitKeys) throws Exception { HRegionInfo[] regions = MasterProcedureTestingUtility.createTable( getMasterProcedureExecutor(), tableName, splitKeys, "f1", "f2");