Package org.h2.util

Class 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  
    • 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 as ThreadInfo.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()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • 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
    • Constructor Detail

      • AbbaLockingDetector

        public AbbaLockingDetector()
    • Method Detail

      • startCollecting

        public AbbaLockingDetector startCollecting()
        Start collecting locking data.
        Returns:
        this
      • reset

        public void reset()
        Reset the state.
      • run

        public void run()
        Specified by:
        run in interface java.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 as ThreadInfo.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)