|
@@ -18,26 +18,32 @@
|
|
|
|
|
|
package org.apache.hadoop.hdfs;
|
|
package org.apache.hadoop.hdfs;
|
|
|
|
|
|
|
|
+import static org.junit.Assert.*;
|
|
|
|
+
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
|
+import org.apache.hadoop.fs.FileStatus;
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
import org.apache.hadoop.fs.Path;
|
|
import org.apache.hadoop.fs.Path;
|
|
import org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction;
|
|
import org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction;
|
|
import org.apache.hadoop.hdfs.server.namenode.NameNode;
|
|
import org.apache.hadoop.hdfs.server.namenode.NameNode;
|
|
-
|
|
|
|
-import junit.framework.TestCase;
|
|
|
|
|
|
+import org.apache.hadoop.hdfs.server.namenode.SafeModeException;
|
|
|
|
+import org.apache.hadoop.ipc.RemoteException;
|
|
|
|
+import org.junit.Assert;
|
|
|
|
+import org.junit.Test;
|
|
|
|
|
|
/**
|
|
/**
|
|
* This test makes sure that if SafeMode is manually entered, NameNode does not
|
|
* This test makes sure that if SafeMode is manually entered, NameNode does not
|
|
* come out of safe mode even after the startup safemode conditions are met.
|
|
* come out of safe mode even after the startup safemode conditions are met.
|
|
*/
|
|
*/
|
|
-public class TestSafeMode extends TestCase {
|
|
|
|
|
|
+public class TestSafeMode {
|
|
|
|
|
|
static Log LOG = LogFactory.getLog(TestSafeMode.class);
|
|
static Log LOG = LogFactory.getLog(TestSafeMode.class);
|
|
|
|
|
|
|
|
+ @Test
|
|
public void testManualSafeMode() throws IOException {
|
|
public void testManualSafeMode() throws IOException {
|
|
MiniDFSCluster cluster = null;
|
|
MiniDFSCluster cluster = null;
|
|
FileSystem fs = null;
|
|
FileSystem fs = null;
|
|
@@ -92,4 +98,84 @@ public class TestSafeMode extends TestCase {
|
|
if(cluster!= null) cluster.shutdown();
|
|
if(cluster!= null) cluster.shutdown();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testSafeModeWhenZeroBlockLocations() throws IOException {
|
|
|
|
+ MiniDFSCluster cluster = null;
|
|
|
|
+ FileSystem fs = null;
|
|
|
|
+ try {
|
|
|
|
+ Configuration conf = new Configuration();
|
|
|
|
+ // disable safemode extension to make the test run faster.
|
|
|
|
+ conf.set("dfs.safemode.extension", "1");
|
|
|
|
+ cluster = new MiniDFSCluster(conf, 1, true, null);
|
|
|
|
+ cluster.waitActive();
|
|
|
|
+
|
|
|
|
+ fs = cluster.getFileSystem();
|
|
|
|
+ Path file1 = new Path("/tmp/testManualSafeMode/file1");
|
|
|
|
+ Path file2 = new Path("/tmp/testManualSafeMode/file2");
|
|
|
|
+
|
|
|
|
+ LOG.info("Created file1 and file2.");
|
|
|
|
+
|
|
|
|
+ // create two files with one block each.
|
|
|
|
+ DFSTestUtil.createFile(fs, file1, 1000, (short) 1, 0);
|
|
|
|
+ DFSTestUtil.createFile(fs, file2, 2000, (short) 1, 0);
|
|
|
|
+ checkGetBlockLocationsWorks(fs, file1);
|
|
|
|
+
|
|
|
|
+ NameNode namenode = cluster.getNameNode();
|
|
|
|
+ namenode.setSafeMode(SafeModeAction.SAFEMODE_ENTER);
|
|
|
|
+ Assert.assertTrue("should still be in SafeMode", namenode.isInSafeMode());
|
|
|
|
+ // getBlock locations should still work since block locations exists
|
|
|
|
+ checkGetBlockLocationsWorks(fs, file1);
|
|
|
|
+ namenode.setSafeMode(SafeModeAction.SAFEMODE_LEAVE);
|
|
|
|
+ assertFalse("should not be in SafeMode", namenode.isInSafeMode());
|
|
|
|
+ Assert.assertFalse("should not be in SafeMode", namenode.isInSafeMode());
|
|
|
|
+
|
|
|
|
+ // Now 2nd part of the tests where there aren't block locations
|
|
|
|
+ cluster.shutdownDataNodes();
|
|
|
|
+ cluster.shutdownNameNode();
|
|
|
|
+
|
|
|
|
+ // now bring up just the NameNode.
|
|
|
|
+ cluster.restartNameNode();
|
|
|
|
+ cluster.waitActive();
|
|
|
|
+
|
|
|
|
+ LOG.info("Restarted cluster with just the NameNode");
|
|
|
|
+
|
|
|
|
+ namenode = cluster.getNameNode();
|
|
|
|
+
|
|
|
|
+ Assert.assertTrue("No datanode is started. Should be in SafeMode",
|
|
|
|
+ namenode.isInSafeMode());
|
|
|
|
+ FileStatus stat = fs.getFileStatus(file1);
|
|
|
|
+ try {
|
|
|
|
+ fs.getFileBlockLocations(stat, 0, 1000);
|
|
|
|
+ Assert.assertTrue("Should have got safemode exception", false);
|
|
|
|
+ } catch (SafeModeException e) {
|
|
|
|
+ // as expected
|
|
|
|
+ } catch (RemoteException re) {
|
|
|
|
+ if (!re.getClassName().equals(SafeModeException.class.getName()))
|
|
|
|
+ Assert.assertTrue("Should have got safemode exception", false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ namenode.setSafeMode(SafeModeAction.SAFEMODE_LEAVE);
|
|
|
|
+ Assert.assertFalse("Should not be in safemode", namenode.isInSafeMode());
|
|
|
|
+ checkGetBlockLocationsWorks(fs, file1);
|
|
|
|
+
|
|
|
|
+ } finally {
|
|
|
|
+ if (fs != null)
|
|
|
|
+ fs.close();
|
|
|
|
+ if (cluster != null)
|
|
|
|
+ cluster.shutdown();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void checkGetBlockLocationsWorks(FileSystem fs, Path fileName)
|
|
|
|
+ throws IOException {
|
|
|
|
+ FileStatus stat = fs.getFileStatus(fileName);
|
|
|
|
+ try {
|
|
|
|
+ fs.getFileBlockLocations(stat, 0, 1000);
|
|
|
|
+ } catch (SafeModeException e) {
|
|
|
|
+ Assert.assertTrue("Should have not got safemode exception", false);
|
|
|
|
+ } catch (RemoteException re) {
|
|
|
|
+ Assert.assertTrue("Should have not got safemode exception", false);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|