HDFS-10650. DFSClient#mkdirs and DFSClient#primitiveMkdir should use default 
directory permission. Contributed by John Zhuge.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/328c855a
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/328c855a
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/328c855a

Branch: refs/heads/HADOOP-12756
Commit: 328c855a578b90362d33dc822075f9b828df6f1e
Parents: 26de4f0
Author: Xiao Chen <x...@apache.org>
Authored: Thu Jul 28 13:15:02 2016 -0700
Committer: Xiao Chen <x...@apache.org>
Committed: Thu Jul 28 13:15:02 2016 -0700

----------------------------------------------------------------------
 .../main/java/org/apache/hadoop/hdfs/DFSClient.java   | 14 ++++++++++----
 .../org/apache/hadoop/security/TestPermission.java    | 12 ++++++++++++
 2 files changed, 22 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/328c855a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
index aa48f7e..833b1ee 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
@@ -1163,6 +1163,13 @@ public class DFSClient implements java.io.Closeable, 
RemotePeerFactory,
     return permission.applyUMask(dfsClientConf.getUMask());
   }
 
+  private FsPermission applyUMaskDir(FsPermission permission) {
+    if (permission == null) {
+      permission = FsPermission.getDirDefault();
+    }
+    return permission.applyUMask(dfsClientConf.getUMask());
+  }
+
   /**
    * Same as {@link #create(String, FsPermission, EnumSet, boolean, short, 
long,
    * Progressable, int, ChecksumOpt)} with the addition of favoredNodes that is
@@ -2264,7 +2271,7 @@ public class DFSClient implements java.io.Closeable, 
RemotePeerFactory,
    *
    * @param src The path of the directory being created
    * @param permission The permission of the directory being created.
-   * If permission == null, use {@link FsPermission#getDefault()}.
+   * If permission == null, use {@link FsPermission#getDirDefault()}.
    * @param createParent create missing parent directory if true
    *
    * @return True if the operation success.
@@ -2273,7 +2280,7 @@ public class DFSClient implements java.io.Closeable, 
RemotePeerFactory,
    */
   public boolean mkdirs(String src, FsPermission permission,
       boolean createParent) throws IOException {
-    final FsPermission masked = applyUMask(permission);
+    final FsPermission masked = applyUMaskDir(permission);
     return primitiveMkdir(src, masked, createParent);
   }
 
@@ -2294,9 +2301,8 @@ public class DFSClient implements java.io.Closeable, 
RemotePeerFactory,
       boolean createParent) throws IOException {
     checkOpen();
     if (absPermission == null) {
-      absPermission = applyUMask(null);
+      absPermission = applyUMaskDir(null);
     }
-
     LOG.debug("{}: masked={}", src, absPermission);
     try (TraceScope ignored = tracer.newScope("mkdir")) {
       return namenode.mkdirs(src, absPermission, createParent);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/328c855a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java
index 5a17bbc..7efa255 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/security/TestPermission.java
@@ -17,8 +17,10 @@
  */
 package org.apache.hadoop.security;
 
+import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -49,6 +51,7 @@ public class TestPermission {
   final private static Path ROOT_PATH = new Path("/data");
   final private static Path CHILD_DIR1 = new Path(ROOT_PATH, "child1");
   final private static Path CHILD_DIR2 = new Path(ROOT_PATH, "child2");
+  final private static Path CHILD_DIR3 = new Path(ROOT_PATH, "child3");
   final private static Path CHILD_FILE1 = new Path(ROOT_PATH, "file1");
   final private static Path CHILD_FILE2 = new Path(ROOT_PATH, "file2");
   final private static Path CHILD_FILE3 = new Path(ROOT_PATH, "file3");
@@ -216,6 +219,9 @@ public class TestPermission {
       
       // following dir/file creations are legal
       nnfs.mkdirs(CHILD_DIR1);
+      status = nnfs.getFileStatus(CHILD_DIR1);
+      assertThat("Expect 755 = 777 (default dir) - 022 (default umask)",
+          status.getPermission().toString(), is("rwxr-xr-x"));
       out = nnfs.create(CHILD_FILE1);
       status = nnfs.getFileStatus(CHILD_FILE1);
       assertTrue(status.getPermission().toString().equals("rw-r--r--"));
@@ -227,6 +233,12 @@ public class TestPermission {
       status = nnfs.getFileStatus(CHILD_FILE1);
       assertTrue(status.getPermission().toString().equals("rwx------"));
 
+      // mkdirs with null permission
+      nnfs.mkdirs(CHILD_DIR3, null);
+      status = nnfs.getFileStatus(CHILD_DIR3);
+      assertThat("Expect 755 = 777 (default dir) - 022 (default umask)",
+          status.getPermission().toString(), is("rwxr-xr-x"));
+
       // following read is legal
       byte dataIn[] = new byte[FILE_LEN];
       FSDataInputStream fin = nnfs.open(CHILD_FILE1);


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to