[ 
https://issues.apache.org/jira/browse/HDFS-6165?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yongjun Zhang updated HDFS-6165:
--------------------------------

    Description: 
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}


  was:
Given a directory owned by user A with permissions 0700 containing an empty 
directory owned by user B, it is not possible to delete user B's directory. 
This is incorrect. Write permission on the containing directory should be all 
that is needed to delete the child directory. 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}


        Summary: "hdfs dfs -rm -r" and "hdfs -rmdir" commands can't remove 
empty directory   (was: "hdfs dfs -rm -r" is slightly different from the Unix 
"rm -r" for deleting an empty directory)

> "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
>
>
> 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)

Reply via email to