diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java index 7febd69..2fa73a8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java @@ -607,7 +607,7 @@ public class HLogSplitter { Throwable thrown = this.thrown.get(); if (thrown == null) return; if (thrown instanceof IOException) { - throw (IOException)thrown; + throw new IOException(thrown); } else { throw new RuntimeException(thrown); } @@ -790,7 +790,7 @@ public class HLogSplitter { try { doRun(); } catch (Throwable t) { - LOG.error("Error in log splitting write thread", t); + LOG.error("Exiting thread", t); writerThreadError(t); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java index 15e388a..d57dc82 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java @@ -742,7 +742,8 @@ public class TestHLogSplit { InstrumentedSequenceFileLogWriter.activateFailure = true; HLogSplitter.split(HBASEDIR, HLOGDIR, OLDLOGDIR, fs, conf); } catch (IOException e) { - assertEquals("This exception is instrumented and should only be thrown for testing", e.getMessage()); + assertTrue(e.getMessage(). + contains("This exception is instrumented and should only be thrown for testing")); throw e; } finally { InstrumentedSequenceFileLogWriter.activateFailure = false; @@ -810,11 +811,36 @@ public class TestHLogSplit { return mockWriter; } }; + // Set up a background thread dumper. Needs a thread to depend on and then we need to run + // the thread dumping in a background thread so it does not hold up the test. + final AtomicBoolean stop = new AtomicBoolean(false); + final Thread someOldThread = new Thread("Some-old-thread") { + @Override + public void run() { + while(!stop.get()) Threads.sleep(10); + } + }; + someOldThread.setDaemon(true); + someOldThread.start(); + final Thread t = new Thread("Background-thread-dumper") { + public void run() { + try { + Threads.threadDumpingIsAlive(someOldThread); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + t.setDaemon(true); + t.start(); try { logSplitter.splitLogFile(logfiles[0], null); fail("Didn't throw!"); } catch (IOException ioe) { assertTrue(ioe.toString().contains("Injected")); + } finally { + // Setting this to true will turn off the background thread dumper. + stop.set(true); } }