You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@jena.apache.org by "SMALIS SKLAVOS (Jira)" <ji...@apache.org> on 2022/06/21 13:32:00 UTC
[jira] [Commented] (JENA-1260) NullPointerException when using an inferencing model under multithreaded load with query and delete
[ https://issues.apache.org/jira/browse/JENA-1260?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17556909#comment-17556909 ]
SMALIS SKLAVOS commented on JENA-1260:
--------------------------------------
Hello, would that be possible to backport this change in 3.1.0 ? We cannot use a version higher that 3.1.0 due to this limitation related to oracle spatial https://docs.oracle.com/en/database/oracle/oracle-database/19/rdfrm/rdf-suipport-for-apache-jena.html#GUID-3F437E3E-3B74-4CCF-9F16-B2B07B3899E8
> NullPointerException when using an inferencing model under multithreaded load with query and delete
> ---------------------------------------------------------------------------------------------------
>
> Key: JENA-1260
> URL: https://issues.apache.org/jira/browse/JENA-1260
> Project: Apache Jena
> Issue Type: Bug
> Components: Jena
> Affects Versions: Jena 3.0.0
> Reporter: Stephen Owens
> Assignee: Dave Reynolds
> Priority: Major
> Fix For: Jena 3.2.0
>
> Attachments: TransitiveEngineFailureTest.java
>
>
> {noformat}
> java.lang.NullPointerException
> at java.util.HashSet.contains(HashSet.java:203)
> at org.apache.jena.reasoner.transitiveReasoner.TransitiveEngine.triage(TransitiveEngine.java:194)
> at org.apache.jena.reasoner.transitiveReasoner.TransitiveEngine.add(TransitiveEngine.java:234)
> at org.apache.jena.reasoner.rulesys.FBRuleInfGraph.prepare(FBRuleInfGraph.java:431)
> at org.apache.jena.reasoner.BaseInfGraph.requirePrepared(BaseInfGraph.java:530)
> at org.apache.jena.reasoner.rulesys.FBRuleInfGraph.findWithContinuation(FBRuleInfGraph.java:557)
> at org.apache.jena.reasoner.rulesys.FBRuleInfGraph.graphBaseFind(FBRuleInfGraph.java:587)
> at org.apache.jena.graph.impl.GraphBase.find(GraphBase.java:255)
> at org.apache.jena.sparql.engine.iterator.QueryIterTriplePattern$TripleMapper.<init>(QueryIterTriplePattern.java:75)
> at org.apache.jena.sparql.engine.iterator.QueryIterTriplePattern.nextStage(QueryIterTriplePattern.java:49)
> at org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.makeNextStage(QueryIterRepeatApply.java:108)
> at org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:65)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:111)
> at org.apache.jena.sparql.engine.iterator.QueryIterBlockTriples.hasNextBinding(QueryIterBlockTriples.java:63)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:111)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:39)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:111)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:39)
> at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:111)
> at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:264)
> at org.apache.jena.ext.com.google.common.collect.Iterators$5.hasNext(Iterators.java:547)
> at org.apache.jena.test.TransitiveEngineFailureTest$FailureTask.execQuery(TransitiveEngineFailureTest.java:109)
> at org.apache.jena.test.TransitiveEngineFailureTest$FailureTask.call(TransitiveEngineFailureTest.java:75)
> at org.apache.jena.test.TransitiveEngineFailureTest$FailureTask.call(TransitiveEngineFailureTest.java:1)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at java.lang.Thread.run(Thread.java:745)
> {noformat}
> This failure is due to the {{org.apache.jena.reasoner.transitiveReasoner.TransitiveEngine}} class declaring the {{subClassAliases}}
> member variable (of type HashSet<Node>) as static. The prepare method re-creates this shared variable whenever {{isPrepared}}
> is false:
> {noformat}
> private void prepare() {
> if (isPrepared) return;
> subClassAliases = new HashSet<>();
> . . .
> isPrepared = true;
> }
> {noformat}
> In particular, the static {{subClassAliases}} variable will be re-created whenever a {{TransitiveEngine}} object is created
> ({{isPrepared}} is false at creation time). Note that HashSet is neither thread-safe nor being accessed in a thread-safe manner.
> The combination of attempting to remove triples from the model and attempting to execute queries on the model leads
> to unsafe accesses to {{subClassAliases}}, which eventually leads to a null pointer exception.
--
This message was sent by Atlassian Jira
(v8.20.7#820007)
---------------------------------------------------------------------
To unsubscribe, e-mail: jira-unsubscribe@jena.apache.org
For additional commands, e-mail: jira-help@jena.apache.org