[
https://issues.apache.org/jira/browse/HDFS-6165?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13958981#comment-13958981
]
Yongjun Zhang commented on HDFS-6165:
-------------------------------------
Hi [~daryn],
Thanks for your earlier comment at 29/Mar/14 12:26. I've uploaded patch
revision 004 to address them. Would you please help reviewing this version?
Thanks a lot.
Some notable changes and comments:
1. No -f is introduced as in previous patch revisions.
2. When deleting empty directory, in addition to the other permissions, READ
permission is required for the empty directory.
3. Prior to my change, Rmdir command uses listStatus method to check whether
it's empty. Curently the listStatus method requires both READ and EXECUTE
permission. My patch changed the way how to check whether a directory is empty
by using PathIsNotEmptyDirectoryException.
4. As stated in 3, listStatus method requires READ and EXECUTE permission. For
the purpose of checking whether a dir is empty, we probably can have another
lightweight API that only requires READ permission. I did not introduce this
API, but I can do it if we can agree upon.
My understanding is, listStatus is similar to command "ls -l". I think the new
API would be similar to "ls". Basically the new API should be able to tell how
many entries in a directory without the need of EXECUTE permission, below is
how centOs system works, when the target directory has no EXECUTE permission:
{code}
[root@yjzsn usrxyz]# ls -lrt
total 24
drwx------ 2 abc abc 4096 Apr 2 17:39 abc-notempty
drwxr--r-- 2 abc abc 4096 Apr 2 17:39 abc-notempty1
drwx------ 2 abc abc 4096 Apr 2 17:39 abc-empty
drwxr----- 2 abc abc 4096 Apr 2 17:39 abc-empty1
drwx---r-- 2 abc abc 4096 Apr 2 17:39 abc-empty2
drwxr--r-- 2 abc abc 4096 Apr 2 17:39 abc-empty3
[root@yjzsn usrxyz]# su usrxyz
[usrxyz@yjzsn ~]$ ls abc-notempty
ls: cannot open directory abc-notempty: Permission denied
[usrxyz@yjzsn ~]$ ls abc-notempty1 <== with READ perm, this one lists the
file name in it (xyz.txt), prints "Permission denied" because of xyz.txt's
permission
ls: cannot access abc-notempty1/xyz.txt: Permission denied
xyz.txt
[usrxyz@yjzsn ~]$
[usrxyz@yjzsn ~]$ ls abc-empty1
ls: cannot open directory abc-empty1: Permission denied
[usrxyz@yjzsn ~]$ ls abc-empty2
[usrxyz@yjzsn ~]$ ls abc-empty3
[usrxyz@yjzsn ~]$
{code}
> "hdfs dfs -rm -r" and "hdfs -rmdir" commands can't remove empty directory
> --------------------------------------------------------------------------
>
> Key: HDFS-6165
> URL: https://issues.apache.org/jira/browse/HDFS-6165
> Project: Hadoop HDFS
> Issue Type: Bug
> Components: hdfs-client
> Affects Versions: 2.3.0
> Reporter: Yongjun Zhang
> Assignee: Yongjun Zhang
> Priority: Minor
> Attachments: HDFS-6165.001.patch, HDFS-6165.002.patch,
> HDFS-6165.003.patch, HDFS-6165.004.patch
>
>
> Given a directory owned by user A with WRITE permission containing an empty
> directory owned by user B, it is not possible to delete user B's empty
> directory with either "hdfs dfs -rm -r" or "hdfs dfs -rmdir". Because the
> current implementation requires FULL permission of the empty directory, and
> throws exception.
> On the other hand, on linux, "rm -r" and "rmdir" command can remove empty
> directory as long as the parent directory has WRITE permission (and prefix
> component of the path have EXECUTE permission), For the tested OSes, some
> prompt user asking for confirmation, some don't.
> Here's a reproduction:
> {code}
> [root@vm01 ~]# hdfs dfs -ls /user/
> Found 4 items
> drwxr-xr-x - userabc users 0 2013-05-03 01:55 /user/userabc
> drwxr-xr-x - hdfs supergroup 0 2013-05-03 00:28 /user/hdfs
> drwxrwxrwx - mapred hadoop 0 2013-05-03 00:13 /user/history
> drwxr-xr-x - hdfs supergroup 0 2013-04-14 16:46 /user/hive
> [root@vm01 ~]# hdfs dfs -ls /user/userabc
> Found 8 items
> drwx------ - userabc users 0 2013-05-02 17:00 /user/userabc/.Trash
> drwxr-xr-x - userabc users 0 2013-05-03 01:34 /user/userabc/.cm
> drwx------ - userabc users 0 2013-05-03 01:06
> /user/userabc/.staging
> drwxr-xr-x - userabc users 0 2013-04-14 18:31 /user/userabc/apps
> drwxr-xr-x - userabc users 0 2013-04-30 18:05 /user/userabc/ds
> drwxr-xr-x - hdfs users 0 2013-05-03 01:54 /user/userabc/foo
> drwxr-xr-x - userabc users 0 2013-04-30 16:18
> /user/userabc/maven_source
> drwxr-xr-x - hdfs users 0 2013-05-03 01:40
> /user/userabc/test-restore
> [root@vm01 ~]# hdfs dfs -ls /user/userabc/foo/
> [root@vm01 ~]# sudo -u userabc hdfs dfs -rm -r -skipTrash /user/userabc/foo
> rm: Permission denied: user=userabc, access=ALL,
> inode="/user/userabc/foo":hdfs:users:drwxr-xr-x
> {code}
> The super user can delete the directory.
> {code}
> [root@vm01 ~]# sudo -u hdfs hdfs dfs -rm -r -skipTrash /user/userabc/foo
> Deleted /user/userabc/foo
> {code}
> The same is not true for files, however. They have the correct behavior.
> {code}
> [root@vm01 ~]# sudo -u hdfs hdfs dfs -touchz /user/userabc/foo-file
> [root@vm01 ~]# hdfs dfs -ls /user/userabc/
> Found 8 items
> drwx------ - userabc users 0 2013-05-02 17:00 /user/userabc/.Trash
> drwxr-xr-x - userabc users 0 2013-05-03 01:34 /user/userabc/.cm
> drwx------ - userabc users 0 2013-05-03 01:06
> /user/userabc/.staging
> drwxr-xr-x - userabc users 0 2013-04-14 18:31 /user/userabc/apps
> drwxr-xr-x - userabc users 0 2013-04-30 18:05 /user/userabc/ds
> -rw-r--r-- 1 hdfs users 0 2013-05-03 02:11
> /user/userabc/foo-file
> drwxr-xr-x - userabc users 0 2013-04-30 16:18
> /user/userabc/maven_source
> drwxr-xr-x - hdfs users 0 2013-05-03 01:40
> /user/userabc/test-restore
> [root@vm01 ~]# sudo -u userabc hdfs dfs -rm -skipTrash /user/userabc/foo-file
> Deleted /user/userabc/foo-file
> {code}
> Using "hdfs dfs -rmdir" command:
> {code}
> bash-4.1$ hadoop fs -lsr /
> lsr: DEPRECATED: Please use 'ls -R' instead.
> drwxr-xr-x - hdfs supergroup 0 2014-03-25 16:29 /user
> drwxr-xr-x - hdfs supergroup 0 2014-03-25 16:28 /user/hdfs
> drwxr-xr-x - usrabc users 0 2014-03-28 23:39 /user/usrabc
> drwxr-xr-x - abc abc 0 2014-03-28 23:39
> /user/usrabc/foo-empty1
> [root@vm01 usrabc]# su usrabc
> [usrabc@vm01 ~]$ hdfs dfs -rmdir /user/usrabc/foo-empty1
> rmdir: Permission denied: user=usrabc, access=ALL,
> inode="/user/usrabc/foo-empty1":abc:abc:drwxr-xr-x
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)