Closed hadrienk closed 4 years ago
Created test with reproduction scenario in my clone: https://github.com/Tomas-Kraus/helidon/tree/ISSUE_2286 To reproduce this case, run
cd <helidon_src>/tests/integration/dbclient
mvn -pl common,jdbc -Pdebug,docker verify -Dit.jdbc.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8787 -Xnoagent -Djava.compiler=NONE" -Dit.jdbc.test='**/BugsIT#testIssue2286'
You need Docker on your machine to run the tests.
Here is some initial analysis:
WARNING: NullPointerException in statement execution:
java.lang.NullPointerException: The CompletionStage completed with a null value
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:76)
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:52)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:95)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:88)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088)
at io.helidon.common.reactive.SingleToFuture.onError(SingleToFuture.java:74)
at io.helidon.common.reactive.DeferredScalarSubscription.error(DeferredScalarSubscription.java:163)
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:70)
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:52)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:95)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:88)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088)
at io.helidon.common.reactive.SingleToOptionalFuture.onError(SingleToOptionalFuture.java:70)
at io.helidon.common.reactive.SingleFromPublisher$SingleSubscriber.onError(SingleFromPublisher.java:75)
at io.helidon.common.reactive.SingleFlatMapMulti$FlatMapSubscriber$InnerSubscriber.onError(SingleFlatMapMulti.java:165)
at io.helidon.common.reactive.SingleFlatMapMulti$FlatMapSubscriber$InnerSubscriber.onError(SingleFlatMapMulti.java:165)
at io.helidon.common.reactive.SingleFlatMapMulti$FlatMapSubscriber.onError(SingleFlatMapMulti.java:102)
at io.helidon.common.reactive.DeferredScalarSubscription.error(DeferredScalarSubscription.java:163)
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:70)
at io.helidon.common.reactive.MultiFromCompletionStage$CompletionStageSubscription.accept(MultiFromCompletionStage.java:52)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:95)
at io.helidon.common.reactive.MultiFromCompletionStage$AtomicBiConsumer.accept(MultiFromCompletionStage.java:88)
at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088)
at io.helidon.dbclient.jdbc.JdbcStatementQuery.lambda$doExecute$2(JdbcStatementQuery.java:116)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
io.helidon.common.reactive.SingleToFuture.onError(SingleToFuture.java:74)
still contains proper exception instance. But it's lost in CompletableFuture above it in stack.
Environment Details
Problem Description
When using
inTransaction()
, if an error occurs the Single/Multi fails with a NullPointerException.Fails every time.
Steps to reproduce
Complete stacktrace: