asyncRequests cause deadlocks in DB client
QueryProcessor.scheduleNow
can easily deadlock while handling asynchronous requests and external reads, thanks the way it can synchronously invoke asynchronous requests directly when the request is invoked, while still holding on to QueryProcessor.querySupportLock
which the other threads and ExternalRead listeners may also try to lock.
Nothing much more is needed than a normal DnD-monitor on an Apros diagram to get this to happen.
This is a must fix issue for 1.41.0.
"Apros simulation thread" #87 prio=6 os_prio=0 tid=0x000000002968e800 nid=0x1de8 waiting for monitor entry [0x000000003dcff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at fi.vtt.simantics.procore.internal.SessionRequestManager.scheduleWrite(SessionRequestManager.java:355)
- waiting to lock <0x00000006c7d789d8> (a fi.vtt.simantics.procore.internal.SessionRequestManager)
at fi.vtt.simantics.procore.internal.SessionImplSocket.scheduleRequest(SessionImplSocket.java:422)
at fi.vtt.simantics.procore.internal.SessionImplSocket.scheduleRequest(SessionImplSocket.java:402)
at fi.vtt.simantics.procore.internal.SessionImplSocket.asyncRequest(SessionImplSocket.java:2165)
at fi.vtt.simantics.procore.internal.SessionImplSocket.asyncRequest(SessionImplSocket.java:2199)
at fi.vtt.simantics.procore.internal.QuerySupportImpl.dirtyPrimitives(QuerySupportImpl.java:173)
at org.simantics.db.impl.query.QueryProcessor.updatePrimitive(QueryProcessor.java:1788)
at org.simantics.db.impl.query.ExternalReadEntry.execute(ExternalReadEntry.java:216)
- locked <0x000000076f69deb0> (a java.util.LinkedList)
at org.simantics.db.layer0.variable.NodeStructureRequest.run(NodeStructureRequest.java:170)
- locked <0x000000076f69de28> (a org.simantics.db.layer0.variable.NodeStructureRequest)
at fi.vtt.apros.experiment.variables.AprosVariableNodeBase$1.run(AprosVariableNodeBase.java:30)
at fi.vtt.apros.experiment.SimulationThread.performTask(SimulationThread.java:235)
at fi.vtt.apros.experiment.SimulationThread.runTasks(SimulationThread.java:461)
at fi.vtt.apros.experiment.SimulationThread.access$5(SimulationThread.java:455)
at fi.vtt.apros.experiment.SimulationThread$3.run(SimulationThread.java:619)
at fi.vtt.apros.experiment.internal.PeriodicalRunner.run(PeriodicalRunner.java:20)
at fi.vtt.apros.experiment.SimulationThread.run(SimulationThread.java:540)
"Query Thread 0" #33 prio=6 os_prio=0 tid=0x0000000020681800 nid=0x3f94 waiting on condition [0x0000000024bcc000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000076f69dfb8> (a java.util.concurrent.Semaphore$NonfairSync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.Semaphore.tryAcquire(Semaphore.java:582)
at fi.vtt.apros.experiment.SimulationThread.safeSyncExec(SimulationThread.java:393)
at fi.vtt.apros.experiment.SimulationThread.syncExec(SimulationThread.java:371)
at fi.vtt.apros.experiment.AprosExperiment.syncExec(AprosExperiment.java:2564)
at fi.vtt.apros.experiment.AprosExperiment$AprosRealm.syncExec(AprosExperiment.java:258)
at org.simantics.db.layer0.variable.Variables.requestNodeStructure(Variables.java:707)
at org.simantics.db.layer0.function.All.getPossibleNodeProperty(All.java:794)
at org.simantics.db.layer0.function.All.getStandardChildDomainPropertyVariable(All.java:476)
at org.simantics.db.layer0.function.All.getStandardChildDomainPropertyVariable(All.java:462)
at org.simantics.structural2.Functions$3.getVariable(Functions.java:260)
at org.simantics.db.layer0.variable.StandardGraphChildVariable.getPossibleDomainProperty(StandardGraphChildVariable.java:66)
at org.simantics.db.layer0.variable.AbstractVariable.getPossibleProperty(AbstractVariable.java:389)
at org.simantics.db.layer0.variable.AbstractVariable.browsePossible(AbstractVariable.java:633)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:84)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:112)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:695)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:1930)
at org.simantics.modeling.ui.diagram.monitor.MonitorClassFactory2.load(MonitorClassFactory2.java:155)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:52)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:112)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:695)
at org.simantics.db.impl.graph.ReadGraphImpl$24.run0(ReadGraphImpl.java:5170)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryProcessor.schedule(QueryProcessor.java:248)
- locked <0x00000006c7d789d8> (a fi.vtt.simantics.procore.internal.SessionRequestManager)
at org.simantics.db.impl.query.QueryProcessor.scheduleNow(QueryProcessor.java:191)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5164)
at org.simantics.diagram.adapter.SyncElementFactory.load(SyncElementFactory.java:48)
at org.simantics.diagram.adapter.LoadRequest.perform(LoadRequest.java:41)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:235)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:774)
at org.simantics.db.impl.graph.ReadGraphImpl$26.run0(ReadGraphImpl.java:5252)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryProcessor.schedule(QueryProcessor.java:248)
- locked <0x00000006c7d789d8> (a fi.vtt.simantics.procore.internal.SessionRequestManager)
at org.simantics.db.impl.query.QueryProcessor.scheduleNow(QueryProcessor.java:191)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5246)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5222)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5234)
at org.simantics.diagram.adapter.NodeRequest$1$1$1$1.execute(NodeRequest.java:136)
at org.simantics.diagram.adapter.NodeRequest$1$1$1$1.execute(NodeRequest.java:1)
at org.simantics.db.impl.graph.ReadGraphImpl$26$1.execute(ReadGraphImpl.java:5257)
at org.simantics.db.impl.query.AsyncReadEntry.performFromCache(AsyncReadEntry.java:144)
at org.simantics.db.impl.query.AsyncReadEntry$1AsyncTask.run0(AsyncReadEntry.java:203)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:243)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:774)
at org.simantics.db.impl.graph.ReadGraphImpl$26.run0(ReadGraphImpl.java:5252)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryProcessor.schedule(QueryProcessor.java:248)
- locked <0x00000006c7d789d8> (a fi.vtt.simantics.procore.internal.SessionRequestManager)
at org.simantics.db.impl.query.QueryProcessor.scheduleNow(QueryProcessor.java:191)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5246)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5222)
at org.simantics.diagram.adapter.NodeRequest$1$1$1.execute(NodeRequest.java:122)
at org.simantics.diagram.adapter.NodeRequest$1$1$1.execute(NodeRequest.java:1)
at org.simantics.db.impl.graph.ReadGraphImpl$26$1.execute(ReadGraphImpl.java:5257)
at org.simantics.db.impl.query.AsyncReadEntry.performFromCache(AsyncReadEntry.java:144)
at org.simantics.db.impl.query.AsyncReadEntry$1AsyncTask.run0(AsyncReadEntry.java:203)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:243)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:774)
at org.simantics.db.impl.graph.ReadGraphImpl$26.run0(ReadGraphImpl.java:5252)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryProcessor.schedule(QueryProcessor.java:248)
- locked <0x00000006c7d789d8> (a fi.vtt.simantics.procore.internal.SessionRequestManager)
at org.simantics.db.impl.query.QueryProcessor.scheduleNow(QueryProcessor.java:191)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5246)
at org.simantics.db.impl.graph.ReadGraphImpl.asyncRequest(ReadGraphImpl.java:5222)
at org.simantics.diagram.adapter.NodeRequest$1$1.execute(NodeRequest.java:107)
at org.simantics.diagram.adapter.NodeRequest$1$1.execute(NodeRequest.java:1)
at org.simantics.db.impl.query.ReadEntry.performFromCache(ReadEntry.java:172)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:136)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:695)
at org.simantics.db.impl.graph.ReadGraphImpl$24.run0(ReadGraphImpl.java:5170)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryProcessor.performPending(QueryProcessor.java:184)
at org.simantics.db.impl.graph.ReadGraphImpl.performPending(ReadGraphImpl.java:6338)
at org.simantics.db.impl.graph.AsyncBarrierImpl.waitBarrier(AsyncBarjava:133)
at org.simantics.db.impl.BlockingAsyncProcedure.waitBarrier(BlockingAsyncProcedure.java:66)
at org.simantics.db.impl.query.AsyncReadEntry$1AsyncTask.run0(AsyncReadEntry.java:184)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:242)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:748)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2043)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2013)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer$GraphToDiagramUpdater.process(GraphToDiagramSynchronizer.java:2328)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer$8.graphUpdate(GraphToDiagramSynchronizer.java:2749)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer.processGraphUpdates(GraphToDiagramSynchronizer.java:3396)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer.loadDiagram(GraphToDiagramSynchronizer.java:1330)
at org.simantics.diagram.query.DiagramLoadQuery.perform(DiagramLoadQuery.java:52)
at org.simantics.diagram.query.DiagramLoadQuery.perform(DiagramLoadQuery.java:1)
at org.simantics.modeling.ui.diagramEditor.DiagramViewer.lambda$2(DiagramViewer.java:645)
at org.simantics.modeling.ui.diagramEditor.DiagramViewer$$Lambda$415/756436817.perform(Unknown Source)
at fi.vtt.simantics.procore.internal.SessionImplSocket$6.run0(SessionImplSocket.java:1552)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at fi.vtt.simantics.procore.internal.SessionRequestManager$1.run0(SessionRequestManager.java:127)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:294)
at org.simantics.db.impl.query.QueryThread.run(QueryThread.java:246)
Edited by Tuukka Lehtonen