You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sa...@apache.org on 2023/03/14 16:45:35 UTC
[cassandra] 19/25: [CEP-21] Option to record thread creation stacktrace
This is an automated email from the ASF dual-hosted git repository.
samt pushed a commit to branch cep-21-tcm
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit e7d451fd6b0516a0566dcb466ceba677d08759be
Author: Sam Tunnicliffe <sa...@apache.org>
AuthorDate: Fri Mar 3 17:52:36 2023 +0000
[CEP-21] Option to record thread creation stacktrace
Adds a property for use in tests and debugging which preserves
the stacktrace of when a thread is created by NamedThreadFactory.
Co-authored-by: Marcus Eriksson <ma...@apache.org>
Co-authored-by: Alex Petrov <ol...@gmail.com>
Co-authored-by: Sam Tunnicliffe <sa...@apache.org>
---
.../cassandra/concurrent/NamedThreadFactory.java | 38 +++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java b/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
index 9816649424..1df561e609 100644
--- a/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
+++ b/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
@@ -17,6 +17,7 @@
*/
package org.apache.cassandra.concurrent;
+import java.util.Arrays;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
@@ -33,6 +34,9 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
public class NamedThreadFactory implements ThreadFactory
{
+ public static final String PRESERVE_THREAD_CREATION_STACKTRACE_PROPERTY_NAME = "cassandra.test.preserve_thread_creation_stacktrace";
+ public static final Boolean PRESERVE_THREAD_CREATION_STACKTRACE = Boolean.getBoolean(PRESERVE_THREAD_CREATION_STACKTRACE_PROPERTY_NAME);
+
private static final AtomicInteger anonymousCounter = new AtomicInteger();
private static volatile String globalPrefix;
@@ -159,11 +163,43 @@ public class NamedThreadFactory implements ThreadFactory
public static Thread createThread(ThreadGroup threadGroup, Runnable runnable, String name, boolean daemon)
{
String prefix = globalPrefix;
- Thread thread = new FastThreadLocalThread(threadGroup, runnable, prefix != null ? prefix + name : name);
+ Thread thread;
+ String threadName = prefix != null ? prefix + name : name;
+ if (PRESERVE_THREAD_CREATION_STACKTRACE)
+ thread = new InspectableFastThreadLocalThread(threadGroup, runnable, threadName);
+ else
+ thread = new FastThreadLocalThread(threadGroup, runnable, threadName);
thread.setDaemon(daemon);
return thread;
}
+ public static class InspectableFastThreadLocalThread extends FastThreadLocalThread
+ {
+ public StackTraceElement[] creationTrace;
+
+ private void setStack()
+ {
+ creationTrace = Thread.currentThread().getStackTrace();
+ creationTrace = Arrays.copyOfRange(creationTrace, 2, creationTrace.length);
+ }
+
+ public InspectableFastThreadLocalThread() { super(); setStack(); }
+
+ public InspectableFastThreadLocalThread(Runnable target) { super(target); setStack(); }
+
+ public InspectableFastThreadLocalThread(ThreadGroup group, Runnable target) { super(group, target); setStack(); }
+
+ public InspectableFastThreadLocalThread(String name) { super(name); setStack(); }
+
+ public InspectableFastThreadLocalThread(ThreadGroup group, String name) { super(group, name); setStack(); }
+
+ public InspectableFastThreadLocalThread(Runnable target, String name) { super(target, name); setStack(); }
+
+ public InspectableFastThreadLocalThread(ThreadGroup group, Runnable target, String name) { super(group, target, name); setStack(); }
+
+ public InspectableFastThreadLocalThread(ThreadGroup group, Runnable target, String name, long stackSize) { super(group, target, name, stackSize); setStack(); }
+
+ }
public static <T extends Thread> T setupThread(T thread, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
{
thread.setPriority(priority);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org