diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java index c56a2697a286..3634363ad3b3 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/HiveMetadata.java @@ -276,6 +276,7 @@ import static io.trino.plugin.hive.util.HiveUtil.toPartitionValues; import static io.trino.plugin.hive.util.HiveUtil.verifyPartitionTypeSupported; import static io.trino.plugin.hive.util.HiveWriteUtils.checkTableIsWritable; +import static io.trino.plugin.hive.util.HiveWriteUtils.checkedDelete; import static io.trino.plugin.hive.util.HiveWriteUtils.initializeSerializer; import static io.trino.plugin.hive.util.HiveWriteUtils.isFileCreatedByQuery; import static io.trino.plugin.hive.util.HiveWriteUtils.isS3FileSystem; @@ -1966,7 +1967,7 @@ private void removeNonCurrentQueryFiles(ConnectorSession session, Path partition while (iterator.hasNext()) { Path file = iterator.next().getPath(); if (!isFileCreatedByQuery(file.getName(), queryId)) { - fileSystem.delete(file, false); + checkedDelete(fileSystem, file, false); } } } @@ -2247,7 +2248,10 @@ private void finishOptimize(ConnectorSession session, ConnectorTableExecuteHandl if (firstScannedPath.isEmpty()) { firstScannedPath = Optional.of(scannedPath); } - retry().run("delete " + scannedPath, () -> fs.delete(scannedPath, false)); + retry().run("delete " + scannedPath, () -> { + checkedDelete(fs, scannedPath, false); + return null; + }); someDeleted = true; remainingFilesToDelete.remove(scannedPath); } 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 2367645699bd..25fec3a84504 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 @@ -107,6 +107,7 @@ import static io.trino.plugin.hive.metastore.MetastoreUtil.buildInitialPrivilegeSet; import static io.trino.plugin.hive.metastore.thrift.ThriftMetastoreUtil.NUM_ROWS; import static io.trino.plugin.hive.util.HiveUtil.toPartitionValues; +import static io.trino.plugin.hive.util.HiveWriteUtils.checkedDelete; import static io.trino.plugin.hive.util.HiveWriteUtils.createDirectory; import static io.trino.plugin.hive.util.HiveWriteUtils.isFileCreatedByQuery; import static io.trino.plugin.hive.util.HiveWriteUtils.pathExists; @@ -3660,7 +3661,7 @@ public static void cleanExtraOutputFiles(HdfsEnvironment hdfsEnvironment, HdfsCo while (filesToDeleteIterator.hasNext()) { String fileName = filesToDeleteIterator.next(); log.debug("Deleting failed attempt file %s/%s for query %s", path, fileName, queryId); - fileSystem.delete(new Path(path, fileName), false); + checkedDelete(fileSystem, new Path(path, fileName), false); deletedFilesBuilder.add(fileName); filesToDeleteIterator.remove(); } diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/util/HiveWriteUtils.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/util/HiveWriteUtils.java index d9d8415b0bd1..a55e9f96a29d 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/util/HiveWriteUtils.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/util/HiveWriteUtils.java @@ -83,6 +83,7 @@ import org.apache.hadoop.mapred.Reporter; import org.joda.time.DateTimeZone; +import java.io.FileNotFoundException; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; @@ -605,6 +606,22 @@ public static void createDirectory(HdfsContext context, HdfsEnvironment hdfsEnvi } } + public static void checkedDelete(FileSystem fileSystem, Path file, boolean recursive) + throws IOException + { + try { + if (!fileSystem.delete(file, recursive)) { + if (fileSystem.exists(file)) { + // only throw exception if file still exists + throw new IOException("Failed to delete " + file); + } + } + } + catch (FileNotFoundException ignored) { + // ok + } + } + public static boolean isWritableType(HiveType hiveType) { return isWritableType(hiveType.getTypeInfo());