diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 062896ce4f..8f09740585 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -106,6 +106,7 @@ import java.io.StringWriter; import java.lang.management.ManagementFactory; import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -547,6 +548,7 @@ private void logAuditEvent(boolean succeeded, */ private boolean manualSafeMode = false; private boolean resourceLowSafeMode = false; + private String nameNodeHostName = null; /** * Notify that loading of this FSDirectory is complete, and @@ -1116,6 +1118,9 @@ void startCommonServices(Configuration conf, HAContext haContext) throws IOExcep dir.setINodeAttributeProvider(inodeAttributeProvider); } snapshotManager.registerMXBean(); + InetSocketAddress serviceAddress = NameNode.getServiceAddress(conf, true); + this.nameNodeHostName = (serviceAddress != null) ? + serviceAddress.getHostName() : ""; } /** @@ -1383,7 +1388,7 @@ && isInStartupSafeMode()) { private SafeModeException newSafemodeException(String errorMsg) { return new SafeModeException(errorMsg + ". Name node is in safe " + - "mode.\n" + getSafeModeTip()); + "mode.\n" + getSafeModeTip() + " NamenodeHostName:" + nameNodeHostName); } boolean isPermissionEnabled() { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestSafeMode.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestSafeMode.java index ada61b91a9..62dac74aea 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestSafeMode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestSafeMode.java @@ -304,6 +304,30 @@ public void runFsFun(String msg, FSRun f) { } } + @Test + public void testSafeModeExceptionText() throws Exception { + final Path file1 = new Path("/file1"); + DFSTestUtil.createFile(fs, file1, 1024, (short)1, 0); + assertTrue("Could not enter SM", + dfs.setSafeMode(SafeModeAction.SAFEMODE_ENTER)); + try { + FSRun fsRun = new FSRun() { + @Override + public void run(FileSystem fileSystem) throws IOException { + ((DistributedFileSystem)fileSystem).setQuota(file1, 1, 1); + } + }; + fsRun.run(fs); + fail("Should not succeed with no exceptions!"); + } catch (RemoteException re) { + assertEquals(SafeModeException.class.getName(), re.getClassName()); + GenericTestUtils.assertExceptionContains( + NameNode.getServiceAddress(conf, true).getHostName(), re); + } catch (IOException ioe) { + fail("Encountered exception" + " " + StringUtils.stringifyException(ioe)); + } + } + /** * Run various fs operations while the NN is in safe mode, * assert that they are either allowed or fail as expected.