You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by um...@apache.org on 2020/06/27 22:39:00 UTC
[hadoop] branch branch-3.3 updated: HADOOP-17029. Return correct
permission and owner for listing on internal directories in ViewFs.
Contributed by Abhishek Das.
This is an automated email from the ASF dual-hosted git repository.
umamahesh pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/branch-3.3 by this push:
new c3bef49 HADOOP-17029. Return correct permission and owner for listing on internal directories in ViewFs. Contributed by Abhishek Das.
c3bef49 is described below
commit c3bef4906c34d7a97493f2bbdd3dc35e08324520
Author: Abhishek Das <ab...@gmail.com>
AuthorDate: Fri Jun 5 14:56:51 2020 -0700
HADOOP-17029. Return correct permission and owner for listing on internal directories in ViewFs. Contributed by Abhishek Das.
(cherry picked from commit e7dd02768b658b2a1f216fbedc65938d9b6ca6e9)
---
.../apache/hadoop/fs/viewfs/ViewFileSystem.java | 27 +++--
.../java/org/apache/hadoop/fs/viewfs/ViewFs.java | 41 +++++--
.../hadoop/fs/viewfs/TestViewfsFileStatus.java | 118 ++++++++++++++++-----
3 files changed, 146 insertions(+), 40 deletions(-)
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java
index 2fde078..ddb3f2b 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFileSystem.java
@@ -1200,13 +1200,26 @@ public class ViewFileSystem extends FileSystem {
INode<FileSystem> inode = iEntry.getValue();
if (inode.isLink()) {
INodeLink<FileSystem> link = (INodeLink<FileSystem>) inode;
-
- 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));
+ try {
+ String linkedPath = link.getTargetFileSystem().getUri().getPath();
+ FileStatus status =
+ ((ChRootedFileSystem)link.getTargetFileSystem())
+ .getMyFs().getFileStatus(new Path(linkedPath));
+ result[i++] = new FileStatus(status.getLen(), false,
+ 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 {
result[i++] = new FileStatus(0, true, 0, 0,
creationTime, creationTime, PERMISSION_555,
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java
index 607bdb8..df10dce 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/viewfs/ViewFs.java
@@ -917,11 +917,25 @@ public class ViewFs extends AbstractFileSystem {
if (inode.isLink()) {
INodeLink<AbstractFileSystem> inodelink =
(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(),
inodelink.getTargetLink(),
new Path(inode.fullPath).makeQualified(
myUri, null));
+ }
} else {
result = new FileStatus(0, true, 0, 0, creationTime, creationTime,
PERMISSION_555, ugi.getShortUserName(), ugi.getPrimaryGroupName(),
@@ -976,12 +990,25 @@ public class ViewFs extends AbstractFileSystem {
INodeLink<AbstractFileSystem> link =
(INodeLink<AbstractFileSystem>) inode;
- 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));
+ try {
+ String linkedPath = link.getTargetFileSystem().getUri().getPath();
+ FileStatus status = ((ChRootedFs)link.getTargetFileSystem())
+ .getMyFs().getFileStatus(new Path(linkedPath));
+ result[i++] = new FileStatus(status.getLen(), false,
+ 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 {
result[i++] = new FileStatus(0, true, 0, 0,
creationTime, creationTime,
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java
index 0c31c8e..29fcc22 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/TestViewfsFileStatus.java
@@ -29,10 +29,13 @@ import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.FsConstants;
import org.apache.hadoop.fs.Path;
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.DataOutputBuffer;
import org.apache.hadoop.test.GenericTestUtils;
+import org.junit.After;
import org.junit.AfterClass;
+import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
@@ -48,6 +51,17 @@ public class TestViewfsFileStatus {
private static final File TEST_DIR = GenericTestUtils.getTestDir(
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
public void testFileStatusSerialziation()
throws IOException, URISyntaxException {
@@ -56,38 +70,90 @@ public class TestViewfsFileStatus {
File infile = new File(TEST_DIR, testfilename);
final byte[] content = "dingos".getBytes();
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(infile);
+ try (FileOutputStream fos = new FileOutputStream(infile)) {
fos.write(content);
- } finally {
- if (fos != null) {
- fos.close();
- }
}
assertEquals((long)content.length, infile.length());
Configuration conf = new Configuration();
ConfigUtil.addLink(conf, "/foo/bar/baz", TEST_DIR.toURI());
- FileSystem vfs = FileSystem.get(FsConstants.VIEWFS_URI, conf);
- assertEquals(ViewFileSystem.class, vfs.getClass());
- Path path = new Path("/foo/bar/baz", testfilename);
- FileStatus stat = vfs.getFileStatus(path);
- assertEquals(content.length, stat.getLen());
- ContractTestUtils.assertNotErasureCoded(vfs, path);
- assertTrue(path + " should have erasure coding unset in " +
- "FileStatus#toString(): " + stat,
- stat.toString().contains("isErasureCoded=false"));
-
- // check serialization/deserialization
- DataOutputBuffer dob = new DataOutputBuffer();
- stat.write(dob);
- DataInputBuffer dib = new DataInputBuffer();
- dib.reset(dob.getData(), 0, dob.getLength());
- FileStatus deSer = new FileStatus();
- deSer.readFields(dib);
- assertEquals(content.length, deSer.getLen());
- assertFalse(deSer.isErasureCoded());
+ try (FileSystem vfs = FileSystem.get(FsConstants.VIEWFS_URI, conf)) {
+ assertEquals(ViewFileSystem.class, vfs.getClass());
+ Path path = new Path("/foo/bar/baz", testfilename);
+ FileStatus stat = vfs.getFileStatus(path);
+ assertEquals(content.length, stat.getLen());
+ ContractTestUtils.assertNotErasureCoded(vfs, path);
+ assertTrue(path + " should have erasure coding unset in " +
+ "FileStatus#toString(): " + stat,
+ stat.toString().contains("isErasureCoded=false"));
+
+ // check serialization/deserialization
+ DataOutputBuffer dob = new DataOutputBuffer();
+ stat.write(dob);
+ DataInputBuffer dib = new DataInputBuffer();
+ dib.reset(dob.getData(), 0, dob.getLength());
+ FileStatus deSer = new FileStatus();
+ deSer.readFields(dib);
+ assertEquals(content.length, deSer.getLen());
+ 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
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org