diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index fb2993811a8..26c3a197f55 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -36,6 +36,9 @@ Release 2.6.3 - UNRELEASED YARN-3878. AsyncDispatcher can hang while stopping if it is configured for draining events on stop. (Varun Saxena via kasha) + YARN-4365. FileSystemNodeLabelStore should check for root dir existence on + startup (Kuhu Shukla via jlowe) + Release 2.6.2 - 2015-10-28 INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java index 6e685ee3301..764869009df 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/FileSystemNodeLabelsStore.java @@ -84,7 +84,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 @@ -97,7 +99,7 @@ public void close() throws IOException { } } - private void setFileSystem(Configuration conf) throws IOException { + void setFileSystem(Configuration conf) throws IOException { Configuration confCopy = new Configuration(conf); confCopy.setBoolean("dfs.client.retry.policy.enabled", true); String retryPolicy = diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java index 45a2d8d32f2..fd5786541e2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestFileSystemNodeLabelsStore.java +++ b/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.conf.YarnConfiguration; import org.apache.hadoop.yarn.event.InlineDispatcher; import org.junit.After; @@ -32,6 +34,7 @@ import org.junit.Test; import com.google.common.collect.ImmutableMap; +import org.mockito.Mockito; public class TestFileSystemNodeLabelsStore extends NodeLabelTestBase { MockNodeLabelManager mgr = null; @@ -249,4 +252,30 @@ public void testSerilizationAfterRecovery() throws Exception { Arrays.asList("p2", "p4", "p6", "p7", "p8", "p9"))); mgr.stop(); } + + @Test + public void testRootMkdirOnInitStore() throws Exception { + final FileSystem mockFs = Mockito.mock(FileSystem.class); + FileSystemNodeLabelsStore mockStore = new FileSystemNodeLabelsStore(mgr) { + void setFileSystem(Configuration conf) throws IOException { + fs = mockFs; + } + }; + mockStore.fs = mockFs; + verifyMkdirsCount(mockStore, true, 0); + verifyMkdirsCount(mockStore, false, 1); + verifyMkdirsCount(mockStore, true, 1); + verifyMkdirsCount(mockStore, false, 2); + } + + private void verifyMkdirsCount(FileSystemNodeLabelsStore store, + boolean existsRetVal, int expectedNumOfCalls) + throws Exception { + Mockito.when(store.fs.exists(Mockito.any( + Path.class))).thenReturn(existsRetVal); + store.init(conf); + Mockito.verify(store.fs,Mockito.times( + expectedNumOfCalls)).mkdirs(Mockito.any(Path + .class)); + } }