HADOOP-17029. Return correct permission and owner for listing on internal directories in ViewFs. Contributed by Abhishek Das.
(cherry picked from commit e7dd02768b
)
This commit is contained in:
parent
fa41e38450
commit
c3bef4906c
|
@ -1200,13 +1200,26 @@ public class ViewFileSystem extends FileSystem {
|
||||||
INode<FileSystem> inode = iEntry.getValue();
|
INode<FileSystem> inode = iEntry.getValue();
|
||||||
if (inode.isLink()) {
|
if (inode.isLink()) {
|
||||||
INodeLink<FileSystem> link = (INodeLink<FileSystem>) inode;
|
INodeLink<FileSystem> link = (INodeLink<FileSystem>) inode;
|
||||||
|
try {
|
||||||
result[i++] = new FileStatus(0, false, 0, 0,
|
String linkedPath = link.getTargetFileSystem().getUri().getPath();
|
||||||
creationTime, creationTime, PERMISSION_555,
|
FileStatus status =
|
||||||
ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
((ChRootedFileSystem)link.getTargetFileSystem())
|
||||||
link.getTargetLink(),
|
.getMyFs().getFileStatus(new Path(linkedPath));
|
||||||
new Path(inode.fullPath).makeQualified(
|
result[i++] = new FileStatus(status.getLen(), false,
|
||||||
myUri, null));
|
status.getReplication(), status.getBlockSize(),
|
||||||
|
status.getModificationTime(), status.getAccessTime(),
|
||||||
|
status.getPermission(), status.getOwner(), status.getGroup(),
|
||||||
|
link.getTargetLink(),
|
||||||
|
new Path(inode.fullPath).makeQualified(
|
||||||
|
myUri, null));
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
result[i++] = new FileStatus(0, false, 0, 0,
|
||||||
|
creationTime, creationTime, PERMISSION_555,
|
||||||
|
ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
||||||
|
link.getTargetLink(),
|
||||||
|
new Path(inode.fullPath).makeQualified(
|
||||||
|
myUri, null));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
result[i++] = new FileStatus(0, true, 0, 0,
|
result[i++] = new FileStatus(0, true, 0, 0,
|
||||||
creationTime, creationTime, PERMISSION_555,
|
creationTime, creationTime, PERMISSION_555,
|
||||||
|
|
|
@ -917,11 +917,25 @@ public class ViewFs extends AbstractFileSystem {
|
||||||
if (inode.isLink()) {
|
if (inode.isLink()) {
|
||||||
INodeLink<AbstractFileSystem> inodelink =
|
INodeLink<AbstractFileSystem> inodelink =
|
||||||
(INodeLink<AbstractFileSystem>) inode;
|
(INodeLink<AbstractFileSystem>) inode;
|
||||||
result = new FileStatus(0, false, 0, 0, creationTime, creationTime,
|
try {
|
||||||
|
String linkedPath = inodelink.getTargetFileSystem()
|
||||||
|
.getUri().getPath();
|
||||||
|
FileStatus status = ((ChRootedFs)inodelink.getTargetFileSystem())
|
||||||
|
.getMyFs().getFileStatus(new Path(linkedPath));
|
||||||
|
result = new FileStatus(status.getLen(), false,
|
||||||
|
status.getReplication(), status.getBlockSize(),
|
||||||
|
status.getModificationTime(), status.getAccessTime(),
|
||||||
|
status.getPermission(), status.getOwner(), status.getGroup(),
|
||||||
|
inodelink.getTargetLink(),
|
||||||
|
new Path(inode.fullPath).makeQualified(
|
||||||
|
myUri, null));
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
result = new FileStatus(0, false, 0, 0, creationTime, creationTime,
|
||||||
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
||||||
inodelink.getTargetLink(),
|
inodelink.getTargetLink(),
|
||||||
new Path(inode.fullPath).makeQualified(
|
new Path(inode.fullPath).makeQualified(
|
||||||
myUri, null));
|
myUri, null));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
result = new FileStatus(0, true, 0, 0, creationTime, creationTime,
|
result = new FileStatus(0, true, 0, 0, creationTime, creationTime,
|
||||||
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
||||||
|
@ -976,12 +990,25 @@ public class ViewFs extends AbstractFileSystem {
|
||||||
INodeLink<AbstractFileSystem> link =
|
INodeLink<AbstractFileSystem> link =
|
||||||
(INodeLink<AbstractFileSystem>) inode;
|
(INodeLink<AbstractFileSystem>) inode;
|
||||||
|
|
||||||
result[i++] = new FileStatus(0, false, 0, 0,
|
try {
|
||||||
creationTime, creationTime,
|
String linkedPath = link.getTargetFileSystem().getUri().getPath();
|
||||||
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
FileStatus status = ((ChRootedFs)link.getTargetFileSystem())
|
||||||
link.getTargetLink(),
|
.getMyFs().getFileStatus(new Path(linkedPath));
|
||||||
new Path(inode.fullPath).makeQualified(
|
result[i++] = new FileStatus(status.getLen(), false,
|
||||||
myUri, null));
|
status.getReplication(), status.getBlockSize(),
|
||||||
|
status.getModificationTime(), status.getAccessTime(),
|
||||||
|
status.getPermission(), status.getOwner(), status.getGroup(),
|
||||||
|
link.getTargetLink(),
|
||||||
|
new Path(inode.fullPath).makeQualified(
|
||||||
|
myUri, null));
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
result[i++] = new FileStatus(0, false, 0, 0,
|
||||||
|
creationTime, creationTime, PERMISSION_555,
|
||||||
|
ugi.getShortUserName(), ugi.getPrimaryGroupName(),
|
||||||
|
link.getTargetLink(),
|
||||||
|
new Path(inode.fullPath).makeQualified(
|
||||||
|
myUri, null));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
result[i++] = new FileStatus(0, true, 0, 0,
|
result[i++] = new FileStatus(0, true, 0, 0,
|
||||||
creationTime, creationTime,
|
creationTime, creationTime,
|
||||||
|
|
|
@ -29,10 +29,13 @@ import org.apache.hadoop.fs.FileUtil;
|
||||||
import org.apache.hadoop.fs.FsConstants;
|
import org.apache.hadoop.fs.FsConstants;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
||||||
|
import org.apache.hadoop.fs.permission.FsPermission;
|
||||||
import org.apache.hadoop.io.DataInputBuffer;
|
import org.apache.hadoop.io.DataInputBuffer;
|
||||||
import org.apache.hadoop.io.DataOutputBuffer;
|
import org.apache.hadoop.io.DataOutputBuffer;
|
||||||
import org.apache.hadoop.test.GenericTestUtils;
|
import org.apache.hadoop.test.GenericTestUtils;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
@ -48,6 +51,17 @@ public class TestViewfsFileStatus {
|
||||||
private static final File TEST_DIR = GenericTestUtils.getTestDir(
|
private static final File TEST_DIR = GenericTestUtils.getTestDir(
|
||||||
TestViewfsFileStatus.class.getSimpleName());
|
TestViewfsFileStatus.class.getSimpleName());
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
FileUtil.fullyDelete(TEST_DIR);
|
||||||
|
assertTrue(TEST_DIR.mkdirs());
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws IOException {
|
||||||
|
FileUtil.fullyDelete(TEST_DIR);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFileStatusSerialziation()
|
public void testFileStatusSerialziation()
|
||||||
throws IOException, URISyntaxException {
|
throws IOException, URISyntaxException {
|
||||||
|
@ -56,38 +70,90 @@ public class TestViewfsFileStatus {
|
||||||
File infile = new File(TEST_DIR, testfilename);
|
File infile = new File(TEST_DIR, testfilename);
|
||||||
final byte[] content = "dingos".getBytes();
|
final byte[] content = "dingos".getBytes();
|
||||||
|
|
||||||
FileOutputStream fos = null;
|
try (FileOutputStream fos = new FileOutputStream(infile)) {
|
||||||
try {
|
|
||||||
fos = new FileOutputStream(infile);
|
|
||||||
fos.write(content);
|
fos.write(content);
|
||||||
} finally {
|
|
||||||
if (fos != null) {
|
|
||||||
fos.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
assertEquals((long)content.length, infile.length());
|
assertEquals((long)content.length, infile.length());
|
||||||
|
|
||||||
Configuration conf = new Configuration();
|
Configuration conf = new Configuration();
|
||||||
ConfigUtil.addLink(conf, "/foo/bar/baz", TEST_DIR.toURI());
|
ConfigUtil.addLink(conf, "/foo/bar/baz", TEST_DIR.toURI());
|
||||||
FileSystem vfs = FileSystem.get(FsConstants.VIEWFS_URI, conf);
|
try (FileSystem vfs = FileSystem.get(FsConstants.VIEWFS_URI, conf)) {
|
||||||
assertEquals(ViewFileSystem.class, vfs.getClass());
|
assertEquals(ViewFileSystem.class, vfs.getClass());
|
||||||
Path path = new Path("/foo/bar/baz", testfilename);
|
Path path = new Path("/foo/bar/baz", testfilename);
|
||||||
FileStatus stat = vfs.getFileStatus(path);
|
FileStatus stat = vfs.getFileStatus(path);
|
||||||
assertEquals(content.length, stat.getLen());
|
assertEquals(content.length, stat.getLen());
|
||||||
ContractTestUtils.assertNotErasureCoded(vfs, path);
|
ContractTestUtils.assertNotErasureCoded(vfs, path);
|
||||||
assertTrue(path + " should have erasure coding unset in " +
|
assertTrue(path + " should have erasure coding unset in " +
|
||||||
"FileStatus#toString(): " + stat,
|
"FileStatus#toString(): " + stat,
|
||||||
stat.toString().contains("isErasureCoded=false"));
|
stat.toString().contains("isErasureCoded=false"));
|
||||||
|
|
||||||
// check serialization/deserialization
|
// check serialization/deserialization
|
||||||
DataOutputBuffer dob = new DataOutputBuffer();
|
DataOutputBuffer dob = new DataOutputBuffer();
|
||||||
stat.write(dob);
|
stat.write(dob);
|
||||||
DataInputBuffer dib = new DataInputBuffer();
|
DataInputBuffer dib = new DataInputBuffer();
|
||||||
dib.reset(dob.getData(), 0, dob.getLength());
|
dib.reset(dob.getData(), 0, dob.getLength());
|
||||||
FileStatus deSer = new FileStatus();
|
FileStatus deSer = new FileStatus();
|
||||||
deSer.readFields(dib);
|
deSer.readFields(dib);
|
||||||
assertEquals(content.length, deSer.getLen());
|
assertEquals(content.length, deSer.getLen());
|
||||||
assertFalse(deSer.isErasureCoded());
|
assertFalse(deSer.isErasureCoded());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the ACL returned from getFileStatus for directories and files.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testListStatusACL() throws IOException {
|
||||||
|
String testfilename = "testFileACL";
|
||||||
|
String childDirectoryName = "testDirectoryACL";
|
||||||
|
TEST_DIR.mkdirs();
|
||||||
|
File infile = new File(TEST_DIR, testfilename);
|
||||||
|
final byte[] content = "dingos".getBytes();
|
||||||
|
|
||||||
|
try (FileOutputStream fos = new FileOutputStream(infile)) {
|
||||||
|
fos.write(content);
|
||||||
|
}
|
||||||
|
assertEquals(content.length, infile.length());
|
||||||
|
File childDir = new File(TEST_DIR, childDirectoryName);
|
||||||
|
childDir.mkdirs();
|
||||||
|
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
ConfigUtil.addLink(conf, "/file", infile.toURI());
|
||||||
|
ConfigUtil.addLink(conf, "/dir", childDir.toURI());
|
||||||
|
|
||||||
|
try (FileSystem vfs = FileSystem.get(FsConstants.VIEWFS_URI, conf)) {
|
||||||
|
assertEquals(ViewFileSystem.class, vfs.getClass());
|
||||||
|
FileStatus[] statuses = vfs.listStatus(new Path("/"));
|
||||||
|
|
||||||
|
FileSystem localFs = FileSystem.getLocal(conf);
|
||||||
|
FileStatus fileStat = localFs.getFileStatus(new Path(infile.getPath()));
|
||||||
|
FileStatus dirStat = localFs.getFileStatus(new Path(childDir.getPath()));
|
||||||
|
|
||||||
|
for (FileStatus status : statuses) {
|
||||||
|
if (status.getPath().getName().equals("file")) {
|
||||||
|
assertEquals(fileStat.getPermission(), status.getPermission());
|
||||||
|
} else {
|
||||||
|
assertEquals(dirStat.getPermission(), status.getPermission());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
localFs.setPermission(new Path(infile.getPath()),
|
||||||
|
FsPermission.valueOf("-rwxr--r--"));
|
||||||
|
localFs.setPermission(new Path(childDir.getPath()),
|
||||||
|
FsPermission.valueOf("-r--rwxr--"));
|
||||||
|
|
||||||
|
statuses = vfs.listStatus(new Path("/"));
|
||||||
|
for (FileStatus status : statuses) {
|
||||||
|
if (status.getPath().getName().equals("file")) {
|
||||||
|
assertEquals(FsPermission.valueOf("-rwxr--r--"),
|
||||||
|
status.getPermission());
|
||||||
|
} else {
|
||||||
|
assertEquals(FsPermission.valueOf("-r--rwxr--"),
|
||||||
|
status.getPermission());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that ViewFileSystem.getFileChecksum calls res.targetFileSystem
|
// Tests that ViewFileSystem.getFileChecksum calls res.targetFileSystem
|
||||||
|
|
Loading…
Reference in New Issue