Repository: hadoop Updated Branches: refs/heads/branch-2.6 6b2abb751 -> 9cb288e9f
HDFS-8767. RawLocalFileSystem.listStatus() returns null for UNIX pipefile. Contributed by kanaka kumar avvaru. (cherry picked from commit 391d2d88f2ace4e95e82f4303644ba9d1dd0692a) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/9cb288e9 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/9cb288e9 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/9cb288e9 Branch: refs/heads/branch-2.6 Commit: 9cb288e9faf7556c11c1c4ca963f7eaddd556a2c Parents: 6b2abb7 Author: Haohui Mai <[email protected]> Authored: Thu Jul 16 15:21:53 2015 -0700 Committer: Akira Ajisaka <[email protected]> Committed: Fri Jan 8 17:09:53 2016 +0900 ---------------------------------------------------------------------- hadoop-common-project/hadoop-common/CHANGES.txt | 3 ++ .../apache/hadoop/fs/RawLocalFileSystem.java | 53 +++++++++++--------- .../apache/hadoop/fs/TestLocalFileSystem.java | 23 +++++++++ 3 files changed, 54 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/9cb288e9/hadoop-common-project/hadoop-common/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 7762152..77fb907 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -15,6 +15,9 @@ Release 2.6.4 - UNRELEASED HADOOP-11252. RPC client does not time out by default. (Wilfred Spiegelenburg and Masatake Iwasaki via aajisaka) + HDFS-8767. RawLocalFileSystem.listStatus() returns null for UNIX pipefile. + (kanaka kumar avvaru via wheat9) + Release 2.6.3 - 2015-12-17 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/9cb288e9/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java index ca815a3..2a25da6 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java @@ -375,35 +375,38 @@ public class RawLocalFileSystem extends FileSystem { if (!localf.exists()) { throw new FileNotFoundException("File " + f + " does not exist"); } - if (localf.isFile()) { - if (!useDeprecatedFileStatus) { - return new FileStatus[] { getFileStatus(f) }; - } - return new FileStatus[] { - new DeprecatedRawLocalFileStatus(localf, getDefaultBlockSize(f), this)}; - } - String[] names = localf.list(); - if (names == null) { - return null; - } - results = new FileStatus[names.length]; - int j = 0; - for (int i = 0; i < names.length; i++) { - try { - // Assemble the path using the Path 3 arg constructor to make sure - // paths with colon are properly resolved on Linux - results[j] = getFileStatus(new Path(f, new Path(null, null, names[i]))); - j++; - } catch (FileNotFoundException e) { - // ignore the files not found since the dir list may have have changed - // since the names[] list was generated. + if (localf.isDirectory()) { + String[] names = localf.list(); + if (names == null) { + return null; } + results = new FileStatus[names.length]; + int j = 0; + for (int i = 0; i < names.length; i++) { + try { + // Assemble the path using the Path 3 arg constructor to make sure + // paths with colon are properly resolved on Linux + results[j] = getFileStatus(new Path(f, new Path(null, null, + names[i]))); + j++; + } catch (FileNotFoundException e) { + // ignore the files not found since the dir list may have have + // changed since the names[] list was generated. + } + } + if (j == names.length) { + return results; + } + return Arrays.copyOf(results, j); } - if (j == names.length) { - return results; + + if (!useDeprecatedFileStatus) { + return new FileStatus[] { getFileStatus(f) }; } - return Arrays.copyOf(results, j); + return new FileStatus[] { + new DeprecatedRawLocalFileStatus(localf, + getDefaultBlockSize(f), this) }; } protected boolean mkOneDir(File p2f) throws IOException { http://git-wip-us.apache.org/repos/asf/hadoop/blob/9cb288e9/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystem.java index 2203fff..ca78a8a 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystem.java @@ -31,11 +31,14 @@ import java.util.Random; import static org.junit.Assert.*; import static org.junit.Assume.assumeTrue; +import static org.mockito.Mockito.*; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.internal.util.reflection.Whitebox; + /** * This class tests the local file system via the FileSystem abstraction. @@ -556,4 +559,24 @@ public class TestLocalFileSystem { assertEquals("resolvePath did not strip fragment from Path", pathQualified, resolved); } + + @Test + public void testFileStatusPipeFile() throws Exception { + RawLocalFileSystem origFs = new RawLocalFileSystem(); + RawLocalFileSystem fs = spy(origFs); + Configuration conf = mock(Configuration.class); + fs.setConf(conf); + Whitebox.setInternalState(fs, "useDeprecatedFileStatus", false); + Path path = new Path("/foo"); + File pipe = mock(File.class); + when(pipe.isFile()).thenReturn(false); + when(pipe.isDirectory()).thenReturn(false); + when(pipe.exists()).thenReturn(true); + + FileStatus stat = mock(FileStatus.class); + doReturn(pipe).when(fs).pathToFile(path); + doReturn(stat).when(fs).getFileStatus(path); + FileStatus[] stats = fs.listStatus(path); + assertTrue(stats != null && stats.length == 1 && stats[0] == stat); + } }
