浏览代码

HADOOP-13073 RawLocalFileSystem does not react on changing umask. Contributed by Andras Bokor

Steve Loughran 9 年之前
父节点
当前提交
45af585e7a

+ 2 - 5
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java

@@ -64,8 +64,6 @@ public class RawLocalFileSystem extends FileSystem {
   // Temporary workaround for HADOOP-9652.
   // Temporary workaround for HADOOP-9652.
   private static boolean useDeprecatedFileStatus = true;
   private static boolean useDeprecatedFileStatus = true;
 
 
-  private FsPermission umask;
-
   @VisibleForTesting
   @VisibleForTesting
   public static void useStatIfAvailable() {
   public static void useStatIfAvailable() {
     useDeprecatedFileStatus = !Stat.isAvailable();
     useDeprecatedFileStatus = !Stat.isAvailable();
@@ -99,7 +97,6 @@ public class RawLocalFileSystem extends FileSystem {
   public void initialize(URI uri, Configuration conf) throws IOException {
   public void initialize(URI uri, Configuration conf) throws IOException {
     super.initialize(uri, conf);
     super.initialize(uri, conf);
     setConf(conf);
     setConf(conf);
-    umask = FsPermission.getUMask(conf);
   }
   }
   
   
   /*******************************************************
   /*******************************************************
@@ -233,7 +230,7 @@ public class RawLocalFileSystem extends FileSystem {
       if (permission == null) {
       if (permission == null) {
         this.fos = new FileOutputStream(file, append);
         this.fos = new FileOutputStream(file, append);
       } else {
       } else {
-        permission = permission.applyUMask(umask);
+        permission = permission.applyUMask(FsPermission.getUMask(getConf()));
         if (Shell.WINDOWS && NativeIO.isAvailable()) {
         if (Shell.WINDOWS && NativeIO.isAvailable()) {
           this.fos = NativeIO.Windows.createFileOutputStreamWithMode(file,
           this.fos = NativeIO.Windows.createFileOutputStreamWithMode(file,
               append, permission.toShort());
               append, permission.toShort());
@@ -510,7 +507,7 @@ public class RawLocalFileSystem extends FileSystem {
     if (permission == null) {
     if (permission == null) {
       permission = FsPermission.getDirDefault();
       permission = FsPermission.getDirDefault();
     }
     }
-    permission = permission.applyUMask(umask);
+    permission = permission.applyUMask(FsPermission.getUMask(getConf()));
     if (Shell.WINDOWS && NativeIO.isAvailable()) {
     if (Shell.WINDOWS && NativeIO.isAvailable()) {
       try {
       try {
         NativeIO.Windows.createDirectoryWithMode(p2f, permission.toShort());
         NativeIO.Windows.createDirectoryWithMode(p2f, permission.toShort());

+ 54 - 2
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystemPermission.java

@@ -29,6 +29,10 @@ import java.util.*;
 
 
 import junit.framework.*;
 import junit.framework.*;
 
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+
 /**
 /**
  * This class tests the local file system via the FileSystem abstraction.
  * This class tests the local file system via the FileSystem abstraction.
  */
  */
@@ -67,9 +71,9 @@ public class TestLocalFileSystemPermission extends TestCase {
       System.out.println("Cannot run test for Windows");
       System.out.println("Cannot run test for Windows");
       return;
       return;
     }
     }
-    Configuration conf = new Configuration();
+    LocalFileSystem localfs = FileSystem.getLocal(new Configuration());
+    Configuration conf = localfs.getConf();
     conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "044");
     conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "044");
-    LocalFileSystem localfs = FileSystem.getLocal(conf);
     Path dir = new Path(TEST_PATH_PREFIX + "dir");
     Path dir = new Path(TEST_PATH_PREFIX + "dir");
     localfs.mkdirs(dir);
     localfs.mkdirs(dir);
     try {
     try {
@@ -237,6 +241,54 @@ public class TestLocalFileSystemPermission extends TestCase {
     finally {cleanup(localfs, f);}
     finally {cleanup(localfs, f);}
   }
   }
 
 
+  /**
+   * Steps:
+   * 1. Create a directory with default permissions: 777 with umask 022
+   * 2. Check the directory has good permissions: 755
+   * 3. Set the umask to 062.
+   * 4. Create a new directory with default permissions.
+   * 5. For this directory we expect 715 as permission not 755
+   * @throws Exception we can throw away all the exception.
+   */
+  public void testSetUmaskInRealTime() throws Exception {
+    if (Path.WINDOWS) {
+      System.out.println("Cannot run test for Windows");
+      return;
+    }
+
+    LocalFileSystem localfs = FileSystem.getLocal(new Configuration());
+    Configuration conf = localfs.getConf();
+    conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "022");
+    System.out.println(
+        conf.get(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY));
+    Path dir = new Path(TEST_PATH_PREFIX + "dir");
+    Path dir2 = new Path(TEST_PATH_PREFIX + "dir2");
+    try {
+      assertTrue(localfs.mkdirs(dir));
+      FsPermission initialPermission = getPermission(localfs, dir);
+      assertEquals(
+          "With umask 022 permission should be 755 since the default " +
+              "permission is 777", new FsPermission("755"), initialPermission);
+
+      // Modify umask and create a new directory
+      // and check if new umask is applied
+      conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "062");
+      assertTrue(localfs.mkdirs(dir2));
+      FsPermission finalPermission = localfs.getFileStatus(dir2)
+          .getPermission();
+      assertThat("With umask 062 permission should not be 755 since the " +
+          "default permission is 777", new FsPermission("755"),
+          is(not(finalPermission)));
+      assertEquals(
+          "With umask 062 we expect 715 since the default permission is 777",
+          new FsPermission("715"), finalPermission);
+    } finally {
+      conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "022");
+      cleanup(localfs, dir);
+      cleanup(localfs, dir2);
+    }
+  }
+
   static List<String> getGroups() throws IOException {
   static List<String> getGroups() throws IOException {
     List<String> a = new ArrayList<String>();
     List<String> a = new ArrayList<String>();
     String s = Shell.execCommand(Shell.getGroupsCommand());
     String s = Shell.execCommand(Shell.getGroupsCommand());