Author: jlowe Date: Wed Dec 26 20:34:39 2012 New Revision: 1426014 URL: http://svn.apache.org/viewvc?rev=1426014&view=rev Log: HADOOP-9169. Bring branch-0.23 ExitUtil up to same level as branch-2. Contributed by Robert Joseph Evans
Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ExitUtil.java Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1426014&r1=1426013&r2=1426014&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/CHANGES.txt Wed Dec 26 20:34:39 2012 @@ -42,6 +42,9 @@ Release 0.23.6 - UNRELEASED HADOOP-9152. HDFS can report negative DFS Used on clusters with very small amounts of data (Brock Noland via tgraves) + HADOOP-9169. Bring branch-0.23 ExitUtil up to same level as branch-2 + (Robert Joseph Evans via jlowe) + Release 0.23.5 - UNRELEASED INCOMPATIBLE CHANGES Modified: hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ExitUtil.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ExitUtil.java?rev=1426014&r1=1426013&r2=1426014&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ExitUtil.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ExitUtil.java Wed Dec 26 20:34:39 2012 @@ -30,7 +30,7 @@ import org.apache.hadoop.classification. public final class ExitUtil { private final static Log LOG = LogFactory.getLog(ExitUtil.class.getName()); private static volatile boolean systemExitDisabled = false; - private static volatile boolean terminateCalled = false; + private static volatile ExitException firstExitException; public static class ExitException extends RuntimeException { private static final long serialVersionUID = 1L; @@ -50,17 +50,34 @@ public final class ExitUtil { } /** - * Clear the previous exit record. + * @return true if terminate has been called */ - public static void clearTerminateCalled() { - terminateCalled = false; + public static boolean terminateCalled() { + // Either we set this member or we actually called System#exit + return firstExitException != null; } /** - * @return true if terminate has been called + * @return the first ExitException thrown, null if none thrown yet */ - public static boolean terminateCalled() { - return terminateCalled; + public static ExitException getFirstExitException() { + return firstExitException; + } + + /** + * Reset the tracking of process termination. This is for use + * in unit tests where one test in the suite expects an exit + * but others do not. + */ + public static void resetFirstExitException() { + firstExitException = null; + } + + /** + * Clear the previous exit record. + */ + public static void clearTerminateCalled() { + resetFirstExitException(); } /** @@ -72,17 +89,32 @@ public final class ExitUtil { */ public static void terminate(int status, String msg) throws ExitException { LOG.info("Exiting with status " + status); - terminateCalled = true; if (systemExitDisabled) { - throw new ExitException(status, msg); + ExitException ee = new ExitException(status, msg); + LOG.fatal("Terminate called", ee); + if (null == firstExitException) { + firstExitException = ee; + } + throw ee; } System.exit(status); } /** + * Like {@link terminate(int, String)} but uses the given throwable to + * initialize the ExitException. + * @param status + * @param t throwable used to create the ExitException + * @throws ExitException if System.exit is disabled for test purposes + */ + public static void terminate(int status, Throwable t) throws ExitException { + terminate(status, StringUtils.stringifyException(t)); + } + + /** * Like {@link terminate(int, String)} without a message. * @param status - * @throws ExitException + * @throws ExitException if System.exit is disabled for test purposes */ public static void terminate(int status) throws ExitException { terminate(status, "ExitException");