>From Hussain Towaileb <hussai...@gmail.com>:

Hussain Towaileb has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19562 )


Change subject: [NO ISSUE][EXT]: Fail early in COPY TO if no write permissin
......................................................................

[NO ISSUE][EXT]: Fail early in COPY TO if no write permissin

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- fail early if no write permission.
- correctly check for bucket not found exception.

Ext-ref: MB-66031
Change-Id: I954a60004f104aea4787075a94a069daca305fde
---
M 
asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/AbstractCloudExternalFileWriterFactory.java
M 
asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/GCSExternalFileWriterFactory.java
M 
asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/CompilationException.java
M 
hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
M 
asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/S3ExternalFileWriterFactory.java
5 files changed, 69 insertions(+), 44 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/62/19562/1

diff --git 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/AbstractCloudExternalFileWriterFactory.java
 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/AbstractCloudExternalFileWriterFactory.java
index 198b3ad..6132a4b 100644
--- 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/AbstractCloudExternalFileWriterFactory.java
+++ 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/AbstractCloudExternalFileWriterFactory.java
@@ -39,7 +39,6 @@
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.SourceLocation;
-import org.apache.hyracks.api.util.ExceptionUtils;
 import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -63,9 +62,7 @@

     abstract ICloudClient createCloudClient(IApplicationContext appCtx) throws 
CompilationException;

-    abstract boolean isNoContainerFoundException(IOException e);
-
-    abstract boolean isSdkException(Throwable e);
+    abstract Throwable getCloudSpecificException(Throwable ex);

     final void buildClient(IApplicationContext appCtx) throws 
