In the jena-core-simplified branch, I am getting a test failure for

com.hp.hpl.jena.reasoner.rulesys.test.ConcuerrencyTest.testWithOWLMemMicroRuleInfModel

The deadlock does not seem to be from the changes as this looks like an embrace situation:

A/ In LPTopGoalIterator moveForward is synchronized and then grabs a lock on an LPBRuleEngine.

So the locking is:
LPTopGoalIterator -> LPBRuleEngine

B/ LPBRuleEngine.checkSafeToUpdate has "Should be called from within a synchronized block." in the javadoc and it calls LPTopGoalIterator.close, a synchronized method.

The outer synchronized is LPBRuleEngine.deleteAllRules

so the lock order is

LPBRuleEngine -> LPTopGoalIterator


Oops.

Is the sequence below safe? Move the synchronized in to cover only the close and get of the engine.

LPTopGoalIterator --

 private /*synchronized*/ void moveForward() {
        LPBRuleEngine lpEngine ;
        synchronized(this)
        {
            checkClosed();
            lpEngine = interpreter.getEngine();
        }
        synchronized (lpEngine) {
            // Check again, is lpEngine valid?
            checkClosed();

        Andy


--------------------------
Debug from ConcurrencyTest:
The commented out Java6 has been put in.

*** Deadlocked threads
Thread "pool-1-thread-20" id=28 BLOCKED
Lock name: com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine@7a4632db owned by "pool-1-thread-1" id=9

Stack trace:
com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward (LPTopGoalIterator.java:89) com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext (LPTopGoalIterator.java:200) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.UniqueExtendedIterator.hasNext (UniqueExtendedIterator.java:77) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.FilterIterator.hasNext (FilterIterator.java:55) com.hp.hpl.jena.util.iterator.Map1Iterator.hasNext (Map1Iterator.java:49) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76)

com.hp.hpl.jena.reasoner.rulesys.test.ConcurrencyTest$1QueryExecutingRunnable.run (ConcurrencyTest.java:129)
   java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:471)
   java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
   java.util.concurrent.FutureTask.run (FutureTask.java:166)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:603)
   java.lang.Thread.run (Thread.java:722)

Thread "pool-1-thread-1" id=9 BLOCKED
Lock name: com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator@46c2ea31 owned by "pool-1-thread-5" id=13

Stack trace:
com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.close (LPTopGoalIterator.java:173)

com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine.checkSafeToUpdate (LPBRuleEngine.java:235) com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine.deleteAllRules (LPBRuleEngine.java:158) com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph.prepare (FBRuleInfGraph.java:463) com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph.findWithContinuation (FBRuleInfGraph.java:576) com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph.graphBaseFind (FBRuleInfGraph.java:608) com.hp.hpl.jena.reasoner.BaseInfGraph.graphBaseFind (BaseInfGraph.java:375)
   com.hp.hpl.jena.graph.impl.GraphBase.find (GraphBase.java:264)
   com.hp.hpl.jena.graph.GraphUtil.findAll (GraphUtil.java:128)
com.hp.hpl.jena.rdf.model.impl.ModelCom.listStatements (ModelCom.java:1014)

com.hp.hpl.jena.reasoner.rulesys.test.ConcurrencyTest$1QueryExecutingRunnable.run (ConcurrencyTest.java:123)
   java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:471)
   java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
   java.util.concurrent.FutureTask.run (FutureTask.java:166)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:603)
   java.lang.Thread.run (Thread.java:722)

Thread "pool-1-thread-5" id=13 BLOCKED
Lock name: com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine@7a4632db owned by "pool-1-thread-1" id=9

Stack trace:
com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward (LPTopGoalIterator.java:89) com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext (LPTopGoalIterator.java:200) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.UniqueExtendedIterator.hasNext (UniqueExtendedIterator.java:77) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76) com.hp.hpl.jena.util.iterator.FilterIterator.hasNext (FilterIterator.java:55) com.hp.hpl.jena.util.iterator.Map1Iterator.hasNext (Map1Iterator.java:49) com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext (WrappedIterator.java:76)

com.hp.hpl.jena.reasoner.rulesys.test.ConcurrencyTest$1QueryExecutingRunnable.run (ConcurrencyTest.java:129)
   java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:471)
   java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334)
   java.util.concurrent.FutureTask.run (FutureTask.java:166)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:603)
   java.lang.Thread.run (Thread.java:722)

Reply via email to