Package org.h2.util
Class AbbaLockingDetector
- java.lang.Object
-
- org.h2.util.AbbaLockingDetector
-
- All Implemented Interfaces:
java.lang.Runnable
public class AbbaLockingDetector extends java.lang.Object implements java.lang.Runnable
Utility to detect AB-BA deadlocks.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.Set<java.lang.String>
knownDeadlocks
private java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>>
lockOrdering
Map of (object A) -> ( map of (object locked before object A) -> (stack trace where locked) )private boolean
stop
private java.lang.Thread
thread
private java.lang.management.ThreadMXBean
threadMXBean
private int
tickIntervalMs
-
Constructor Summary
Constructors Constructor Description AbbaLockingDetector()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static void
dumpStackTraceElement(java.lang.management.ThreadInfo info, java.lang.StringBuilder sb, int i, java.lang.StackTraceElement e)
private static void
generateOrdering(java.util.List<java.lang.String> lockOrder, java.lang.management.ThreadInfo info)
We cannot simply call getLockedMonitors because it is not guaranteed to return the locks in the correct order.private static java.lang.String
getObjectName(java.lang.management.MonitorInfo info)
private static java.lang.String
getStackTraceForThread(java.lang.management.ThreadInfo info)
Dump data in the same format asThreadInfo.toString()
, but with some modifications (no stack frame limit, and removal of uninteresting stack frames)private void
markHigher(java.util.List<java.lang.String> lockOrder, java.lang.management.ThreadInfo threadInfo)
private void
processThreadList(java.lang.management.ThreadInfo[] threadInfoList)
void
reset()
Reset the state.void
run()
AbbaLockingDetector
startCollecting()
Start collecting locking data.AbbaLockingDetector
stopCollecting()
Stop collecting.private void
tick()
-
-
-
Field Detail
-
tickIntervalMs
private final int tickIntervalMs
- See Also:
- Constant Field Values
-
stop
private volatile boolean stop
-
threadMXBean
private final java.lang.management.ThreadMXBean threadMXBean
-
thread
private java.lang.Thread thread
-
lockOrdering
private final java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.String>> lockOrdering
Map of (object A) -> ( map of (object locked before object A) -> (stack trace where locked) )
-
knownDeadlocks
private final java.util.Set<java.lang.String> knownDeadlocks
-
-
Method Detail
-
startCollecting
public AbbaLockingDetector startCollecting()
Start collecting locking data.- Returns:
- this
-
reset
public void reset()
Reset the state.
-
stopCollecting
public AbbaLockingDetector stopCollecting()
Stop collecting.- Returns:
- this
-
run
public void run()
- Specified by:
run
in interfacejava.lang.Runnable
-
tick
private void tick()
-
processThreadList
private void processThreadList(java.lang.management.ThreadInfo[] threadInfoList)
-
generateOrdering
private static void generateOrdering(java.util.List<java.lang.String> lockOrder, java.lang.management.ThreadInfo info)
We cannot simply call getLockedMonitors because it is not guaranteed to return the locks in the correct order.
-
markHigher
private void markHigher(java.util.List<java.lang.String> lockOrder, java.lang.management.ThreadInfo threadInfo)
-
getStackTraceForThread
private static java.lang.String getStackTraceForThread(java.lang.management.ThreadInfo info)
Dump data in the same format asThreadInfo.toString()
, but with some modifications (no stack frame limit, and removal of uninteresting stack frames)
-
dumpStackTraceElement
private static void dumpStackTraceElement(java.lang.management.ThreadInfo info, java.lang.StringBuilder sb, int i, java.lang.StackTraceElement e)
-
getObjectName
private static java.lang.String getObjectName(java.lang.management.MonitorInfo info)
-
-