diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java index c4335f6..e5f306a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ShutdownHook.java @@ -203,6 +203,7 @@ public class ShutdownHook { synchronized (fsShutdownHooks) { boolean isFSCacheDisabled = fs.getConf().getBoolean("fs.hdfs.impl.disable.cache", false); if (!isFSCacheDisabled && !fsShutdownHooks.containsKey(hdfsClientFinalizer) + && ShutdownHookManager.hasShutdownHook(hdfsClientFinalizer) && !ShutdownHookManager.deleteShutdownHook(hdfsClientFinalizer)) { throw new RuntimeException( "Failed suppression of fs shutdown hook: " + hdfsClientFinalizer); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ShutdownHookManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ShutdownHookManager.java index e731bd7..ce8fe34 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ShutdownHookManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ShutdownHookManager.java @@ -17,83 +17,57 @@ */ package org.apache.hadoop.hbase.util; +import org.apache.yetus.audience.InterfaceAudience; /** * This class provides ShutdownHookManager shims for HBase to interact with the Hadoop 1.0.x and the * Hadoop 2.0+ series. - * - * NOTE: No testing done against 0.22.x, or 0.21.x. */ -abstract public class ShutdownHookManager { - private static ShutdownHookManager instance; - +@InterfaceAudience.Private +public class ShutdownHookManager { static Class shutdownHookManagerClass = null; static { try { // This class exists in hadoop 2.0+ but not in Hadoop 20.x/1.x shutdownHookManagerClass = Class.forName("org.apache.hadoop.util.ShutdownHookManager"); - instance = new ShutdownHookManagerV2(); } catch (Exception e) { - instance = new ShutdownHookManagerV1(); } } - abstract public void addShutdownHook(Thread shutdownHook, int priority); - - abstract public boolean removeShutdownHook(Runnable shutdownHook); - public static void affixShutdownHook(Thread shutdownHook, int priority) { - instance.addShutdownHook(shutdownHook, priority); + try { + Methods.call(shutdownHookManagerClass, + Methods.call(shutdownHookManagerClass, null, "get", null, null), + "addShutdownHook", + new Class[] { Runnable.class, int.class }, + new Object[] { shutdownHook, priority }); + } catch (Exception ex) { + throw new RuntimeException("we could not use ShutdownHookManager.addShutdownHook", ex); + } } public static boolean deleteShutdownHook(Runnable shutdownHook) { - return instance.removeShutdownHook(shutdownHook); - } - - private static class ShutdownHookManagerV1 extends ShutdownHookManager { - // priority is ignored in hadoop versions earlier than 2.0 - @Override - public void addShutdownHook(Thread shutdownHookThread, int priority) { - Runtime.getRuntime().addShutdownHook(shutdownHookThread); - } - - @Override - public boolean removeShutdownHook(Runnable shutdownHook) { - Thread shutdownHookThread = null; - if (!(shutdownHook instanceof Thread)) { - shutdownHookThread = new Thread(shutdownHook); - } else shutdownHookThread = (Thread) shutdownHook; - - return Runtime.getRuntime().removeShutdownHook(shutdownHookThread); + try { + return (Boolean) + Methods.call(shutdownHookManagerClass, + Methods.call(shutdownHookManagerClass, null, "get", null, null), + "removeShutdownHook", + new Class[] { Runnable.class }, + new Object[] { shutdownHook }); + } catch (Exception ex) { + throw new RuntimeException("we could not use ShutdownHookManager#removeShutdownHook", ex); } } - - private static class ShutdownHookManagerV2 extends ShutdownHookManager { - @Override - public void addShutdownHook(Thread shutdownHookThread, int priority) { - try { - Methods.call(shutdownHookManagerClass, - Methods.call(shutdownHookManagerClass, null, "get", null, null), - "addShutdownHook", - new Class[] { Runnable.class, int.class }, - new Object[] { shutdownHookThread, priority }); - } catch (Exception ex) { - throw new RuntimeException("we could not use ShutdownHookManager.addShutdownHook", ex); - } - } - - @Override - public boolean removeShutdownHook(Runnable shutdownHook) { - try { - return (Boolean) - Methods.call(shutdownHookManagerClass, - Methods.call(shutdownHookManagerClass, null, "get", null, null), - "removeShutdownHook", - new Class[] { Runnable.class }, - new Object[] { shutdownHook }); - } catch (Exception ex) { - throw new RuntimeException("we could not use ShutdownHookManager", ex); - } + public static boolean hasShutdownHook(Runnable shutdownHook) { + try { + return (Boolean) + Methods.call(shutdownHookManagerClass, + Methods.call(shutdownHookManagerClass, null, "get", null, null), + "hasShutdownHook", + new Class[] { Runnable.class }, + new Object[] { shutdownHook }); + } catch (Exception ex) { + throw new RuntimeException("we could not use ShutdownHookManager#hasShutdownHook", ex); } } }