HDFS-8767. RawLocalFileSystem.listStatus() returns null for UNIX pipefile. Contributed by kanaka kumar avvaru.

This commit is contained in:
Haohui Mai 2015-07-16 15:21:53 -07:00
parent 0bda84fd48
commit d96bbe152c
3 changed files with 53 additions and 25 deletions

View File

@ -987,6 +987,9 @@ Release 2.7.2 - UNRELEASED
HADOOP-12191. Bzip2Factory is not thread safe. (Brahma Reddy Battula HADOOP-12191. Bzip2Factory is not thread safe. (Brahma Reddy Battula
via ozawa) via ozawa)
HDFS-8767. RawLocalFileSystem.listStatus() returns null for UNIX pipefile.
(kanaka kumar avvaru via wheat9)
Release 2.7.1 - 2015-07-06 Release 2.7.1 - 2015-07-06
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -459,35 +459,38 @@ public class RawLocalFileSystem extends FileSystem {
if (!localf.exists()) { if (!localf.exists()) {
throw new FileNotFoundException("File " + f + " does not exist"); throw new FileNotFoundException("File " + f + " does not exist");
} }
if (localf.isFile()) {
if (!useDeprecatedFileStatus) { if (localf.isDirectory()) {
return new FileStatus[] { getFileStatus(f) }; String[] names = localf.list();
if (names == null) {
return null;
} }
return new FileStatus[] { results = new FileStatus[names.length];
new DeprecatedRawLocalFileStatus(localf, getDefaultBlockSize(f), this)}; 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);
} }
String[] names = localf.list(); if (!useDeprecatedFileStatus) {
if (names == null) { return new FileStatus[] { getFileStatus(f) };
return null;
} }
results = new FileStatus[names.length]; return new FileStatus[] {
int j = 0; new DeprecatedRawLocalFileStatus(localf,
for (int i = 0; i < names.length; i++) { getDefaultBlockSize(f), this) };
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);
} }
protected boolean mkOneDir(File p2f) throws IOException { protected boolean mkOneDir(File p2f) throws IOException {

View File

@ -32,11 +32,14 @@ import java.util.Random;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import static org.mockito.Mockito.*;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.internal.util.reflection.Whitebox;
/** /**
* This class tests the local file system via the FileSystem abstraction. * This class tests the local file system via the FileSystem abstraction.
@ -612,4 +615,23 @@ public class TestLocalFileSystem {
} }
} }
@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);
}
} }