You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-dev@hadoop.apache.org by "Shashikant Banerjee (Jira)" <ji...@apache.org> on 2021/07/19 14:29:00 UTC

[jira] [Created] (HDFS-16132) SnapshotDiff report fails with invalid path assertion with external Attribute provider

Shashikant Banerjee created HDFS-16132:
------------------------------------------

             Summary: SnapshotDiff report fails with invalid path assertion with external Attribute provider
                 Key: HDFS-16132
                 URL: https://issues.apache.org/jira/browse/HDFS-16132
             Project: Hadoop HDFS
          Issue Type: Bug
            Reporter: Shashikant Banerjee
            Assignee: Shashikant Banerjee


The issue can be reproduced with the below unit test:
{code:java}
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeAttributeProvider.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeAttributeProvider.java index 512d1029835..27b80882766 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeAttributeProvider.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestINodeAttributeProvider.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.Lists; @@ -89,7 +90,7 @@ public void checkPermissionWithContext(            AuthorizationContext authzContext) throws AccessControlException {          if (authzContext.getAncestorIndex() > 1              && authzContext.getInodes()[1].getLocalName().equals("user") -            && authzContext.getInodes()[2].getLocalName().equals("acl")) { +            && authzContext.getInodes()[2].getLocalName().equals("acl") || runPermissionCheck) {            this.ace.checkPermissionWithContext(authzContext);          }          CALLED.add("checkPermission|" + authzContext.getAncestorAccess() @@ -598,6 +599,55 @@ public Void run() throws Exception {          return null;        }      }); +  } +  @Test +  public void testAttrProviderSeesResolvedSnapahotPaths1() throws Exception { +    runPermissionCheck = true; +    FileSystem fs = FileSystem.get(miniDFS.getConfiguration(0)); +    DistributedFileSystem hdfs = miniDFS.getFileSystem(); +    final Path parent = new Path("/user"); +    hdfs.mkdirs(parent); +    fs.setPermission(parent, new FsPermission(HDFS_PERMISSION)); +    final Path sub1 = new Path(parent, "sub1"); +    final Path sub1foo = new Path(sub1, "foo"); +    hdfs.mkdirs(sub1); +    hdfs.mkdirs(sub1foo); +    Path f = new Path(sub1foo, "file0"); +    DFSTestUtil.createFile(hdfs, f, 0, (short) 1, 0); +    hdfs.allowSnapshot(parent); +    hdfs.createSnapshot(parent, "s0"); + +    f = new Path(sub1foo, "file1"); +    DFSTestUtil.createFile(hdfs, f, 0, (short) 1, 0); +    f = new Path(sub1foo, "file2"); +    DFSTestUtil.createFile(hdfs, f, 0, (short) 1, 0); + +    final Path sub2 = new Path(parent, "sub2"); +    hdfs.mkdirs(sub2); +    final Path sub2foo = new Path(sub2, "foo"); +    // mv /parent/sub1/foo to /parent/sub2/foo +    hdfs.rename(sub1foo, sub2foo); + +    hdfs.createSnapshot(parent, "s1"); +    hdfs.createSnapshot(parent, "s2"); + +    final Path sub3 = new Path(parent, "sub3"); +    hdfs.mkdirs(sub3); +    // mv /parent/sub2/foo to /parent/sub3/foo +    hdfs.rename(sub2foo, sub3); + +    hdfs.delete(sub3, true); +    UserGroupInformation ugi = +        UserGroupInformation.createUserForTesting("u1", new String[] { "g1" }); +    ugi.doAs(new PrivilegedExceptionAction<Void>() { +      @Override +      public Void run() throws Exception { +        FileSystem fs = FileSystem.get(miniDFS.getConfiguration(0)); +        ((DistributedFileSystem)fs).getSnapshotDiffReport(parent, "s1", "s2"); +        CALLED.clear(); +        return null; +      } +    });    } }
{code}
It fails with the below error when executed:
{code:java}
org.apache.hadoop.ipc.RemoteException(java.lang.AssertionError): Absolute path required, but got 'foo'org.apache.hadoop.ipc.RemoteException(java.lang.AssertionError): Absolute path required, but got 'foo' at org.apache.hadoop.hdfs.server.namenode.INode.checkAbsolutePath(INode.java:838) at org.apache.hadoop.hdfs.server.namenode.INode.getPathComponents(INode.java:813) at org.apache.hadoop.hdfs.server.namenode.INodesInPath.resolveFromRoot(INodesInPath.java:154) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.getINodeAttrs(FSPermissionChecker.java:447) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkSubAccess(FSPermissionChecker.java:507) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:403) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermissionWithContext(FSPermissionChecker.java:417) at org.apache.hadoop.hdfs.server.namenode.TestINodeAttributeProvider$MyAuthorizationProvider$MyAccessControlEnforcer.checkPermissionWithContext(TestINodeAttributeProvider.java:94) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:297) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1951) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1932) at org.apache.hadoop.hdfs.server.namenode.FSDirSnapshotOp.checkSubtreeReadPermission(FSDirSnapshotOp.java:317) at org.apache.hadoop.hdfs.server.namenode.FSDirSnapshotOp.getSnapshotDiffReportListing(FSDirSnapshotOp.java:208) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getSnapshotDiffReportListing(FSNamesystem.java:7238) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getSnapshotDiffReportListing(NameNodeRpcServer.java:2045){code}
This is a regression with https://issues.apache.org/jira/browse/HDFS-15372.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-dev-unsubscribe@hadoop.apache.org
For additional commands, e-mail: hdfs-dev-help@hadoop.apache.org