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

pvary pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new 1da80552c0 Hive: Unwrap RuntimeException for Hive TException with 
alter table (#9432)
1da80552c0 is described below

commit 1da80552c06e749f2b6103f0ab0a184bb77a841c
Author: Naveen Kumar <[email protected]>
AuthorDate: Wed Jan 17 15:44:21 2024 +0530

    Hive: Unwrap RuntimeException for Hive TException with alter table (#9432)
---
 .../java/org/apache/iceberg/hive/HiveCatalog.java  | 11 +++--
 .../org/apache/iceberg/hive/MetastoreUtil.java     | 17 +++++--
 .../org/apache/iceberg/hive/TestHiveCatalog.java   | 53 ----------------------
 3 files changed, 22 insertions(+), 59 deletions(-)

diff --git 
a/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java 
b/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java
index 516483e49a..63e4aad5d8 100644
--- a/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java
+++ b/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveCatalog.java
@@ -251,9 +251,14 @@ public class HiveCatalog extends BaseMetastoreCatalog 
implements SupportsNamespa
     } catch (NoSuchObjectException e) {
       throw new NoSuchTableException("Table does not exist: %s", from);
 
-    } catch (AlreadyExistsException e) {
-      throw new org.apache.iceberg.exceptions.AlreadyExistsException(
-          "Table already exists: %s", to);
+    } catch (InvalidOperationException e) {
+      if (e.getMessage() != null
+          && e.getMessage().contains(String.format("new table %s already 
exists", to))) {
+        throw new org.apache.iceberg.exceptions.AlreadyExistsException(
+            "Table already exists: %s", to);
+      } else {
+        throw new RuntimeException("Failed to rename " + from + " to " + to, 
e);
+      }
 
     } catch (TException e) {
       throw new RuntimeException("Failed to rename " + from + " to " + to, e);
diff --git 
a/hive-metastore/src/main/java/org/apache/iceberg/hive/MetastoreUtil.java 
b/hive-metastore/src/main/java/org/apache/iceberg/hive/MetastoreUtil.java
index 83ff2b60d0..ef1dffb6ec 100644
--- a/hive-metastore/src/main/java/org/apache/iceberg/hive/MetastoreUtil.java
+++ b/hive-metastore/src/main/java/org/apache/iceberg/hive/MetastoreUtil.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.hive.metastore.api.Table;
 import org.apache.iceberg.common.DynMethods;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
 import org.apache.iceberg.relocated.com.google.common.collect.Maps;
+import org.apache.thrift.TException;
 
 public class MetastoreUtil {
   private static final DynMethods.UnboundMethod ALTER_TABLE =
@@ -54,7 +55,7 @@ public class MetastoreUtil {
    * context will be set in a way that turns off stats updates to avoid 
recursive file listing.
    */
   public static void alterTable(
-      IMetaStoreClient client, String databaseName, String tblName, Table 
table) {
+      IMetaStoreClient client, String databaseName, String tblName, Table 
table) throws TException {
     alterTable(client, databaseName, tblName, table, ImmutableMap.of());
   }
 
@@ -67,11 +68,21 @@ public class MetastoreUtil {
       String databaseName,
       String tblName,
       Table table,
-      Map<String, String> extraEnv) {
+      Map<String, String> extraEnv)
+      throws TException {
     Map<String, String> env = Maps.newHashMapWithExpectedSize(extraEnv.size() 
+ 1);
     env.putAll(extraEnv);
     env.put(StatsSetupConst.DO_NOT_UPDATE_STATS, StatsSetupConst.TRUE);
 
-    ALTER_TABLE.invoke(client, databaseName, tblName, table, new 
EnvironmentContext(env));
+    try {
+      ALTER_TABLE.invoke(client, databaseName, tblName, table, new 
EnvironmentContext(env));
+    } catch (RuntimeException e) {
+      // TException would be wrapped into RuntimeException during reflection
+      if (e.getCause() instanceof TException) {
+        throw (TException) e.getCause();
+      } else {
+        throw e;
+      }
+    }
   }
 }
diff --git 
a/hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java 
b/hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java
index 904e74939e..369ad46c8e 100644
--- a/hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java
+++ b/hive-metastore/src/test/java/org/apache/iceberg/hive/TestHiveCatalog.java
@@ -52,7 +52,6 @@ import org.apache.iceberg.CatalogUtil;
 import org.apache.iceberg.DataFile;
 import org.apache.iceberg.DataFiles;
 import org.apache.iceberg.FileFormat;
-import org.apache.iceberg.HasTableOperations;
 import org.apache.iceberg.PartitionSpec;
 import org.apache.iceberg.PartitionSpecParser;
 import org.apache.iceberg.Schema;
@@ -82,7 +81,6 @@ import org.apache.iceberg.transforms.Transforms;
 import org.apache.iceberg.types.Types;
 import org.apache.iceberg.util.JsonUtil;
 import org.apache.thrift.TException;
-import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -1181,55 +1179,4 @@ public class TestHiveCatalog extends 
CatalogTests<HiveCatalog> {
 
     assertThat(database.getLocationUri()).isEqualTo("s3://bucket/database.db");
   }
-
-  // TODO: This test should be removed after fix of 
https://github.com/apache/iceberg/issues/9289.
-  @Test
-  @Override
-  public void testRenameTableDestinationTableAlreadyExists() {
-    Namespace ns = Namespace.of("newdb");
-    TableIdentifier renamedTable = TableIdentifier.of(ns, "table_renamed");
-
-    if (requiresNamespaceCreate()) {
-      catalog.createNamespace(ns);
-    }
-
-    Assertions.assertThat(catalog.tableExists(TABLE))
-        .as("Source table should not exist before create")
-        .isFalse();
-
-    catalog.buildTable(TABLE, SCHEMA).create();
-    Assertions.assertThat(catalog.tableExists(TABLE))
-        .as("Source table should exist after create")
-        .isTrue();
-
-    Assertions.assertThat(catalog.tableExists(renamedTable))
-        .as("Destination table should not exist before create")
-        .isFalse();
-
-    catalog.buildTable(renamedTable, SCHEMA).create();
-    Assertions.assertThat(catalog.tableExists(renamedTable))
-        .as("Destination table should exist after create")
-        .isTrue();
-
-    // With fix of issues#9289,it should match with CatalogTests and expect
-    // AlreadyExistsException.class
-    // and message should contain as "Table already exists"
-    Assertions.assertThatThrownBy(() -> catalog.renameTable(TABLE, 
renamedTable))
-        .isInstanceOf(RuntimeException.class)
-        .hasMessageContaining("new table newdb.table_renamed already exists");
-    Assertions.assertThat(catalog.tableExists(TABLE))
-        .as("Source table should still exist after failed rename")
-        .isTrue();
-    Assertions.assertThat(catalog.tableExists(renamedTable))
-        .as("Destination table should still exist after failed rename")
-        .isTrue();
-
-    String sourceTableUUID =
-        ((HasTableOperations) 
catalog.loadTable(TABLE)).operations().current().uuid();
-    String destinationTableUUID =
-        ((HasTableOperations) 
catalog.loadTable(renamedTable)).operations().current().uuid();
-    Assertions.assertThat(sourceTableUUID)
-        .as("Source and destination table should remain distinct after failed 
rename")
-        .isNotEqualTo(destinationTableUUID);
-  }
 }

Reply via email to