[
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)