Repository: cassandra Updated Branches: refs/heads/trunk 1f23bb4b3 -> e25157901
Fix for harmless exceptions being logged as ERROR Patch by tjake; reviewed by thobbs for CASSANDRA-8564 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9e9846e7 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9e9846e7 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9e9846e7 Branch: refs/heads/trunk Commit: 9e9846e73d2e9c702c8652d9e8744de31923ef6d Parents: d8b79d5 Author: T Jake Luciani <[email protected]> Authored: Thu May 7 16:22:56 2015 -0400 Committer: T Jake Luciani <[email protected]> Committed: Fri May 8 15:03:22 2015 -0400 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../DebuggableScheduledThreadPoolExecutor.java | 27 ++++++++++++++++++++ .../cassandra/service/StorageService.java | 7 +++++ 3 files changed, 35 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e9846e7/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 162b34f..4a9b34a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.6 + * Fix for harmless exceptions logged as ERROR (CASSANDRA-8564) * Delete processed sstables in sstablesplit/sstableupgrade (CASSANDRA-8606) * Improve sstable exclusion from partition tombstones (CASSANDRA-9298) * Validate the indexed column rather than the cell's contents for 2i (CASSANDRA-9057) http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e9846e7/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java index a301923..7226db8 100644 --- a/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java @@ -19,6 +19,10 @@ package org.apache.cassandra.concurrent; import java.util.concurrent.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.JVMStabilityInspector; /** @@ -30,19 +34,42 @@ import org.apache.cassandra.utils.JVMStabilityInspector; */ public class DebuggableScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor { + private static final Logger logger = LoggerFactory.getLogger(DebuggableScheduledThreadPoolExecutor.class); + + public static final RejectedExecutionHandler rejectedExecutionHandler = new RejectedExecutionHandler() + { + public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) + { + if (executor.isShutdown()) + { + if (!StorageService.instance.isInShutdownHook()) + throw new RejectedExecutionException("ScheduledThreadPoolExecutor has shut down."); + + logger.debug("ScheduledThreadPoolExecutor has shut down as part of C* shutdown"); + } + else + { + throw new AssertionError("Unknown rejection of ScheduledThreadPoolExecutor task"); + } + } + }; + public DebuggableScheduledThreadPoolExecutor(int corePoolSize, String threadPoolName, int priority) { super(corePoolSize, new NamedThreadFactory(threadPoolName, priority)); + setRejectedExecutionHandler(rejectedExecutionHandler); } public DebuggableScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { super(corePoolSize, threadFactory); + setRejectedExecutionHandler(rejectedExecutionHandler); } public DebuggableScheduledThreadPoolExecutor(String threadPoolName) { this(1, threadPoolName, Thread.NORM_PRIORITY); + setRejectedExecutionHandler(rejectedExecutionHandler); } // We need this as well as the wrapper for the benefit of non-repeating tasks http://git-wip-us.apache.org/repos/asf/cassandra/blob/9e9846e7/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 8521256..7f9259c 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -200,9 +200,15 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public volatile VersionedValue.VersionedValueFactory valueFactory = new VersionedValue.VersionedValueFactory(getPartitioner()); private Thread drainOnShutdown = null; + private boolean inShutdownHook = false; public static final StorageService instance = new StorageService(); + public boolean isInShutdownHook() + { + return inShutdownHook; + } + public static IPartitioner getPartitioner() { return DatabaseDescriptor.getPartitioner(); @@ -652,6 +658,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE @Override public void runMayThrow() throws InterruptedException { + inShutdownHook = true; ExecutorService counterMutationStage = StageManager.getStage(Stage.COUNTER_MUTATION); ExecutorService mutationStage = StageManager.getStage(Stage.MUTATION); if (mutationStage.isShutdown() && counterMutationStage.isShutdown())
