瀏覽代碼

HADOOP-14049. Honour AclBit flag associated to file/folder permission for Azure datalake account. Contributed by Vishwajeet Dusane

(cherry picked from commit f4329990250bed62efdebe3ce2bc740092cf9573)
(cherry picked from commit a14686680228d13386ccde7272e3b5bdabe7c792)
(cherry picked from commit f0df481c76fbff4c8f362db89a060ee736d3f411)
Mingliang Liu 8 年之前
父節點
當前提交
726c7c725f

+ 5 - 1
hadoop-tools/hadoop-azure-datalake/src/main/java/org/apache/hadoop/fs/adl/AdlFileSystem.java

@@ -593,7 +593,11 @@ public class AdlFileSystem extends FileSystem {
     boolean isDirectory = entry.type == DirectoryEntryType.DIRECTORY;
     long lastModificationData = entry.lastModifiedTime.getTime();
     long lastAccessTime = entry.lastAccessTime.getTime();
-    FsPermission permission = new AdlPermission(aclBitStatus,
+    // set aclBit from ADLS backend response if
+    // ADL_SUPPORT_ACL_BIT_IN_FSPERMISSION is true.
+    final boolean aclBit = aclBitStatus ? entry.aclBit : false;
+
+    FsPermission permission = new AdlPermission(aclBit,
         Short.valueOf(entry.permission, 8));
     String user = entry.user;
     String group = entry.group;

+ 21 - 0
hadoop-tools/hadoop-azure-datalake/src/test/java/org/apache/hadoop/fs/adl/TestADLResponseData.java

@@ -66,6 +66,15 @@ public final class TestADLResponseData {
         "\"owner\":\"NotSupportYet\",\"group\":\"NotSupportYet\"}}";
   }
 
+  public static String getGetFileStatusJSONResponse(boolean aclBit) {
+    return "{\"FileStatus\":{\"length\":1024," +
+        "\"pathSuffix\":\"\",\"type\":\"FILE\",\"blockSize\":268435456," +
+        "\"accessTime\":1452103827023,\"modificationTime\":1452103827023," +
+        "\"replication\":0,\"permission\":\"777\"," +
+        "\"owner\":\"NotSupportYet\",\"group\":\"NotSupportYet\",\"aclBit\":\""
+        + aclBit + "\"}}";
+  }
+
   public static String getListFileStatusJSONResponse(int dirSize) {
     String list = "";
     for (int i = 0; i < dirSize; ++i) {
@@ -81,6 +90,18 @@ public final class TestADLResponseData {
     return "{\"FileStatuses\":{\"FileStatus\":[" + list + "]}}";
   }
 
+  public static String getListFileStatusJSONResponse(boolean aclBit) {
+    return "{\"FileStatuses\":{\"FileStatus\":[{\"length\":0,\"pathSuffix\":\""
+        + java.util.UUID.randomUUID()
+        + "\",\"type\":\"DIRECTORY\",\"blockSize\":0,"
+        + "\"accessTime\":1481184513488,"
+        + "\"modificationTime\":1481184513488,\"replication\":0,"
+        + "\"permission\":\"770\","
+        + "\"owner\":\"4b27fe1a-d9ab-4a04-ad7a-4bba72cd9e6c\","
+        + "\"group\":\"4b27fe1a-d9ab-4a04-ad7a-4bba72cd9e6c\",\"aclBit\":\""
+        + aclBit + "\"}]}}";
+  }
+
   public static String getJSONResponse(boolean status) {
     return "{\"boolean\":" + status + "}";
   }

+ 25 - 0
hadoop-tools/hadoop-azure-datalake/src/test/java/org/apache/hadoop/fs/adl/TestGetFileStatus.java

@@ -67,4 +67,29 @@ public class TestGetFileStatus extends AdlMockWebServer {
     Assert.assertEquals("NotSupportYet", fileStatus.getGroup());
   }
 
+    @Test
+    public void getFileStatusAclBit()
+            throws URISyntaxException, IOException {
+        // With ACLBIT set to true
+        getMockServer().enqueue(new MockResponse().setResponseCode(200)
+                .setBody(TestADLResponseData.getGetFileStatusJSONResponse(true)));
+        long startTime = Time.monotonicNow();
+        FileStatus fileStatus = getMockAdlFileSystem()
+                .getFileStatus(new Path("/test1/test2"));
+        long endTime = Time.monotonicNow();
+        LOG.debug("Time : " + (endTime - startTime));
+        Assert.assertTrue(fileStatus.isFile());
+        Assert.assertEquals(true, fileStatus.getPermission().getAclBit());
+
+        // With ACLBIT set to false
+        getMockServer().enqueue(new MockResponse().setResponseCode(200)
+                .setBody(TestADLResponseData.getGetFileStatusJSONResponse(false)));
+        startTime = Time.monotonicNow();
+        fileStatus = getMockAdlFileSystem()
+                .getFileStatus(new Path("/test1/test2"));
+        endTime = Time.monotonicNow();
+        LOG.debug("Time : " + (endTime - startTime));
+        Assert.assertTrue(fileStatus.isFile());
+        Assert.assertEquals(false, fileStatus.getPermission().getAclBit());
+    }
 }

+ 32 - 0
hadoop-tools/hadoop-azure-datalake/src/test/java/org/apache/hadoop/fs/adl/TestListStatus.java

@@ -29,6 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.net.URISyntaxException;
 
 /**
  * This class is responsible for testing local listStatus implementation to
@@ -100,4 +101,35 @@ public class TestListStatus extends AdlMockWebServer {
     LOG.debug("Time : " + (endTime - startTime));
   }
 
+  @Test
+  public void listStatusAclBit()
+          throws URISyntaxException, IOException {
+    // With ACLBIT set to true
+    getMockServer().enqueue(new MockResponse().setResponseCode(200)
+            .setBody(TestADLResponseData.getListFileStatusJSONResponse(true)));
+    FileStatus[] ls = null;
+    long startTime = Time.monotonicNow();
+    ls = getMockAdlFileSystem()
+            .listStatus(new Path("/test1/test2"));
+    long endTime = Time.monotonicNow();
+    LOG.debug("Time : " + (endTime - startTime));
+    for (int i = 0; i < ls.length; i++) {
+      Assert.assertTrue(ls[i].isDirectory());
+      Assert.assertEquals(true, ls[i].getPermission().getAclBit());
+    }
+
+    // With ACLBIT set to false
+    ls = null;
+    getMockServer().enqueue(new MockResponse().setResponseCode(200)
+            .setBody(TestADLResponseData.getListFileStatusJSONResponse(false)));
+    startTime = Time.monotonicNow();
+    ls = getMockAdlFileSystem()
+            .listStatus(new Path("/test1/test2"));
+    endTime = Time.monotonicNow();
+    LOG.debug("Time : " + (endTime - startTime));
+    for (int i = 0; i < ls.length; i++) {
+      Assert.assertTrue(ls[i].isDirectory());
+      Assert.assertEquals(false, ls[i].getPermission().getAclBit());
+    }
+  }
 }