HyracksDataException {
         try {
@@ -91,18 +88,16 @@

         try {
             doValidate(testClient, bucket);
-        } catch (IOException e) {
-            if (isNoContainerFoundException(e)) {
-                throw 
CompilationException.create(ErrorCode.EXTERNAL_SOURCE_CONTAINER_NOT_FOUND, 
bucket);
-            } else {
-                throw 
CompilationException.create(ErrorCode.EXTERNAL_SINK_ERROR,
-                        ExceptionUtils.getMessageOrToString(e));
-            }
         } catch (Throwable e) {
-            if (isSdkException(e)) {
-                throw 
CompilationException.create(ErrorCode.EXTERNAL_SINK_ERROR, e, 
getMessageOrToString(e));
+            Throwable cloudException = getCloudSpecificException(e);
+            if (cloudException != null) {
+                throw 
CompilationException.create(ErrorCode.EXTERNAL_SINK_ERROR, cloudException,
+                        getMessageOrToString(cloudException));
             }
-            throw e;
+            if (e instanceof AlgebricksException algebricksException) {
+                throw algebricksException;
+            }
+            throw CompilationException.create(ErrorCode.EXTERNAL_SINK_ERROR, 
e, getMessageOrToString(e));
         }
     }

@@ -145,6 +140,7 @@
         } catch (HyracksDataException e) {
             writer.abort();
             aborted = true;
+            throw e;
         } finally {
             if (writer != null && !aborted) {
                 writer.finish();
diff --git 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/GCSExternalFileWriterFactory.java
 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/GCSExternalFileWriterFactory.java
index 3a34365..501f901 100644
--- 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/GCSExternalFileWriterFactory.java
+++ 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/GCSExternalFileWriterFactory.java
@@ -18,8 +18,6 @@
  */
 package org.apache.asterix.cloud.writer;

-import java.io.IOException;
-
 import org.apache.asterix.cloud.clients.ICloudClient;
 import org.apache.asterix.cloud.clients.ICloudGuardian;
 import org.apache.asterix.cloud.clients.google.gcs.GCSClientConfig;
@@ -39,9 +37,9 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.IWarningCollector;
+import org.apache.hyracks.api.util.ExceptionUtils;

 import com.google.cloud.BaseServiceException;
-import com.google.cloud.storage.StorageException;

 public final class GCSExternalFileWriterFactory extends 
AbstractCloudExternalFileWriterFactory {
     private static final long serialVersionUID = 1L;
@@ -71,13 +69,8 @@
     }

     @Override
-    boolean isNoContainerFoundException(IOException e) {
-        return e.getCause() instanceof StorageException;
-    }
-
-    @Override
-    boolean isSdkException(Throwable e) {
-        return e instanceof BaseServiceException;
+    Throwable getCloudSpecificException(Throwable ex) {
+        return ExceptionUtils.getCauseOfType(ex, BaseServiceException.class);
     }

     @Override
diff --git 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/S3ExternalFileWriterFactory.java
 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/S3ExternalFileWriterFactory.java
index 6e5333f..9b6fede 100644
--- 
a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/S3ExternalFileWriterFactory.java
+++ 
b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/writer/S3ExternalFileWriterFactory.java
@@ -18,8 +18,6 @@
  */
 package org.apache.asterix.cloud.writer;

-import java.io.IOException;
-
 import org.apache.asterix.cloud.clients.ICloudClient;
 import org.apache.asterix.cloud.clients.ICloudGuardian;
 import org.apache.asterix.cloud.clients.aws.s3.S3ClientConfig;
@@ -39,9 +37,9 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.IWarningCollector;
+import org.apache.hyracks.api.util.ExceptionUtils;

 import software.amazon.awssdk.core.exception.SdkException;
-import software.amazon.awssdk.services.s3.model.NoSuchBucketException;

 public final class S3ExternalFileWriterFactory extends 
AbstractCloudExternalFileWriterFactory {
     private static final long serialVersionUID = 4551318140901866805L;
@@ -71,13 +69,8 @@
     }

     @Override
-    boolean isNoContainerFoundException(IOException e) {
-        return e.getCause() instanceof NoSuchBucketException;
-    }
-
-    @Override
-    boolean isSdkException(Throwable e) {
-        return e instanceof SdkException;
+    Throwable getCloudSpecificException(Throwable ex) {
+        return ExceptionUtils.getCauseOfType(ex, SdkException.class);
     }

     @Override
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/CompilationException.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/CompilationException.java
index 75fb18d..ed29eb5 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/CompilationException.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/CompilationException.java
@@ -27,20 +27,21 @@
 public class CompilationException extends AlgebricksException {
     private static final long serialVersionUID = 1L;

-    public static CompilationException create(ErrorCode error, SourceLocation 
sourceLoc, Serializable... params) {
-        return new CompilationException(error, sourceLoc, params);
-    }
-
     public static CompilationException create(ErrorCode error, Serializable... 
params) {
-        return create(error, null, params);
+        return create(error, null, null, params);
     }

-    public CompilationException(ErrorCode error, Throwable cause, 
SourceLocation sourceLoc, Serializable... params) {
-        super(error, cause, sourceLoc, params);
+    public static CompilationException create(ErrorCode error, Throwable th, 
Serializable... params) {
+        return create(error, th, null, params);
     }

-    public CompilationException(ErrorCode error, SourceLocation sourceLoc, 
Serializable... params) {
-        this(error, null, sourceLoc, params);
+    public static CompilationException create(ErrorCode error, SourceLocation 
sourceLoc, Serializable... params) {
+        return create(error, null, sourceLoc, params);
+    }
+
+    public static CompilationException create(ErrorCode error, Throwable th, 
SourceLocation sourceLoc,
+            Serializable... params) {
+        return new CompilationException(error, th, sourceLoc, params);
     }

     public CompilationException(ErrorCode error, Serializable... params) {
@@ -51,6 +52,14 @@
         this(errorCode, cause, null, params);
     }

+    public CompilationException(ErrorCode error, SourceLocation sourceLoc, 
Serializable... params) {
+        this(error, null, sourceLoc, params);
+    }
+
+    public CompilationException(ErrorCode error, Throwable cause, 
SourceLocation sourceLoc, Serializable... params) {
+        super(error, cause, sourceLoc, params);
+    }
+
     /**
      * @deprecated (Don't use this and provide an error code. This exists for 
the current exceptions and
      *             those exceptions need to adopt error code as well.)
@@ -81,4 +90,4 @@
         super(message, cause);
     }

-}
+}
\ No newline at end of file
diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
index ddba3f0..27c0fad 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
@@ -222,4 +222,20 @@
     public static boolean isErrorCode(HyracksDataException throwable, 
ErrorCode code) {
         return throwable.getError().isPresent() && throwable.getError().get() 
== code;
     }
+
+    public static <T extends Throwable> T getCauseOfType(Throwable throwable, 
Class<T> targetType) {
+        if (throwable == null || targetType == null) {
+            return null;
+        }
+
+        Throwable cause = throwable;
+        while (cause != null) {
+            if (targetType.isInstance(cause)) {
+                return targetType.cast(cause);
+            }
+            cause = cause.getCause();
+        }
+
+        return null;
+    }
 }

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19562
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: ionic
Gerrit-Change-Id: I954a60004f104aea4787075a94a069daca305fde
Gerrit-Change-Number: 19562
Gerrit-PatchSet: 1
Gerrit-Owner: Hussain Towaileb <hussai...@gmail.com>
Gerrit-MessageType: newchange

Reply via email to