diff --git a/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java b/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java index fd2f20a..57a4626 100644 --- a/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java +++ b/common/src/java/org/apache/hive/common/util/ShutdownHookManager.java @@ -18,6 +18,7 @@ package org.apache.hive.common.util; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -44,15 +45,18 @@ private static final ShutdownHookManager MGR = new ShutdownHookManager(); + private static final DeleteOnExitHook DELETE_ON_EXIT_HOOK = new DeleteOnExitHook(); + private static final Log LOG = LogFactory.getLog(ShutdownHookManager.class); static { + MGR.addShutdownHookInternal(DELETE_ON_EXIT_HOOK, 0); Runtime.getRuntime().addShutdownHook( new Thread() { @Override public void run() { MGR.shutdownInProgress.set(true); - for (Runnable hook: MGR.getShutdownHooksInOrder()) { + for (Runnable hook : MGR.getShutdownHooksInOrderInternal()) { try { hook.run(); } catch (Throwable ex) { @@ -202,4 +206,29 @@ public static boolean isShutdownInProgress() { private boolean isShutdownInProgressInternal() { return shutdownInProgress.get(); } + + public static void deleteOnExit(File file) { + if (isShutdownInProgress()) { + throw new IllegalStateException("Shutdown in progress, cannot add a deleteOnExit"); + } + DELETE_ON_EXIT_HOOK.deleteTargets.add(file); + } + + public static void cancelDeleteOnExit(File file) { + if (isShutdownInProgress()) { + throw new IllegalStateException("Shutdown in progress, cannot cancel a deleteOnExit"); + } + DELETE_ON_EXIT_HOOK.deleteTargets.remove(file); + } + + private static class DeleteOnExitHook implements Runnable { + private final Set deleteTargets = Collections.synchronizedSet(new HashSet()); + + @Override + public void run() { + for (File deleteTarget : deleteTargets) { + deleteTarget.delete(); + } + } + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index 41b4bb1..dae4cf1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -87,6 +87,7 @@ import org.apache.hadoop.hive.shims.Utils; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.Shell; +import org.apache.hive.common.util.ShutdownHookManager; import com.google.common.base.Preconditions; @@ -297,6 +298,24 @@ public void setTmpErrOutputFile(File tmpErrOutputFile) { this.tmpErrOutputFile = tmpErrOutputFile; } + public void deleteTmpOutputFile() { + deleteTmpFile(tmpOutputFile); + } + + public void deleteTmpErrOutputFile() { + deleteTmpFile(tmpErrOutputFile); + } + + private boolean deleteTmpFile(File tempFile) { + if (tempFile != null) { + tempFile.delete(); + ShutdownHookManager.cancelDeleteOnExit(tempFile); + // do not nullify. will be reused + return true; + } + return false; + } + public boolean getIsSilent() { if(conf != null) { return conf.getBoolVar(HiveConf.ConfVars.HIVESESSIONSILENT); @@ -849,7 +868,7 @@ private static File createTempFile(HiveConf conf) throws IOException { } } File tmpFile = File.createTempFile(sessionID, ".pipeout", tmpDir); - tmpFile.deleteOnExit(); + ShutdownHookManager.deleteOnExit(tmpFile); return tmpFile; } @@ -1537,6 +1556,8 @@ public void close() throws IOException { closeSparkSession(); registry.closeCUDFLoaders(); dropSessionPaths(conf); + deleteTmpOutputFile(); + deleteTmpErrOutputFile(); } public void closeSparkSession() { diff --git a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java index 1d1e995..c40c269 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java @@ -200,10 +200,8 @@ public RowSet getNextRowSet(FetchOrientation orientation, long maxRows) throws H private void cleanTmpFile() { resetResultReader(); SessionState sessionState = getParentSession().getSessionState(); - File tmp = sessionState.getTmpOutputFile(); - tmp.delete(); - tmp = sessionState.getTmpErrOutputFile(); - tmp.delete(); + sessionState.deleteTmpOutputFile(); + sessionState.deleteTmpErrOutputFile(); } private void resetResultReader() { diff --git a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java index 175348b..e2ee388 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java @@ -293,13 +293,8 @@ private void cleanup(OperationState state) throws HiveSQLException { driver = null; SessionState ss = SessionState.get(); - if (ss.getTmpOutputFile() != null) { - ss.getTmpOutputFile().delete(); - } - - if (ss.getTmpErrOutputFile() != null) { - ss.getTmpErrOutputFile().delete(); - } + ss.deleteTmpOutputFile(); + ss.deleteTmpErrOutputFile(); } @Override