From 4df96840ea674a160d2fa5af56dda2ecfcd98bd8 Mon Sep 17 00:00:00 2001 From: Jack Ye Date: Mon, 28 Dec 2020 09:37:16 -0800 Subject: [PATCH] Hive: ensure unlock is called when new metadata cannot be deleted --- .../iceberg/hive/HiveTableOperations.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveTableOperations.java b/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveTableOperations.java index 0c99b4dc5fe4..05ca375b3f80 100644 --- a/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveTableOperations.java +++ b/hive-metastore/src/main/java/org/apache/iceberg/hive/HiveTableOperations.java @@ -207,11 +207,7 @@ protected void doCommit(TableMetadata base, TableMetadata metadata) { throw new RuntimeException("Interrupted during commit", e); } finally { - if (threw) { - // if anything went wrong, clean up the uncommitted metadata file - io().deleteFile(newMetadataLocation); - } - unlock(lockId); + cleanupMetadataAndUnlock(threw, newMetadataLocation, lockId); } } @@ -367,6 +363,20 @@ private long acquireLock() throws UnknownHostException, TException, InterruptedE return lockId; } + private void cleanupMetadataAndUnlock(boolean errorThrown, String metadataLocation, Optional lockId) { + try { + if (errorThrown) { + // if anything went wrong, clean up the uncommitted metadata file + io().deleteFile(metadataLocation); + } + } catch (RuntimeException e) { + LOG.error("Fail to cleanup metadata file at {}", metadataLocation, e); + throw e; + } finally { + unlock(lockId); + } + } + private void unlock(Optional lockId) { if (lockId.isPresent()) { try {