[ 
https://issues.apache.org/jira/browse/JENA-1861?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17072157#comment-17072157
 ] 

Andy Seaborne edited comment on JENA-1861 at 3/31/20, 9:14 PM:
---------------------------------------------------------------

Queries should be reusable.

The {{ExprDigest}} is suspect 

Query optimization will rewrite the {{SHA256('foo')}} for its constant value.

But the stack I keep getting does not obviously have {{ExprDigest}} as the 
cause. Stacktrace below. 
 Commenting out the cache in {{ExprDigest}} and I get the same basic expection 
situation.

{noformat}
Caused by: java.lang.NullPointerException
        at java.base/java.util.ArrayDeque.addFirst(ArrayDeque.java:287)
        at java.base/java.util.ArrayDeque.push(ArrayDeque.java:580)
        at 
org.apache.jena.sparql.algebra.walker.ApplyTransformVisitor.push(ApplyTransformVisitor.java:447)
        at 
org.apache.jena.sparql.algebra.walker.ApplyTransformVisitor.visit(ApplyTransformVisitor.java:384)
        at 
org.apache.jena.sparql.expr.ExprFunction1.visit(ExprFunction1.java:96)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visitExprFunction(WalkerVisitor.java:265)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visit(WalkerVisitor.java:246)
        at 
org.apache.jena.sparql.expr.ExprFunction1.visit(ExprFunction1.java:96)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:91)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.lambda$1(WalkerVisitor.java:107)
        at org.apache.jena.sparql.core.VarExprList.lambda$0(VarExprList.java:82)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at 
org.apache.jena.sparql.core.VarExprList.forEachVarExpr(VarExprList.java:79)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:105)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visitVarExpr(WalkerVisitor.java:121)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visit(WalkerVisitor.java:213)
        at org.apache.jena.sparql.algebra.op.OpExtend.visit(OpExtend.java:101)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:81)
        at org.apache.jena.sparql.algebra.walker.Walker.walk$(Walker.java:71)
        at org.apache.jena.sparql.algebra.walker.Walker.walk$(Walker.java:62)
        at org.apache.jena.sparql.algebra.walker.Walker.walk(Walker.java:51)
        at 
org.apache.jena.sparql.algebra.walker.Walker.transform(Walker.java:182)
        at 
org.apache.jena.sparql.algebra.walker.Walker.transform(Walker.java:172)
        at 
org.apache.jena.sparql.algebra.Transformer.transformation$(Transformer.java:107)
        at 
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:103)
        at 
org.apache.jena.sparql.algebra.Transformer.transform(Transformer.java:46)
        at 
org.apache.jena.sparql.algebra.optimize.OptimizerStd.transformExprConstantFolding(OptimizerStd.java:180)
        at 
org.apache.jena.sparql.algebra.optimize.OptimizerStd.rewrite(OptimizerStd.java:86)
        at 
org.apache.jena.sparql.algebra.optimize.Optimize.optimize(Optimize.java:67)
        at org.apache.jena.sparql.algebra.Algebra.optimize(Algebra.java:65)
        at 
org.apache.jena.sparql.engine.main.QueryEngineMain.modifyOp(QueryEngineMain.java:69)
        at 
org.apache.jena.sparql.engine.QueryEngineBase.createPlan(QueryEngineBase.java:127)
        at 
org.apache.jena.sparql.engine.QueryEngineBase.getPlan(QueryEngineBase.java:113)
        at 
org.apache.jena.sparql.engine.main.QueryEngineMain$QueryEngineMainFactory.create(QueryEngineMain.java:90)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.getPlan(QueryExecutionBase.java:601)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.startQueryIterator(QueryExecutionBase.java:548)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.execResultSet(QueryExecutionBase.java:591)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.execSelect(QueryExecutionBase.java:200)
        at dev.Jena1861_expr_hash.lambda$0(Jena1861_expr_hash.java:79)
{noformat}
but sometimes (no ExprDigest cache):
{noformat}
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for 
length 0
        at java.base/java.util.ArrayList.add(ArrayList.java:486)
        at java.base/java.util.ArrayList.add(ArrayList.java:498)
        at org.apache.jena.sparql.core.VarExprList.add(VarExprList.java:125)
        at org.apache.jena.query.Query._addVar(Query.java:491)
        at org.apache.jena.query.Query._addResultVar(Query.java:473)
        at org.apache.jena.query.Query.addResultVar(Query.java:432)
        at org.apache.jena.query.Query.findAndAddNamedVars(Query.java:734)
        at org.apache.jena.query.Query.setResultVars(Query.java:687)
        at 
org.apache.jena.query.QueryExecutionBuilder.build(QueryExecutionBuilder.java:68)
        at 
org.apache.jena.query.QueryExecutionFactory.make(QueryExecutionFactory.java:620)
        at 
org.apache.jena.query.QueryExecutionFactory.make(QueryExecutionFactory.java:601)
        at 
org.apache.jena.query.QueryExecutionFactory.create(QueryExecutionFactory.java:146)
        at dev.Jena1861_expr_hash.lambda$0(Jena1861_expr_hash.java:78)
{noformat}


