diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetastoreClosure.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetastoreClosure.java index cae8aaa17d76..848ee3da08fa 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetastoreClosure.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetastoreClosure.java @@ -312,6 +312,11 @@ public void commitTransaction(HiveIdentity identity, long transactionId) delegate.commitTransaction(identity, transactionId); } + public void abortTransaction(HiveIdentity identity, long transactionId) + { + delegate.abortTransaction(identity, transactionId); + } + public void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { delegate.sendTransactionHeartbeat(identity, transactionId); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HiveMetastore.java index 6a57dc39f887..4b87b0ca0ddb 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/HiveMetastore.java @@ -155,6 +155,11 @@ default void commitTransaction(HiveIdentity identity, long transactionId) throw new UnsupportedOperationException(); } + default void abortTransaction(HiveIdentity identity, long transactionId) + { + throw new UnsupportedOperationException(); + } + default void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { throw new UnsupportedOperationException(); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/SemiTransactionalHiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/SemiTransactionalHiveMetastore.java index 637493a32a2a..dabe1b5e69d5 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/SemiTransactionalHiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/SemiTransactionalHiveMetastore.java @@ -1375,15 +1375,37 @@ public synchronized void cleanupQuery(ConnectorSession session) return; } - commit(); + try { + commit(); + } + catch (Throwable commitFailure) { + try { + postCommitCleanup(identity, transaction, false); + } + catch (Throwable cleanupFailure) { + if (cleanupFailure != commitFailure) { + commitFailure.addSuppressed(cleanupFailure); + } + } + throw commitFailure; + } + postCommitCleanup(identity, transaction, true); + } + private void postCommitCleanup(HiveIdentity identity, Optional transaction, boolean commit) + { clearCurrentTransaction(); long transactionId = transaction.get().getTransactionId(); ScheduledFuture heartbeatTask = transaction.get().getHeartbeatTask(); heartbeatTask.cancel(true); - // Any failure around aborted transactions, etc would be handled by Hive Metastore commit and TrinoException will be thrown - delegate.commitTransaction(identity, transactionId); + if (commit) { + // Any failure around aborted transactions, etc would be handled by Hive Metastore commit and TrinoException will be thrown + delegate.commitTransaction(identity, transactionId); + } + else { + delegate.abortTransaction(identity, transactionId); + } } @GuardedBy("this") diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/cache/CachingHiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/cache/CachingHiveMetastore.java index 6774eae6690c..93df55f3e1ed 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/cache/CachingHiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/cache/CachingHiveMetastore.java @@ -946,6 +946,12 @@ public void commitTransaction(HiveIdentity identity, long transactionId) delegate.commitTransaction(identity, transactionId); } + @Override + public void abortTransaction(HiveIdentity identity, long transactionId) + { + delegate.abortTransaction(identity, transactionId); + } + @Override public void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/BridgingHiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/BridgingHiveMetastore.java index 79752d51aec8..fdfac74ca172 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/BridgingHiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/BridgingHiveMetastore.java @@ -490,6 +490,12 @@ public void commitTransaction(HiveIdentity identity, long transactionId) delegate.commitTransaction(identity, transactionId); } + @Override + public void abortTransaction(HiveIdentity identity, long transactionId) + { + delegate.abortTransaction(identity, transactionId); + } + @Override public void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftHiveMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftHiveMetastore.java index 4aeccf49e079..bb5de5ba5cf7 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftHiveMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftHiveMetastore.java @@ -1615,6 +1615,27 @@ public void commitTransaction(HiveIdentity identity, long transactionId) } } + @Override + public void abortTransaction(HiveIdentity identity, long transactionId) + { + try { + retry() + .stopOnIllegalExceptions() + .run("abortTransaction", stats.getAbortTransaction().wrap(() -> { + try (ThriftMetastoreClient metastoreClient = createMetastoreClient(identity)) { + metastoreClient.abortTransaction(transactionId); + } + return null; + })); + } + catch (TException e) { + throw new TrinoException(HIVE_METASTORE_ERROR, e); + } + catch (Exception e) { + throw propagate(e); + } + } + @Override public void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastore.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastore.java index 2b8a615684af..f3177a53d6ff 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastore.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastore.java @@ -144,6 +144,11 @@ default void commitTransaction(HiveIdentity identity, long transactionId) throw new UnsupportedOperationException(); } + default void abortTransaction(HiveIdentity identity, long transactionId) + { + throw new UnsupportedOperationException(); + } + default void sendTransactionHeartbeat(HiveIdentity identity, long transactionId) { throw new UnsupportedOperationException(); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastoreStats.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastoreStats.java index e7b5c596c9f8..f0a11175b016 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastoreStats.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/metastore/thrift/ThriftMetastoreStats.java @@ -56,7 +56,7 @@ public class ThriftMetastoreStats private final ThriftMetastoreApiStats dropRole = new ThriftMetastoreApiStats(); private final ThriftMetastoreApiStats openTransaction = new ThriftMetastoreApiStats(); private final ThriftMetastoreApiStats commitTransaction = new ThriftMetastoreApiStats(); - private final ThriftMetastoreApiStats rollbackTransaction = new ThriftMetastoreApiStats(); + private final ThriftMetastoreApiStats abortTransaction = new ThriftMetastoreApiStats(); private final ThriftMetastoreApiStats acquireLock = new ThriftMetastoreApiStats(); private final ThriftMetastoreApiStats checkLock = new ThriftMetastoreApiStats(); private final ThriftMetastoreApiStats unlock = new ThriftMetastoreApiStats(); @@ -335,9 +335,9 @@ public ThriftMetastoreApiStats getCommitTransaction() @Managed @Nested - public ThriftMetastoreApiStats getRollbackTransaction() + public ThriftMetastoreApiStats getAbortTransaction() { - return rollbackTransaction; + return abortTransaction; } @Managed