diff --git src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java index b25e575..3b8810e 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java @@ -21,6 +21,8 @@ package org.apache.hadoop.hbase.regionserver; import java.io.IOException; import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -70,7 +72,10 @@ class ShutdownHook { */ static void install(final Configuration conf, final FileSystem fs, final Stoppable stop, final Thread threadToJoin) { - Thread fsShutdownHook = suppressHdfsShutdownHook(fs); + Thread fsShutdownHook = null; + try { + fsShutdownHook = suppressHdfsShutdownHook(fs); + } catch (Throwable ex) {} Thread t = new ShutdownHookThread(conf, stop, threadToJoin, fsShutdownHook); Runtime.getRuntime().addShutdownHook(t); LOG.info("Installed shutdown hook thread: " + t.getName()); @@ -80,6 +85,8 @@ class ShutdownHook { * Thread run by shutdown hook. */ private static class ShutdownHookThread extends Thread { + private final static Map refCounts = new HashMap(); + private final Stoppable stop; private final Thread threadToJoin; private final Thread fsShutdownHook; @@ -92,6 +99,13 @@ class ShutdownHook { this.threadToJoin = threadToJoin; this.conf = conf; this.fsShutdownHook = fsShutdownHook; + + if (fsShutdownHook != null) { + synchronized (refCounts) { + Integer refs = refCounts.get(fsShutdownHook); + refCounts.put(fsShutdownHook, refs == null ? 1 : refs + 1); + } + } } @Override @@ -103,10 +117,18 @@ class ShutdownHook { this.stop.stop("Shutdown hook"); Threads.shutdown(this.threadToJoin); if (this.fsShutdownHook != null) { - LOG.info("Starting fs shutdown hook thread."); - this.fsShutdownHook.start(); - Threads.shutdown(this.fsShutdownHook, - this.conf.getLong(FS_SHUTDOWN_HOOK_WAIT, 30000)); + synchronized (refCounts) { + int refs = refCounts.get(fsShutdownHook); + if (refs == 1) { + LOG.info("Starting fs shutdown hook thread."); + this.fsShutdownHook.start(); + Threads.shutdown(this.fsShutdownHook, + this.conf.getLong(FS_SHUTDOWN_HOOK_WAIT, 30000)); + } + if (refs > 0) { + refCounts.put(fsShutdownHook, refs - 1); + } + } } } LOG.info("Shutdown hook finished."); diff --git src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java index baf0c27..b069377 100644 --- src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java +++ src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java @@ -179,7 +179,10 @@ public class JVMClusterUtil { } if (regionservers != null) { for (JVMClusterUtil.RegionServerThread t: regionservers) { - t.start(); + try { + HRegionServer.startRegionServer(t.getRegionServer()); + } catch (Throwable ex) {} + // t.start(); } } if (masters == null || masters.isEmpty()) {