Browse Source

HADOOP-17801. No error message reported when bucket doesn't exist in S3AFS (#3202)


Contributed by: Mehakmeet Singh.
Mehakmeet Singh 3 years ago
parent
commit
997d749f8a

+ 4 - 2
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java

@@ -681,7 +681,8 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities,
         trackDurationOfOperation(getDurationTrackerFactory(),
             STORE_EXISTS_PROBE.getSymbol(),
             () -> s3.doesBucketExist(bucket)))) {
-      throw new UnknownStoreException("Bucket " + bucket + " does not exist");
+      throw new UnknownStoreException("s3a://" + bucket + "/", " Bucket does "
+          + "not exist");
     }
   }
 
@@ -699,7 +700,8 @@ public class S3AFileSystem extends FileSystem implements StreamCapabilities,
         trackDurationOfOperation(getDurationTrackerFactory(),
             STORE_EXISTS_PROBE.getSymbol(),
             () -> s3.doesBucketExistV2(bucket)))) {
-      throw new UnknownStoreException("Bucket " + bucket + " does not exist");
+      throw new UnknownStoreException("s3a://" + bucket + "/", " Bucket does "
+          + "not exist");
     }
   }
 

+ 1 - 1
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AUtils.java

@@ -254,7 +254,7 @@ public final class S3AUtils {
       case 404:
         if (isUnknownBucket(ase)) {
           // this is a missing bucket
-          ioe = new UnknownStoreException(path, ase);
+          ioe = new UnknownStoreException(path, message, ase);
         } else {
           // a normal unknown object
           ioe = new FileNotFoundException(message);

+ 14 - 10
hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/UnknownStoreException.java

@@ -18,10 +18,9 @@
 
 package org.apache.hadoop.fs.s3a;
 
-import java.io.IOException;
-
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.fs.PathIOException;
 
 /**
  * The bucket or other AWS resource is unknown.
@@ -33,23 +32,28 @@ import org.apache.hadoop.classification.InterfaceStability;
  */
 @InterfaceAudience.Public
 @InterfaceStability.Evolving
-public class UnknownStoreException extends IOException {
+public class UnknownStoreException extends PathIOException {
 
   /**
    * Constructor.
-   * @param message message
+   *
+   * @param path    path trying to access.
+   * @param message message.
    */
-  public UnknownStoreException(final String message) {
-    this(message, null);
+  public UnknownStoreException(final String path, final String message) {
+    this(path, message, null);
   }
 
   /**
    * Constructor.
-   * @param message message
-   * @param cause cause (may be null)
+   *
+   * @param path    path trying to access.
+   * @param message message.
+   * @param cause   cause (may be null).
    */
-  public UnknownStoreException(final String message, Throwable cause) {
-    super(message);
+  public UnknownStoreException(String path, final String message,
+      Throwable cause) {
+    super(path, message);
     if (cause != null) {
       initCause(cause);
     }

+ 6 - 2
hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/TestS3AExceptionTranslation.java

@@ -181,8 +181,12 @@ public class TestS3AExceptionTranslation {
 
   private static <E extends Throwable> E verifyTranslated(Class<E> clazz,
       AmazonClientException exception) throws Exception {
-    return verifyExceptionClass(clazz,
-        translateException("test", "/", exception));
+    // Verifying that the translated exception have the correct error message.
+    IOException ioe = translateException("test", "/", exception);
+    assertExceptionContains(exception.getMessage(), ioe,
+        "Translated Exception should contain the error message of the "
+            + "actual exception");
+    return verifyExceptionClass(clazz, ioe);
   }
 
   private void assertContainsInterrupted(boolean expected, Throwable thrown)