diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java index 20dc67c..3e588d5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java @@ -88,7 +88,9 @@ public void init(Configuration conf) throws Exception { setFileSystem(conf); // mkdir of root dir path - fs.mkdirs(fsWorkingPath); + if (!fs.exists(fsWorkingPath)) { + fs.mkdirs(fsWorkingPath); + } } @Override @@ -96,7 +98,7 @@ public void close() throws IOException { IOUtils.cleanup(LOG, fs, editlogOs); } - private void setFileSystem(Configuration conf) throws IOException { + protected void setFileSystem(Configuration conf) throws IOException { Configuration confCopy = new Configuration(conf); confCopy.setBoolean("dfs.client.retry.policy.enabled", true); String retryPolicy = diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java index 4b052c9..c1e53cb 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java @@ -24,6 +24,8 @@ import java.util.Map; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.yarn.api.records.NodeLabel; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.event.InlineDispatcher; @@ -33,6 +35,7 @@ import org.junit.Test; import com.google.common.collect.ImmutableMap; +import org.mockito.Mockito; public class TestFileSystemNodeLabelsStore extends NodeLabelTestBase { MockNodeLabelManager mgr = null; @@ -317,4 +320,43 @@ public void testSerilizationAfterRecovery() throws Exception { Arrays.asList("p2", "p4", "p6", "p7", "p8", "p9"))); mgr.stop(); } + + @Test + public void testRootMkdirOnInitStore() throws Exception { + + Configuration mockConf = Mockito.mock(Configuration.class); + Mockito.when(mockConf.get(Mockito.any(String.class),Mockito.any( + String.class))).thenReturn("dummy"); + CommonNodeLabelsManager mgr = Mockito.spy(new CommonNodeLabelsManager()); + mgr.store = Mockito.mock(FileSystemNodeLabelsStore.class); + FileSystemNodeLabelsStore myStore = (FileSystemNodeLabelsStore)mgr.store; + FileSystem mockFs = Mockito.mock(FileSystem.class); + myStore.fs = mockFs; + + Mockito.when(myStore.fs.mkdirs(Mockito.any(Path.class))).thenReturn(true); + // File Exists returns false the first time + Mockito.when(myStore.fs.exists(Mockito.any(Path.class))).thenReturn(false); + Mockito.doCallRealMethod().when(myStore).init(Mockito.any(Configuration + .class)); + + myStore.init(mockConf); + //Check that mkdirs() was called once this time + Mockito.verify(myStore.fs,Mockito.times(1)).mkdirs(Mockito.any(Path + .class)); + + // File Exists returns true the second time + Mockito.when(myStore.fs.exists(Mockito.any(Path.class))).thenReturn(true); + + myStore.init(mockConf); + //Check that no new mkdirs() was called + Mockito.verify(myStore.fs, Mockito.times(1)).mkdirs(Mockito.any(Path + .class)); + + // File Exists returns true the third time + Mockito.when(myStore.fs.exists(Mockito.any(Path.class))).thenReturn(false); + myStore.init(mockConf); + //Check that mkdirs() was called once more this time + Mockito.verify(myStore.fs, Mockito.times(2)).mkdirs(Mockito.any(Path + .class)); + } }