HADOOP-13073 RawLocalFileSystem does not react on changing umask. Contributed by Andras Bokor
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/45af585e Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/45af585e Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/45af585e Branch: refs/heads/YARN-2915 Commit: 45af585e7ad23e7d5a5bc4dade00723d315ef6b2 Parents: 1fa1fab Author: Steve Loughran <[email protected]> Authored: Thu Jul 14 10:29:29 2016 +0100 Committer: Steve Loughran <[email protected]> Committed: Thu Jul 14 10:29:29 2016 +0100 ---------------------------------------------------------------------- .../apache/hadoop/fs/RawLocalFileSystem.java | 7 +-- .../fs/TestLocalFileSystemPermission.java | 56 +++++++++++++++++++- 2 files changed, 56 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/45af585e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java index cc41f4a..0fcddcf 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java +++ b/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. private static boolean useDeprecatedFileStatus = true; - private FsPermission umask; - @VisibleForTesting public static void useStatIfAvailable() { useDeprecatedFileStatus = !Stat.isAvailable(); @@ -99,7 +97,6 @@ public class RawLocalFileSystem extends FileSystem { public void initialize(URI uri, Configuration conf) throws IOException { super.initialize(uri, conf); setConf(conf); - umask = FsPermission.getUMask(conf); } /******************************************************* @@ -233,7 +230,7 @@ public class RawLocalFileSystem extends FileSystem { if (permission == null) { this.fos = new FileOutputStream(file, append); } else { - permission = permission.applyUMask(umask); + permission = permission.applyUMask(FsPermission.getUMask(getConf())); if (Shell.WINDOWS && NativeIO.isAvailable()) { this.fos = NativeIO.Windows.createFileOutputStreamWithMode(file, append, permission.toShort()); @@ -510,7 +507,7 @@ public class RawLocalFileSystem extends FileSystem { if (permission == null) { permission = FsPermission.getDirDefault(); } - permission = permission.applyUMask(umask); + permission = permission.applyUMask(FsPermission.getUMask(getConf())); if (Shell.WINDOWS && NativeIO.isAvailable()) { try { NativeIO.Windows.createDirectoryWithMode(p2f, permission.toShort()); http://git-wip-us.apache.org/repos/asf/hadoop/blob/45af585e/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystemPermission.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystemPermission.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystemPermission.java index e37de19..7252ab9 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFileSystemPermission.java +++ b/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 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. */ @@ -67,9 +71,9 @@ public class TestLocalFileSystemPermission extends TestCase { System.out.println("Cannot run test for Windows"); return; } - Configuration conf = new Configuration(); + LocalFileSystem localfs = FileSystem.getLocal(new Configuration()); + Configuration conf = localfs.getConf(); conf.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "044"); - LocalFileSystem localfs = FileSystem.getLocal(conf); Path dir = new Path(TEST_PATH_PREFIX + "dir"); localfs.mkdirs(dir); try { @@ -237,6 +241,54 @@ public class TestLocalFileSystemPermission extends TestCase { 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 { List<String> a = new ArrayList<String>(); String s = Shell.execCommand(Shell.getGroupsCommand()); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
