This is an automated email from the ASF dual-hosted git repository. brianloss pushed a commit to branch 1.10 in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/1.10 by this push: new 0187567 Re-throw exception from LoggingRunnable (re #1808) 0187567 is described below commit 018756754ff0f289a8b30f846af8b7092270318d Author: Brian Loss <brianl...@apache.org> AuthorDate: Tue Jan 12 10:20:17 2021 -0500 Re-throw exception from LoggingRunnable (re #1808) * Re-throw the caught Throwable unless we received a more serious Error when attempting to log the original Throwable. In that case propagate the more serious error instead. --- .../apache/accumulo/fate/util/LoggingRunnable.java | 36 ++++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/fate/src/main/java/org/apache/accumulo/fate/util/LoggingRunnable.java b/fate/src/main/java/org/apache/accumulo/fate/util/LoggingRunnable.java index d9a6f5e..bff18f3 100644 --- a/fate/src/main/java/org/apache/accumulo/fate/util/LoggingRunnable.java +++ b/fate/src/main/java/org/apache/accumulo/fate/util/LoggingRunnable.java @@ -34,20 +34,36 @@ public class LoggingRunnable implements Runnable { try { runnable.run(); } catch (Throwable t) { + boolean errorOnRun = (t instanceof Error); try { log.error("Thread \"{}\" died {}", Thread.currentThread().getName(), t.getMessage(), t); } catch (Throwable t2) { - // maybe the logging system is screwed up OR there is a bug in the exception, like - // t.getMessage() throws a NPE - System.err.println( - "ERROR " + new Date() + " Failed to log message about thread death " + t2.getMessage()); - t2.printStackTrace(); - - // try to print original exception - System.err - .println("ERROR " + new Date() + " Exception that failed to log : " + t.getMessage()); - t.printStackTrace(); + boolean errorOnLog = (t2 instanceof Error); + try { + // maybe the logging system is screwed up OR there is a bug in the exception, like + // t.getMessage() throws a NPE + System.err.println("ERROR " + new Date() + " Failed to log message about thread death " + + t2.getMessage()); + t2.printStackTrace(); + + // try to print original exception + System.err + .println("ERROR " + new Date() + " Exception that failed to log : " + t.getMessage()); + t.printStackTrace(); + } catch (Throwable t3) { + // If printing to System.err didn't work then don't try to log that exception but do + // re-throw it if it's the most serious failure we've seen so far. + boolean errorOnPrint = (t3 instanceof Error); + if (errorOnPrint && !errorOnLog && !errorOnRun) + throw t3; + } + + // If we got a more serious failure when attempting to log the message, + // then throw that instead of the original exception. + if (errorOnLog && !errorOnRun) + throw t2; } + throw t; } }