Browse Source

HADOOP-13406 S3AFileSystem: Consider reusing filestatus in delete() and mkdirs(). Contributed by Rajesh Balamohan

Steve Loughran 8 years ago
parent
commit
5f9bffbb66

+ 15 - 17
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java

@@ -749,7 +749,7 @@ public class S3AFileSystem extends FileSystem {
       } else {
         copyFile(srcKey, dstKey, srcStatus.getLen());
       }
-      delete(src, false);
+      innerDelete(srcStatus, false);
     } else {
       LOG.debug("rename: renaming directory {} to {}", src, dst);
 
@@ -1075,16 +1075,20 @@ public class S3AFileSystem extends FileSystem {
    */
   public boolean delete(Path f, boolean recursive) throws IOException {
     try {
-      return innerDelete(f, recursive);
+      return innerDelete(getFileStatus(f), recursive);
+    } catch (FileNotFoundException e) {
+      LOG.debug("Couldn't delete {} - does not exist", f);
+      instrumentation.errorIgnored();
+      return false;
     } catch (AmazonClientException e) {
       throw translateException("delete", f, e);
     }
   }
 
   /**
-   * Delete a path. See {@link #delete(Path, boolean)}.
+   * Delete an object. See {@link #delete(Path, boolean)}.
    *
-   * @param f the path to delete.
+   * @param status fileStatus object
    * @param recursive if path is a directory and set to
    * true, the directory is deleted else throws an exception. In
    * case of a file the recursive can be set to either true or false.
@@ -1092,17 +1096,10 @@ public class S3AFileSystem extends FileSystem {
    * @throws IOException due to inability to delete a directory or file.
    * @throws AmazonClientException on failures inside the AWS SDK
    */
-  private boolean innerDelete(Path f, boolean recursive) throws IOException,
-      AmazonClientException {
+  private boolean innerDelete(S3AFileStatus status, boolean recursive)
+      throws IOException, AmazonClientException {
+    Path f = status.getPath();
     LOG.debug("Delete path {} - recursive {}", f , recursive);
-    S3AFileStatus status;
-    try {
-      status = getFileStatus(f);
-    } catch (FileNotFoundException e) {
-      LOG.debug("Couldn't delete {} - does not exist", f);
-      instrumentation.errorIgnored();
-      return false;
-    }
 
     String key = pathToKey(f);
 
@@ -1328,8 +1325,9 @@ public class S3AFileSystem extends FileSystem {
       throws IOException, FileAlreadyExistsException, AmazonClientException {
     LOG.debug("Making directory: {}", f);
     incrementStatistic(INVOCATION_MKDIRS);
+    FileStatus fileStatus;
     try {
-      FileStatus fileStatus = getFileStatus(f);
+      fileStatus = getFileStatus(f);
 
       if (fileStatus.isDirectory()) {
         return true;
@@ -1337,10 +1335,10 @@ public class S3AFileSystem extends FileSystem {
         throw new FileAlreadyExistsException("Path is a file: " + f);
       }
     } catch (FileNotFoundException e) {
-      Path fPart = f;
+      Path fPart = f.getParent();
       do {
         try {
-          FileStatus fileStatus = getFileStatus(fPart);
+          fileStatus = getFileStatus(fPart);
           if (fileStatus.isDirectory()) {
             break;
           }