You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by bl...@apache.org on 2022/09/03 19:09:50 UTC

[iceberg] 09/09: Core: Add CommitStateUnknownException handling to REST (#5694)

This is an automated email from the ASF dual-hosted git repository.

blue pushed a commit to branch 0.14.x
in repository https://gitbox.apache.org/repos/asf/iceberg.git

commit 3c9600f899cdd57ffcc78f46bac59c51b11af7a4
Author: Ryan Blue <bl...@apache.org>
AuthorDate: Fri Sep 2 12:50:39 2022 -0700

    Core: Add CommitStateUnknownException handling to REST (#5694)
---
 .../apache/iceberg/exceptions/ServiceFailureException.java | 10 ++++------
 ...lureException.java => ServiceUnavailableException.java} | 14 ++++++--------
 .../main/java/org/apache/iceberg/rest/ErrorHandlers.java   | 12 ++++++++++--
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java b/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java
index 9049d725ef..b8ef3b411a 100644
--- a/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java
+++ b/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java
@@ -21,17 +21,15 @@ package org.apache.iceberg.exceptions;
 
 import com.google.errorprone.annotations.FormatMethod;
 
-/**
- * Exception thrown on HTTP 5XX Server Error.
- */
-public class ServiceFailureException extends RuntimeException {
+/** Exception thrown on HTTP 5XX Server Error. */
+public class ServiceFailureException extends RESTException {
   @FormatMethod
   public ServiceFailureException(String message, Object... args) {
-    super(String.format(message, args));
+    super(message, args);
   }
 
   @FormatMethod
   public ServiceFailureException(Throwable cause, String message, Object... args) {
-    super(String.format(message, args), cause);
+    super(cause, message, args);
   }
 }
diff --git a/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java b/api/src/main/java/org/apache/iceberg/exceptions/ServiceUnavailableException.java
similarity index 72%
copy from api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java
copy to api/src/main/java/org/apache/iceberg/exceptions/ServiceUnavailableException.java
index 9049d725ef..74877214ac 100644
--- a/api/src/main/java/org/apache/iceberg/exceptions/ServiceFailureException.java
+++ b/api/src/main/java/org/apache/iceberg/exceptions/ServiceUnavailableException.java
@@ -21,17 +21,15 @@ package org.apache.iceberg.exceptions;
 
 import com.google.errorprone.annotations.FormatMethod;
 
-/**
- * Exception thrown on HTTP 5XX Server Error.
- */
-public class ServiceFailureException extends RuntimeException {
+/** Exception thrown on HTTP 503: service is unavailable */
+public class ServiceUnavailableException extends RESTException {
   @FormatMethod
-  public ServiceFailureException(String message, Object... args) {
-    super(String.format(message, args));
+  public ServiceUnavailableException(String message, Object... args) {
+    super(message, args);
   }
 
   @FormatMethod
-  public ServiceFailureException(Throwable cause, String message, Object... args) {
-    super(String.format(message, args), cause);
+  public ServiceUnavailableException(Throwable cause, String message, Object... args) {
+    super(cause, message, args);
   }
 }
diff --git a/core/src/main/java/org/apache/iceberg/rest/ErrorHandlers.java b/core/src/main/java/org/apache/iceberg/rest/ErrorHandlers.java
index d72ee460aa..33cce5dd96 100644
--- a/core/src/main/java/org/apache/iceberg/rest/ErrorHandlers.java
+++ b/core/src/main/java/org/apache/iceberg/rest/ErrorHandlers.java
@@ -23,12 +23,14 @@ import java.util.function.Consumer;
 import org.apache.iceberg.exceptions.AlreadyExistsException;
 import org.apache.iceberg.exceptions.BadRequestException;
 import org.apache.iceberg.exceptions.CommitFailedException;
+import org.apache.iceberg.exceptions.CommitStateUnknownException;
 import org.apache.iceberg.exceptions.ForbiddenException;
 import org.apache.iceberg.exceptions.NoSuchNamespaceException;
 import org.apache.iceberg.exceptions.NoSuchTableException;
 import org.apache.iceberg.exceptions.NotAuthorizedException;
 import org.apache.iceberg.exceptions.RESTException;
 import org.apache.iceberg.exceptions.ServiceFailureException;
+import org.apache.iceberg.exceptions.ServiceUnavailableException;
 import org.apache.iceberg.rest.responses.ErrorResponse;
 
 /**
@@ -59,6 +61,10 @@ public class ErrorHandlers {
           throw new NoSuchTableException("%s", error.message());
         case 409:
           throw new CommitFailedException("Commit failed: %s", error.message());
+        case 500:
+        case 504:
+          throw new CommitStateUnknownException(
+              new ServiceFailureException("Service failed: %s: %s", error.code(), error.message()));
       }
     };
   }
@@ -115,10 +121,12 @@ public class ErrorHandlers {
         case 405:
         case 406:
           break;
-        case 501:
-          throw new UnsupportedOperationException(error.message());
         case 500:
           throw new ServiceFailureException("Server error: %s: %s", error.type(), error.message());
+        case 501:
+          throw new UnsupportedOperationException(error.message());
+        case 503:
+          throw new ServiceUnavailableException("Service unavailable: %s", error.message());
       }
 
       throw new RESTException("Unable to process: %s", error.message());