was (Author: andy.seaborne):
Queries should be reusable.

The {{ExprDigest}} is suspect 

Query optimization will rewrite the {{SHA256('foo')}} for its constant value.

But the stack I keep getting does not obviously have {{ExprDigest}} as the 
cause. Stacktrace below. 
 Commenting out the cache in {{ExprDigest}} and I get the same basic expection 
situation.

{noformat}
Caused by: java.lang.NullPointerException
        at java.base/java.util.ArrayDeque.addFirst(ArrayDeque.java:287)
        at java.base/java.util.ArrayDeque.push(ArrayDeque.java:580)
        at 
org.apache.jena.sparql.algebra.walker.ApplyTransformVisitor.push(ApplyTransformVisitor.java:447)
        at 
org.apache.jena.sparql.algebra.walker.ApplyTransformVisitor.visit(ApplyTransformVisitor.java:384)
        at 
org.apache.jena.sparql.expr.ExprFunction1.visit(ExprFunction1.java:96)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visitExprFunction(WalkerVisitor.java:265)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visit(WalkerVisitor.java:246)
        at 
org.apache.jena.sparql.expr.ExprFunction1.visit(ExprFunction1.java:96)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:91)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.lambda$1(WalkerVisitor.java:107)
        at org.apache.jena.sparql.core.VarExprList.lambda$0(VarExprList.java:82)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
        at 
org.apache.jena.sparql.core.VarExprList.forEachVarExpr(VarExprList.java:79)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:105)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visitVarExpr(WalkerVisitor.java:121)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.visit(WalkerVisitor.java:213)
        at org.apache.jena.sparql.algebra.op.OpExtend.visit(OpExtend.java:101)
        at 
org.apache.jena.sparql.algebra.walker.WalkerVisitor.walk(WalkerVisitor.java:81)
        at org.apache.jena.sparql.algebra.walker.Walker.walk$(Walker.java:71)
        at org.apache.jena.sparql.algebra.walker.Walker.walk$(Walker.java:62)
        at org.apache.jena.sparql.algebra.walker.Walker.walk(Walker.java:51)
        at 
org.apache.jena.sparql.algebra.walker.Walker.transform(Walker.java:182)
        at 
org.apache.jena.sparql.algebra.walker.Walker.transform(Walker.java:172)
        at 
org.apache.jena.sparql.algebra.Transformer.transformation$(Transformer.java:107)
        at 
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:103)
        at 
org.apache.jena.sparql.algebra.Transformer.transform(Transformer.java:46)
        at 
org.apache.jena.sparql.algebra.optimize.OptimizerStd.transformExprConstantFolding(OptimizerStd.java:180)
        at 
org.apache.jena.sparql.algebra.optimize.OptimizerStd.rewrite(OptimizerStd.java:86)
        at 
org.apache.jena.sparql.algebra.optimize.Optimize.optimize(Optimize.java:67)
        at org.apache.jena.sparql.algebra.Algebra.optimize(Algebra.java:65)
        at 
org.apache.jena.sparql.engine.main.QueryEngineMain.modifyOp(QueryEngineMain.java:69)
        at 
org.apache.jena.sparql.engine.QueryEngineBase.createPlan(QueryEngineBase.java:127)
        at 
org.apache.jena.sparql.engine.QueryEngineBase.getPlan(QueryEngineBase.java:113)
        at 
org.apache.jena.sparql.engine.main.QueryEngineMain$QueryEngineMainFactory.create(QueryEngineMain.java:90)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.getPlan(QueryExecutionBase.java:601)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.startQueryIterator(QueryExecutionBase.java:548)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.execResultSet(QueryExecutionBase.java:591)
        at 
org.apache.jena.sparql.engine.QueryExecutionBase.execSelect(QueryExecutionBase.java:200)
        at dev.Jena1861_expr_hash.lambda$0(Jena1861_expr_hash.java:79)
{noformat}

> Query not thread safe
> ---------------------
>
>                 Key: JENA-1861
>                 URL: https://issues.apache.org/jira/browse/JENA-1861
>             Project: Apache Jena
>          Issue Type: Question
>          Components: ARQ
>    Affects Versions: Jena 3.14.0
>            Reporter: Claus Stadler
>            Priority: Major
>
> Executing the same query object on different RDFConnections is not thread 
> safe:
> I ran into very misleading "NPE in NodeFactory.createLiteral" exceptions when 
> computing SHA256 sums in parallel on different connections backed by 
> different datasets/models using the SAME query object.
> I identified the cause as due to a race condition due to the digestCache used 
> in 
> [ExprDigest|https://github.com/apache/jena/blob/d95b7d295cebaeb2ea41029f4ee7781be94e5e85/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprDigest.java#L33]
> My first question is: Are Query objects - or rather expressions - supposed to 
> carry execution state or is this rather a bug?
> I know that some parts of the Query object, such as result vars, are only 
> initialized on request which makes use of the same Query object in different 
> threads fragile to begin with.
> So my other question is: Given a Query object, is Jena supposed to allow for 
> 'fully initializing' it, such that its execution using Jena's provided 
> facilities (models, datasets, etc) is guaranteed to not modify its state?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to