jojochuang commented on a change in pull request #1223: HADOOP-16112. Delete 
the baseTrashPath's subDir leads to don't modify baseTrashPath
URL: https://github.com/apache/hadoop/pull/1223#discussion_r311850143
 
 

 ##########
 File path: 
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/TrashPolicyDefault.java
 ##########
 @@ -157,14 +163,37 @@ public boolean moveToTrash(Path path) throws IOException 
{
       } catch (FileAlreadyExistsException e) {
         // find the path which is not a directory, and modify baseTrashPath
         // & trashPath, then mkdirs
+        if (moveToTrashForTests) {
+          try {
+            Thread.sleep(5000);
+          } catch (InterruptedException e1) {
+          }
+        }
         Path existsFilePath = baseTrashPath;
         while (!fs.exists(existsFilePath)) {
           existsFilePath = existsFilePath.getParent();
         }
-        baseTrashPath = new Path(baseTrashPath.toString().replace(
-            existsFilePath.toString(), existsFilePath.toString() + Time.now())
-        );
-        trashPath = new Path(baseTrashPath, trashPath.getName());
+
+        // race condition: don't modify baseTrashPath when existsFilePath is 
deleted.
+        // existsFilePath is /user/test/.Trash/Current/user/test/a/b
+        // another thread delete /user/test/.Trash/Current/user/test/a in this 
corner case before the code as follow:
+        // baseTrashPath = new Path(baseTrashPath.toString().replace(
+        //                  existsFilePath.toString(), 
existsFilePath.toString() + Time.now()));
+        // trashPath = new Path(baseTrashPath, trashPath.getName());
+        // baseTrashPath is /user/test/.Trash/Current/user/test+timestamp
+        // trashPath is /user/test/.Trash/Current/user/test+timestamp/a/b. It 
is not expected result.
+        try {
+          FileStatus fileStatus = fs.getFileStatus(existsFilePath);
+          if (fileStatus.isFile()) {
+            baseTrashPath = new Path(baseTrashPath.toString().replace(
+                    existsFilePath.toString(), existsFilePath.toString() + 
Time.now())
+            );
+            trashPath = new Path(baseTrashPath, trashPath.getName());
+          }
+        } catch (FileNotFoundException e1) {
+          LOG.warn("The existFilePath is not found " + existsFilePath);
 
 Review comment:
   "File " + existsFilePath + " was not found"

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-issues-h...@hadoop.apache.org

Reply via email to