[ 
https://issues.apache.org/jira/browse/HADOOP-17907?focusedWorklogId=650368&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-650368
 ]

ASF GitHub Bot logged work on HADOOP-17907:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 14/Sep/21 06:37
            Start Date: 14/Sep/21 06:37
    Worklog Time Spent: 10m 
      Work Description: FrankinRUC commented on a change in pull request #3431:
URL: https://github.com/apache/hadoop/pull/3431#discussion_r707954677



##########
File path: 
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java
##########
@@ -182,7 +183,7 @@ public static boolean fullyDelete(final File dir, boolean 
tryGrantPermissions) {
       return true;
     }
     // handle nonempty directory deletion
-    if (!fullyDeleteContents(dir, tryGrantPermissions)) {
+    if (!FileUtils.isSymlink(dir) && !fullyDeleteContents(dir, 
tryGrantPermissions)) {

Review comment:
       dir.isDirectory() cannot tell whether dir is a symlink or not. Here is a 
test:
   
   Environment:
   ```
   total 8
   -rw-r--r--  1 foo  bar   328B  9 14 14:28 Main.java
   lrwxr-xr-x  1 foo  bar     8B  9 14 14:18 sym-test-dir -> test-dir
   lrwxr-xr-x  1 foo  bar     9B  9 14 14:18 sym-test-file -> test-file
   drwxr-xr-x  2 foo  bar    64B  9 14 14:18 test-dir
   -rw-r--r--  1 foo  bar     0B  9 14 14:18 test-file
   ```
   Test Code:
   ```java
   import java.io.*;
   import java.util.Arrays;
   
   class Main {
       public static void main(String[] args) {
           for (String path : Arrays.asList(new String[]{"test-dir", 
"test-file", "sym-test-dir", "sym-test-file"})) {
               System.out.println(String.format("%s\t%s", path, new 
File(path).isDirectory()));
           }
       }
   }
   ```
   Test Result:
   ```
   test-dir        true
   test-file       false
   sym-test-dir    true
   sym-test-file   false
   ```
   So I think just add isSymlink checking is ok, since original code can handle 
file or file symlink param.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 650368)
    Time Spent: 0.5h  (was: 20m)

> FileUtil#fullyDelete deletes contents of sym-linked directory when symlink 
> cannot be deleted because of local fs fault
> ----------------------------------------------------------------------------------------------------------------------
>
>                 Key: HADOOP-17907
>                 URL: https://issues.apache.org/jira/browse/HADOOP-17907
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: fs
>            Reporter: Weihao Zheng
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> As discussed in HADOOP-6536, FileUtil#fullyDelete should not delete the 
> contents of the sym-linked directory when we pass a symlink parameter. 
> Currently we try to delete the resource first by calling deleteImpl, and if 
> deleteImpl is failed, we regard it as non-empty directory and remove all its 
> contents and then itself. This logic behaves wrong when local file system 
> cannot delete symlink to a directory because of faulty disk, local system's 
> error, etc. When we cannot delete it in the first time, hadoop will try to 
> remove all the contents of the directory it pointed to and leave an empty dir.
> So, we should add an isSymlink checking before we call fullyDeleteContents to 
> prevent such behavior.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to