Index: src/test/java/org/apache/hadoop/hbase/executor/TestExecutorService.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/executor/TestExecutorService.java (revision 1178519) +++ src/test/java/org/apache/hadoop/hbase/executor/TestExecutorService.java (working copy) @@ -124,6 +124,15 @@ // Make sure threads are still around even after their timetolive expires. Thread.sleep(executor.keepAliveTimeInMillis * 2); assertEquals(maxThreads, pool.getPoolSize()); + + executorService.shutdown(); + + assertEquals(0, executorService.getAllExecutorStatuses().size()); + + // Test that submit doesn't throw NPEs + executorService.submit( + new TestEventHandler(mockedServer, EventType.M_SERVER_SHUTDOWN, + lock, counter)); } private void checkStatusDump(ExecutorStatus status) throws IOException { Index: src/main/java/org/apache/hadoop/hbase/executor/ExecutorService.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/executor/ExecutorService.java (revision 1178519) +++ src/main/java/org/apache/hadoop/hbase/executor/ExecutorService.java (working copy) @@ -213,9 +213,6 @@ Executor getExecutor(String name) { Executor executor = this.executorMap.get(name); - if (executor == null) { - LOG.debug("Executor service [" + name + "] not found in " + this.executorMap); - } return executor; } @@ -231,7 +228,16 @@ } public void submit(final EventHandler eh) { - getExecutor(getExecutorServiceType(eh.getEventType())).submit(eh); + Executor executor = getExecutor(getExecutorServiceType(eh.getEventType())); + if (executor == null) { + // This happens only when events are submitted after shutdown() was + // called, so dropping them should be "ok" since it means we're + // shutting down. + LOG.error("Cannot submit [" + eh + "] because the executor is missing." + + " Is this process shutting down?"); + } else { + executor.submit(eh); + } } /**