Skip to content

Commit

Permalink
Hive: Unwrap RuntimeException for Hive InvalidOperationException with…
Browse files Browse the repository at this point in the history
… rename table.
  • Loading branch information
nk1506 committed Jan 9, 2024
1 parent 2101ac2 commit f031872
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -251,9 +251,15 @@ public void renameTable(TableIdentifier from, TableIdentifier originalTo) {
} 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 (RuntimeException e) {
if (e.getCause() instanceof InvalidOperationException
&& 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 e;
}

} catch (TException e) {
throw new RuntimeException("Failed to rename " + from + " to " + to, e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.apache.hadoop.hive.common.StatsSetupConst;
import org.apache.hadoop.hive.metastore.IMetaStoreClient;
import org.apache.hadoop.hive.metastore.api.EnvironmentContext;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.iceberg.common.DynMethods;
import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
Expand Down Expand Up @@ -54,7 +55,8 @@ private 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 MetaException {
alterTable(client, databaseName, tblName, table, ImmutableMap.of());
}

Expand All @@ -67,11 +69,21 @@ public static void alterTable(
String databaseName,
String tblName,
Table table,
Map<String, String> extraEnv) {
Map<String, String> extraEnv)
throws MetaException {
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) {
// MetaException would be wrapped into RuntimeException during reflection
if (e.getCause() instanceof MetaException) {
throw (MetaException) e.getCause();
} else {
throw e;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@
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;
Expand Down Expand Up @@ -82,7 +81,6 @@
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;
Expand Down Expand Up @@ -1181,55 +1179,4 @@ public void testDatabaseLocationWithSlashInWarehouseDir() {

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);
}
}

0 comments on commit f031872

Please sign in to comment.