Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update QueryIteratorWrapper to performClose and performRequestCancel #3080

Merged
merged 1 commit into from
Mar 23, 2025

Conversation

Aklakan
Copy link
Contributor

@Aklakan Aklakan commented Mar 16, 2025

Pull request Description: Fix a rare race condition that can cause a test failure during build. QueryIteratorWrapper is updated to reuse QueryIteratorBase.performClose and performRequestCancel. These methods ensure that the reference to the delegate iterator remains unchanged during the "if not null" check and the subsequent cancel / close action.

Should be unrelated to #3063.

Below is the build error I got for the first time since contributing the TestQueryExecutionCancel test case.

[ERROR] Tests run: 21, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.723 s <<< FAILURE! -- in org.apache.jena.sparql.api.TestQueryExecutionCancel
[ERROR] org.apache.jena.sparql.api.TestQueryExecutionCancel.test_cancel_concurrent_1 -- Time elapsed: 0.091 s <<< ERROR!
java.lang.NullPointerException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:564)
	at java.base/java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:591)
	at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:689)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:765)
	at org.apache.jena.sparql.api.TestQueryExecutionCancel.runConcurrentAbort(TestQueryExecutionCancel.java:385)
	at org.apache.jena.sparql.api.TestQueryExecutionCancel.test_cancel_concurrent(TestQueryExecutionCancel.java:365)
	at org.apache.jena.sparql.api.TestQueryExecutionCancel.test_cancel_concurrent_1(TestQueryExecutionCancel.java:342)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.NullPointerException: Cannot invoke "org.apache.jena.sparql.engine.QueryIterator.cancel()" because "this.iterator" is null
	at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.requestCancel(QueryIteratorWrapper.java:56)
	at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.cancel(QueryIteratorBase.java:212)
	at org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.requestCancel(QueryIteratorWrapper.java:56)
	at org.apache.jena.sparql.engine.iterator.QueryIteratorBase.cancel(QueryIteratorBase.java:212)
	at org.apache.jena.sparql.exec.QueryExecDataset.abort(QueryExecDataset.java:162)
	at org.apache.jena.sparql.exec.QueryExecutionAdapter.abort(QueryExecutionAdapter.java:228)
	at org.apache.jena.sparql.exec.QueryExecutionCompat.abort(QueryExecutionCompat.java:173)
	at org.apache.jena.sparql.api.TestQueryExecutionCancel.lambda$runConcurrentAbort$9(TestQueryExecutionCancel.java:404)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

By submitting this pull request, I acknowledge that I am making a contribution to the Apache Software Foundation under the terms and conditions of the Contributor's Agreement.


See the Apache Jena "Contributing" guide.

@Aklakan Aklakan changed the title Update QueryIteratorWrapper to use performClose and performRequestCan… Update QueryIteratorWrapper to performClose and performRequestCancel Mar 16, 2025
@afs afs self-assigned this Mar 23, 2025
@afs afs merged commit 4fe909b into apache:main Mar 23, 2025
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants