diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/FileSystemApplicationHistoryStore.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/FileSystemApplicationHistoryStore.java index a5725eb..b487887 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/FileSystemApplicationHistoryStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/FileSystemApplicationHistoryStore.java @@ -117,8 +117,12 @@ public void serviceInit(Configuration conf) throws Exception { rootDirPath = new Path(fsWorkingPath, ROOT_DIR_NAME); try { fs = fsWorkingPath.getFileSystem(conf); - fs.mkdirs(rootDirPath); - fs.setPermission(rootDirPath, ROOT_DIR_UMASK); + + if (!fs.isDirectory(rootDirPath)) { + fs.mkdirs(rootDirPath); + fs.setPermission(rootDirPath, ROOT_DIR_UMASK); + } + } catch (IOException e) { LOG.error("Error when initializing FileSystemHistoryStorage", e); throw e; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestFileSystemApplicationHistoryStore.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestFileSystemApplicationHistoryStore.java index d31018c..799a50f 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestFileSystemApplicationHistoryStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestFileSystemApplicationHistoryStore.java @@ -20,13 +20,22 @@ import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; import org.junit.Assert; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.FileSystemTestHelper; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RawLocalFileSystem; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; @@ -53,6 +62,11 @@ @Before public void setup() throws Exception { fs = new RawLocalFileSystem(); + initStore(fs); + } + + private void initStore(FileSystem fs) throws IOException, + URISyntaxException { Configuration conf = new Configuration(); fs.initialize(new URI("/"), conf); fsWorkingPath = @@ -243,4 +257,48 @@ public void testMissingApplicationAttemptHistoryData() throws IOException { testWriteHistoryData(3, false, true); testReadHistoryData(3, false, true); } + + @Test + public void testInitExistingWorkingDirectoryInSafeMode() throws Exception { + LOG.info("Starting testInitExistingWorkingDirectoryInSafeMode"); + tearDown(); + + // Setup file system to inject startup conditions + FileSystem fs = spy(new RawLocalFileSystem()); + doReturn(true).when(fs).isDirectory(any(Path.class)); + FileSystemTestHelper.addFileSystemForTesting(fs.getUri(), fs.getConf(), fs); + + try { + initStore(fs); + } catch (Exception e) { + Assert.fail("Exception should not be thrown: " + e); + } + + // Make sure that directory creation was not attempted + verify(fs, times(1)).isDirectory(any(Path.class)); + verify(fs, times(0)).mkdirs(any(Path.class)); + } + + @Test + public void testInitNonExistingWorkingDirectoryInSafeMode() throws Exception { + LOG.info("Starting testInitNonExistingWorkingDirectoryInSafeMode"); + tearDown(); + + // Setup file system to inject startup conditions + FileSystem fs = spy(new RawLocalFileSystem()); + doReturn(false).when(fs).isDirectory(any(Path.class)); + doThrow(new IOException()).when(fs).mkdirs(any(Path.class)); + FileSystemTestHelper.addFileSystemForTesting(fs.getUri(), fs.getConf(), fs); + + try { + initStore(fs); + Assert.fail("Exception should have been thrown"); + } catch (Exception e) { + // Expected failure + } + + // Make sure that directory creation was attempted + verify(fs, times(1)).isDirectory(any(Path.class)); + verify(fs, times(1)).mkdirs(any(Path.class)); + } }