Skip to content

Race conditions causing deadlock

Race conditions on monitor reasonerMap for org.protege.editor.owl.model.inference.OWLReasonerManagerImpl.getCurrentReasoner.

How to reproduce

Build the following ontology called "griffins" from scratch and always check consistency using the debugger between those steps:

  • create a class Person (subclass of Thing)
  • create Individuals of Person: Peter, Meg, Megan, Chris and Stewie
  • Meg is sameAs Megan (check ontology)
  • Peter, Meg, Chris and Stewie are different from each other (check ontology)
  • create object property fatherOf with Person as domain and range (check ontology)
  • until now the ontology is consistent and coherent, but now let's start to build in inconsistencies and always check with debugger with a high probability to produce the race condition
    • example for an inconsistency: make fatherOf functional, but assign Peter as father of Meg, Chris and Stewie
Resolution
  • use a different ontology manager that creates the anonymous ontology for the debugger instead of the same ontology manager that is used and created the proper ontology.
Exception

This happens with DebuggerProgressUI.showWindows() and at org.exquisite.core.solver.ExquisiteOWLReasoner.sync() which together cause a race condition.

"AWT-EventQueue-0@2216" prio=6 tid=0x14 nid=NA waiting
  java.lang.Thread.State: WAITING
	 blocks Thread-66@6606
	  at sun.misc.Unsafe.park(Unsafe.java:-1)
	  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
	  at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:967)
	  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1283)
	  at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
	  at uk.ac.manchester.cs.owl.owlapi.concurrent.ConcurrentOWLOntologyImpl.hashCode(ConcurrentOWLOntologyImpl.java:81)
	  at java.util.HashMap.hash(HashMap.java:338)
	  at java.util.HashMap.get(HashMap.java:556)
	  at org.protege.editor.owl.model.inference.OWLReasonerManagerImpl.getCurrentReasoner(OWLReasonerManagerImpl.java:219)
	  - locked <0x1a17> (a java.util.HashMap)
	  at org.protege.editor.owl.model.OWLModelManagerImpl.getReasoner(OWLModelManagerImpl.java:944)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.lambda$renderToken$0(OWLCellRenderer.java:762)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer$$Lambda$124.496355772.run(Unknown Source:-1)
	  at org.protege.editor.owl.model.inference.DisplayedInferencePreferences.executeTask(DisplayedInferencePreferences.java:118)
	  at org.protege.editor.owl.model.inference.ReasonerPreferences.executeTask(ReasonerPreferences.java:182)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.renderToken(OWLCellRenderer.java:760)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.highlightText(OWLCellRenderer.java:717)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.prepareTextPane(OWLCellRenderer.java:689)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.prepareRenderer(OWLCellRenderer.java:460)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.getListCellRendererComponent(OWLCellRenderer.java:369)
	  at org.protege.editor.owl.ui.framelist.OWLFrameListRenderer.getListCellRendererComponent(OWLFrameListRenderer.java:166)
	  at org.protege.editor.core.ui.list.MList$MListCellRenderer.getListCellRendererComponent(MList.java:269)
	  at org.protege.editor.owl.ui.framelist.OWLFrameList$OWLFrameListUI.updateLayoutState(OWLFrameList.java:848)
	  at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1311)
	  at org.protege.editor.owl.ui.framelist.OWLFrameList$OWLFrameListUI.getCellBounds(OWLFrameList.java:878)
	  at javax.swing.JList.getCellBounds(JList.java:1631)
	  at org.protege.editor.owl.ui.renderer.OWLCellRenderer.getListCellRendererComponent(OWLCellRenderer.java:359)
	  at org.protege.editor.owl.ui.framelist.OWLFrameListRenderer.getListCellRendererComponent(OWLFrameListRenderer.java:166)
	  at org.protege.editor.core.ui.list.MList$MListCellRenderer.getListCellRendererComponent(MList.java:269)
	  at org.protege.editor.owl.ui.framelist.OWLFrameList$OWLFrameListUI.updateLayoutState(OWLFrameList.java:848)
	  at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1311)
	  at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:578)
	  at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
	  at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:791)
	  at java.awt.Container.layout(Container.java:1510)
	  at java.awt.Container.doLayout(Container.java:1499)
	  at java.awt.Container.validateTree(Container.java:1695)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validateTree(Container.java:1704)
	  at java.awt.Container.validate(Container.java:1630)
	  - locked <0x1a1a> (a java.awt.Component$AWTTreeLock)
	  at javax.swing.RepaintManager$3.run(RepaintManager.java:711)
	  at javax.swing.RepaintManager$3.run(RepaintManager.java:709)
	  at java.security.AccessController.doPrivileged(AccessController.java:-1)
	  at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	  at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:708)
	  at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1731)
	  at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	  at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
	  at java.awt.EventQueue.access$500(EventQueue.java:97)
	  at java.awt.EventQueue$3.run(EventQueue.java:709)
	  at java.awt.EventQueue$3.run(EventQueue.java:703)
	  at java.security.AccessController.doPrivileged(AccessController.java:-1)
	  at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	  at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
	  at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
	  at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
	  at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
	  at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
	  at java.security.AccessController.doPrivileged(AccessController.java:-1)
	  at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
	  at java.awt.Dialog.show(Dialog.java:1084)
	  at java.awt.Component.show(Component.java:1673)
	  at java.awt.Component.setVisible(Component.java:1625)
	  at java.awt.Window.setVisible(Window.java:1014)
	  at java.awt.Dialog.setVisible(Dialog.java:1005)
	  at org.exquisite.protege.ui.progress.DebuggerProgressUI.lambda$showWindow$1(DebuggerProgressUI.java:124)
	  at org.exquisite.protege.ui.progress.DebuggerProgressUI$$Lambda$214.1325592186.run(Unknown Source:-1)
	  at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	  at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
	  at java.awt.EventQueue.access$500(EventQueue.java:97)
	  at java.awt.EventQueue$3.run(EventQueue.java:709)
	  at java.awt.EventQueue$3.run(EventQueue.java:703)
	  at java.security.AccessController.doPrivileged(AccessController.java:-1)
	  at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	  at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
	  at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	  at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

