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 cc41f4a41e..0fcddcf098 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 File pathToFile(Path path) { public void initialize(URI uri, Configuration conf) throws IOException { super.initialize(uri, conf); setConf(conf); - umask = FsPermission.getUMask(conf); } /******************************************************* @@ -233,7 +230,7 @@ private LocalFSFileOutputStream(Path f, boolean append, 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 @@ protected boolean mkOneDirWithMode(Path p, File p2f, FsPermission permission) 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()); 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 e37de1957b..7252ab97cb 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 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 void testLocalFSDirsetPermission() throws IOException { 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 void testLocalFSsetOwner() throws IOException { 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 getGroups() throws IOException { List a = new ArrayList(); String s = Shell.execCommand(Shell.getGroupsCommand());