OpenJPA
  1. OpenJPA
  2. OPENJPA-1993

Deadlock Potential with ORM XML Processing

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.2.0, 1.2.1, 1.2.2, 2.0.0, 2.0.1, 2.1.0
    • Fix Version/s: 1.0.5, 1.2.3, 2.0.2, 2.0.3, 2.1.2, 2.2.0, 2.3.0
    • Component/s: kernel
    • Labels:
      None

      Description

      There exists the potential for deadlock with the ORM XML processing function. In an environment
      with multiple threads (such as an application server), operations (such as creating a new
      EntityManagerFactory or transformation Classloader activity) can lead to a point where
      a Xerces SAX Parser (acquired by XMLFactory) is constituted and executed. Xerces calls
      Thread.currentThread().getContextClassloader() during its execution to construct the
      SAXParser (via ObjectFactory.createObject()). This means that within the call to Xerces,
      a ClassLoader lock will be attempted on the Thread's ContextClassLoader. If there is already
      a lock with a ClassLoader higher in the heirarchy, and another thread with a lock on the
      same ContextClassLoader that is waiting to acquire a lock on a higher level ClassLoader, then
      a deadlock will occur.

      A solution to this problem is to temporally set the Thread's ContextClassLoader at the
      point where XML APIs are invoked (such as in XMLFactory, XMLMetaDataParser) to the
      ClassLoader that loaded the OpenJPA implementation classes. This will prevent Xerces from
      starting with a lower level classloader and avoid this deadlock potential.

        Activity

        Hide
        Jody Grassel added a comment -

        Checked in the fix for this issue. To preserve original behavior, the ContextClassLoader override will only take place if the following OpenJPA Compatibility option is set:

        openjpa.Compatibility="OverrideContextClassloader=true"

        Show
        Jody Grassel added a comment - Checked in the fix for this issue. To preserve original behavior, the ContextClassLoader override will only take place if the following OpenJPA Compatibility option is set: openjpa.Compatibility="OverrideContextClassloader=true"

          People

          • Assignee:
            Jody Grassel
            Reporter:
            Jody Grassel
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development