versus

"Thread-66@6606" prio=6 tid=0x67 nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
	 waiting for AWT-EventQueue-0@2216 to release lock on <0x1a17> (a java.util.HashMap)
	  at org.protege.editor.owl.model.inference.OWLReasonerManagerImpl.getCurrentReasoner(OWLReasonerManagerImpl.java:218)
	  at org.protege.editor.owl.model.inference.OWLReasonerManagerImpl$1.ontologiesChanged(OWLReasonerManagerImpl.java:55)
	  at org.semanticweb.owlapi.model.DefaultChangeBroadcastStrategy.broadcastChanges(DefaultChangeBroadcastStrategy.java:38)
	  at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.broadcastChanges(OWLOntologyManagerImpl.java:1546)
	  at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.applyChanges(OWLOntologyManagerImpl.java:612)
	  at org.exquisite.core.solver.ExquisiteOWLReasoner.sync(ExquisiteOWLReasoner.java:358)
	  at org.exquisite.core.solver.AbstractSolver.synchronizeCache(AbstractSolver.java:116)
	  at org.exquisite.core.solver.AbstractSolver.isConsistent(AbstractSolver.java:54)
	  at org.exquisite.core.conflictsearch.QuickXPlain.checkInput(QuickXPlain.java:49)
	  at org.exquisite.core.conflictsearch.QuickXPlain.findConflicts(QuickXPlain.java:35)
	  at org.exquisite.core.engines.HSTreeEngine.calculateDiagnoses(HSTreeEngine.java:111)
	  at org.exquisite.protege.Debugger.doCalculateDiagnoses(Debugger.java:593)
	  at org.exquisite.protege.Debugger.doCalculateDiagnosesAndGetQuery(Debugger.java:624)
	  at org.exquisite.protege.Debugger.doStartDebugging(Debugger.java:267)
	  at org.exquisite.protege.Debugger.lambda$doStartDebuggingAsync$0(Debugger.java:245)
	  at org.exquisite.protege.Debugger$$Lambda$205.2030005718.run(Unknown Source:-1)
	  at java.lang.Thread.run(Thread.java:745)

Effect: the computation of diagnoses stops an no response from the UI. The user has to close Protege. CRITICAL