quarkus icon indicating copy to clipboard operation
quarkus copied to clipboard

Error under load "Detected use of the reactive Session from a different Thread..."

Open mklueh opened this issue 3 years ago • 14 comments

Describe the bug

I'm using the reactive dependencies and I'm running into a use case, where I need to store events asynchronously when my REST endpoint gets hit, without blocking the REST call and delaying the response.

I thought, well, that's easy. Just use SmallRye Emitter, fire an event and the consumer should handle the storing, while the REST call returns the response. Easier said than done, I'm not getting this simple-sounding example to work without this error when I run a load test with up to 20 req/s (error happens much earlier).

2022-01-31 21:02:35,054 ERROR [com.exa.MyService] (vert.x-eventloop-thread-12) Failed to store event: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread: 'vert.x-eventloop-thread-11' current Thread: 'vert.x-eventloop-thread-12'
	at org.hibernate.reactive.common.InternalStateAssertions.assertCurrentThreadMatches(InternalStateAssertions.java:46)
	at org.hibernate.reactive.session.impl.ReactiveSessionImpl.threadCheck(ReactiveSessionImpl.java:154)
	at org.hibernate.reactive.session.impl.ReactiveSessionImpl.checkOpen(ReactiveSessionImpl.java:1557)
	at org.hibernate.internal.SessionImpl.contains(SessionImpl.java:2004)
	at org.hibernate.reactive.mutiny.impl.MutinySessionImpl.contains(MutinySessionImpl.java:104)
	at io.quarkus.hibernate.reactive.runtime.ReactiveSessionProducer_ProducerMethod_createMutinySession_1321d110ee9e92bda147899150401e0a136779c7_ClientProxy.contains(Unknown Source)
	at io.quarkus.hibernate.reactive.panache.common.runtime.AbstractJpaOperations.lambda$persist$1(AbstractJpaOperations.java:76)
	at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:68)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.forward(UniCreateFromKnownItem.java:38)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.access$100(UniCreateFromKnownItem.java:26)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem.subscribe(UniCreateFromKnownItem.java:23)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni.subscribe(UniOnItemTransformToUni.java:25)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransform.subscribe(UniOnItemTransform.java:22)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.forward(UniCreateFromKnownItem.java:38)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.access$100(UniCreateFromKnownItem.java:26)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem.subscribe(UniCreateFromKnownItem.java:23)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni.subscribe(UniOnItemTransformToUni.java:25)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemConsume.subscribe(UniOnItemConsume.java:30)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.groups.UniSubscribe.withSubscriber(UniSubscribe.java:50)
	at io.smallrye.mutiny.groups.UniSubscribe.with(UniSubscribe.java:111)
	at com.example.MyService.fireForget(MyService.java:20)
	at com.example.MyService_Subclass.fireForget$$superforward1(Unknown Source)
	at com.example.MyService_Subclass$$function$$1.apply(Unknown Source)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
	at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62)
	at io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49)
	at io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(Unknown Source)
	at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
	at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
	at com.example.MyService_Subclass.fireForget(Unknown Source)
	at com.example.MyService_ClientProxy.fireForget(Unknown Source)
	at com.example.MyService_SmallRyeMessagingInvoker_fireForget_f43d24ab1056a056837479d09bdcf5dd34fec4eb.invoke(Unknown Source)
	at io.smallrye.reactive.messaging.providers.AbstractMediator.invoke(AbstractMediator.java:91)
	at io.smallrye.reactive.messaging.providers.SubscriberMediator.lambda$processMethodReturningVoid$6(SubscriberMediator.java:171)
	at io.smallrye.context.impl.wrappers.SlowContextualSupplier.get(SlowContextualSupplier.java:21)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromItemSupplier.subscribe(UniCreateFromItemSupplier.java:28)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap.subscribe(UniOnItemOrFailureFlatMap.java:27)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.converters.uni.UniToMultiPublisher$UniToMultiSubscription.request(UniToMultiPublisher.java:63)
	at io.smallrye.mutiny.operators.multi.MultiFlatMapOp$FlatMapInner.onSubscribe(MultiFlatMapOp.java:591)
	at io.smallrye.mutiny.converters.uni.UniToMultiPublisher.subscribe(UniToMultiPublisher.java:24)
	at io.smallrye.mutiny.groups.MultiCreate$1.subscribe(MultiCreate.java:161)
	at io.smallrye.mutiny.operators.multi.MultiFlatMapOp$FlatMapMainSubscriber.onItem(MultiFlatMapOp.java:191)
	at io.smallrye.mutiny.operators.multi.MultiMapOp$MapProcessor.onItem(MultiMapOp.java:50)
	at io.smallrye.mutiny.subscription.MultiSubscriber.onNext(MultiSubscriber.java:61)
	at io.smallrye.mutiny.subscription.SafeSubscriber.onNext(SafeSubscriber.java:98)
	at io.smallrye.mutiny.helpers.HalfSerializer.onNext(HalfSerializer.java:31)
	at io.smallrye.mutiny.helpers.StrictMultiSubscriber.onItem(StrictMultiSubscriber.java:83)
	at io.smallrye.mutiny.operators.multi.MultiOperatorProcessor.onItem(MultiOperatorProcessor.java:89)
	at io.smallrye.mutiny.operators.multi.builders.BufferItemMultiEmitter.drain(BufferItemMultiEmitter.java:118)
	at io.smallrye.mutiny.operators.multi.builders.BufferItemMultiEmitter.emit(BufferItemMultiEmitter.java:34)
	at io.smallrye.mutiny.operators.multi.builders.SerializedMultiEmitter.onItem(SerializedMultiEmitter.java:49)
	at io.smallrye.mutiny.operators.multi.builders.SerializedMultiEmitter.emit(SerializedMultiEmitter.java:139)
	at io.smallrye.reactive.messaging.providers.extension.ThrowingEmitter.emit(ThrowingEmitter.java:63)
	at io.smallrye.reactive.messaging.providers.extension.AbstractEmitter.emit(AbstractEmitter.java:161)
	at io.smallrye.reactive.messaging.providers.extension.EmitterImpl.send(EmitterImpl.java:29)
	at com.example.ExampleResource.lambda$callFetchEntityAndGreetAndLog$2(ExampleResource.java:45)
	at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
	at io.smallrye.mutiny.groups.UniOnItem.lambda$call$2(UniOnItem.java:79)
	at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:68)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:60)
	at io.smallrye.mutiny.operators.uni.builders.DefaultUniEmitter.complete(DefaultUniEmitter.java:36)
	at io.smallrye.mutiny.groups.UniOnNull.lambda$failWith$1(UniOnNull.java:46)
	at io.smallrye.context.impl.wrappers.SlowContextualBiConsumer.accept(SlowContextualBiConsumer.java:21)
	at io.smallrye.mutiny.groups.UniOnItem.lambda$transformToUni$4(UniOnItem.java:178)
	at io.smallrye.context.impl.wrappers.SlowContextualConsumer.accept(SlowContextualConsumer.java:21)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateWithEmitter.subscribe(UniCreateWithEmitter.java:22)
	at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
	at io.smallrye.mutiny.operators.uni.UniOnItemConsume$UniOnItemComsumeProcessor.onItem(UniOnItemConsume.java:43)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:60)
	at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:43)
	at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onItem(UniOperatorProcessor.java:40)
	at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage$CompletionStageUniSubscription.forwardResult(UniCreateFromCompletionStage.java:63)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
	at io.vertx.core.Future.lambda$toCompletionStage$2(Future.java:360)
	at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
	at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
	at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
	at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
	at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:102)
	at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:35)
	at io.vertx.core.Promise.complete(Promise.java:66)
	at io.vertx.core.Promise.handle(Promise.java:51)
	at io.vertx.core.Promise.handle(Promise.java:29)
	at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
	at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:833)

Reactive programming is relatively new to me, so it just could be that I'm missing something obvious I have overlooked in the examples.

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

https://github.com/mklueh/quarkus-reproducer-reactive-hibernate-smallrye-messaging

I've created two load-testing scripts that are using k6 in Docker to test both endpoints. Both will fail.

  1. test-call.sh
  2. test-invoke.sh

Does not matter which, both lead to the same error.

Output of uname -a or ver

No response

Output of java -version

No response

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.6.3

Build tool (ie. output of mvnw --version or gradlew --version)

No response

Additional information

No response

mklueh avatar Jan 31 '22 20:01 mklueh

/cc @DavideD, @Sanne, @gavinking

quarkus-bot[bot] avatar Feb 01 '22 06:02 quarkus-bot[bot]

Thanks for the report! We'll have a look. I didn't check the details but I suspect it might relate to #23300 - let's fix that one first, then verify.

Sanne avatar Feb 01 '22 15:02 Sanne

I am facing exact same issue when load testing my quarkus application. My application is very similar to this quickstart project - https://github.com/quarkusio/quarkus-quickstarts/tree/main/hibernate-reactive-panache-quickstart. Is there any workaround until https://github.com/quarkusio/quarkus/issues/23300 is fixed?

sunildparte avatar Feb 03 '22 00:02 sunildparte

I am facing exact same issue when load testing my quarkus application. My application is very similar to this quickstart project - https://github.com/quarkusio/quarkus-quickstarts/tree/main/hibernate-reactive-panache-quickstart. Is there any workaround until #23300 is fixed?

I've described the "workaround" for that issue on it:

  • https://github.com/quarkusio/quarkus/issues/23300#issuecomment-1028935528

Sanne avatar Feb 03 '22 12:02 Sanne

I was running into this problem again, but it seems that it is working at some places, and at others it is not.

workaround:

instead of

FileRef fileRef = new FileRef();

Uni<PanacheEntityBase>  uni = Panache.withTransaction(fileRef::persist)

//or

Uni<FileRef>  uni = Panache.withTransaction(()->fileRefRepository.persist(fileRef))

using this

FileRef fileRef = new FileRef();

Uni<FileRef> uni = sessionFactory.withTransaction(session -> session.persist(fileRef).onItem().transform(unused -> fileRef));

The workaround really helps, but is there any progress with this issue so far already @Sanne ?

mklueh avatar Feb 13 '22 19:02 mklueh

hi @mklueh in that particular case I suspect you're hitting a very similar issue (but not the same) with scopes in reactive messaging. This should be fixed in Quarkus 2.7.2 - could you try it?

Sanne avatar Feb 22 '22 18:02 Sanne

Hello @Sanne with the quarkus 2.7.5 Final we still facing this issue under load. Especially directly after quarkus startup. Without high load it works fine. We are using reactive-hibernate with Postgres We are using following approach: Panache.withTransaction {entity.persist()} Using sessionFactory.withTransaction works also not. The same exception is thrown: Failed to store event: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread: 'vert.x-eventloop-thread-11' current Thread: 'vert.x-eventloop-thread-12'

bartwinski avatar Mar 29 '22 08:03 bartwinski

Is there any update on this topic? Do I have to wrap every method that operates on the database with Panache. WithTransaction? Reactive Hibernate is not stable, and often causes errors.The quarkus version I use is 2.8.2.final.

zuochangqin avatar May 10 '22 01:05 zuochangqin

Let me explain, Hibernate Reactive by design requires all operations to be executed from the same thread.

The exception "java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than ..." literally means that we've detected illegal use of it, and we're throwing an exception on purpose so that integration problems can be detected (such integration problems would otherwise most likely lead to more serious issues, such as data inconsistencies being written).

If you have such issues, you're using it in the wrong context. If you can't strictly guarantee that your application is fully reactive and that each transaction is constrained within the same unique thread, you shouldn't use it; consider using Hiberante ORM blocking, which is more suited for non-blocking designs.

The reason Panache.withTransaction helps is because it offloads the entire "work" definition onto a vert.x worker thread; so even if you were running it on the wrong thread it will first switch to the right thread, then execute it correctly. This is not optimal in terms of efficiency, but helps straighetning integration with other components.

Also, please use the Mutiny based API of Hibernate Reactive. When using CompletionStage it gets surprisingly tricky to get the threading model correct.

Reactive Hibernate is not stable, and often causes errors.

Well as I mentioned we throw these exceptions on purpose - not because it's unstable but most likely because it's not being used correctly.

I'll have another look at the reproducer of this issue - pretty sure something is wrong in the integration. Other people commenting here... please open a different issue and attach a reproducer, I can't help you otherwise - sorry :/

Sanne avatar May 10 '22 08:05 Sanne

I've tested the original testcase with Quarkus 2.9.2 and I cannot see the error anymore.

Still, I'm not sure how one is supposed to implement this use-case.

This is what the test case is trying to achieve:

  1. Http get to a Rest service
  2. The service look for an entity in the db by id
  3. When the entity is found emit an event in a channel
  4. The service listening to the channel will create a new event in the db

Point 4 is implemented this way:

@Slf4j
@ApplicationScoped
public class MyService {

    @Incoming(Event.FIRE_AND_FORGET)
    public void fireForget(Event event) {
        Panache.withTransaction(event::persist)
                .onFailure().invoke(throwable -> log.error("Failed to store event", throwable))
                .subscribe().with(panacheEntityBase -> {
                });
    }
}

Is this the right approach to use?

When I've upgraded to Quarkus 2.9.2 I had to add @ActivateRequestContext :

@Slf4j
@ApplicationScoped
@ActivateRequestContext 
public class MyService {

    @Incoming(Event.FIRE_AND_FORGET)
    public void fireForget(Event event) {
		Panache.withTransaction( event::persist )
				.onFailure().invoke( throwable -> log.error( "Failed to store event", throwable ) )
				.subscribe().with( System.out::println, System.err::println );
    }
}

I'm asking because it doesn't seem to work and I get the error

2022-05-26 13:43:02,487 ERROR [com.exa.MyService] (vert.x-eventloop-thread-1) Failed to store event: java.lang.IllegalStateException: HR000060: Session is closed                                                    

I think the error the issue is referring to has been solved but it would be nice to fix the testcase so that it works

DavideD avatar May 26 '22 12:05 DavideD

"workaround" you can try:

  • in application properties set quarkus.vertx.event-loops-pool-size=1
  • or disable state assertions for you own risk System.setProperty("org.hibernate.reactive.common.InternalStateAssertions.ENFORCE", "false")

inngvar avatar Sep 19 '22 13:09 inngvar

I'm not sure that's the right approach. Probably, the session closed error happens because the session is closed when returning from fireAndForget. But because the content is async, it might happen that it's closed too soon, before withTransaction is even executed.

I think a better solution would is to use the Hibernate Session factory directly. But I need to test it.

DavideD avatar Sep 20 '22 07:09 DavideD

If I use the Hibernate Reactive session factory, I see this error:

022-09-20 09:01:03,807 ERROR [org.jbo.res.rea.com.cor.AbstractResteasyReactiveContext] (vert.x-eventloop-thread-2) Request failed: java.lang.IllegalStateException: The current operation requires a safe (isolated) Vert.x sub-context, but the current context hasn't been flagged as such. You can still use Hibernate Reactive, you just need to avoid using the methods which implicitly require accessing the stateful context, such as MutinySessionFactory#withTransaction and #withSession.
        at io.quarkus.vertx.core.runtime.context.VertxContextSafetyToggle.checkIsSafe(VertxContextSafetyToggle.java:89)
        at io.quarkus.vertx.core.runtime.context.VertxContextSafetyToggle.validateContextIfExists(VertxContextSafetyToggle.java:72)
        at io.quarkus.hibernate.reactive.runtime.customized.CheckingVertxContext.get(CheckingVertxContext.java:46)
        at org.hibernate.reactive.mutiny.impl.MutinySessionFactoryImpl.withSession(MutinySessionFactoryImpl.java:189)

DavideD avatar Sep 20 '22 08:09 DavideD

This implementation should work though:

@Slf4j
@ApplicationScoped
public class MyService {

    @Inject
    Mutiny.SessionFactory sf;

    @Incoming(Event.FIRE_AND_FORGET)
    public void fireForget(Event event) {
        sf.openSession().chain(session -> session
                        .withTransaction( tx -> session.persist( event ) )
                        .eventually( session::close )
                )
                .onFailure().invoke(throwable -> log.error("Failed to store event", throwable))
                .subscribe().with(panacheEntityBase -> {
                });
    }
}

DavideD avatar Sep 20 '22 08:09 DavideD

Hi. I am facing the same issue. I am currently using 2.16.5.Final. in new versions is this solved? or I have to go with some kind of blocking operation as suggested.

kavishkamk avatar Aug 23 '23 08:08 kavishkamk

@kavishkamk I would suggest to upgrade and test the application with the latest version

DavideD avatar Aug 24 '23 12:08 DavideD

Same error with "delete", OpenJDK 21

        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.4.3</quarkus.platform.version>
        <surefire-plugin.version>3.1.2</surefire-plugin.version>
        <compiler-plugin.version>3.11.0</compiler-plugin.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <assertj.version>3.22.0</assertj.version>

Steps to reproduce: git clone https://github.com/quarkusio/quarkus-quickstarts && cd quarkus-quickstarts/hibernate-reactive-panache-quickstart

add more samples in import.sql

INSERT INTO fruit(id, name) VALUES (1, 'Cherry');
INSERT INTO fruit(id, name) VALUES (2, 'Apple');
INSERT INTO fruit(id, name) VALUES (3, 'Banana');
INSERT INTO fruit(id, name) VALUES (4, 'Banana1');
INSERT INTO fruit(id, name) VALUES (5, 'Banana2');
INSERT INTO fruit(id, name) VALUES (6, 'Banana3');
INSERT INTO fruit(id, name) VALUES (7, 'Banana4');
INSERT INTO fruit(id, name) VALUES (8, 'Banana5');
INSERT INTO fruit(id, name) VALUES (9, 'Banana6');
INSERT INTO fruit(id, name) VALUES (10, 'Banana7');
INSERT INTO fruit(id, name) VALUES (11, 'Banana8');
INSERT INTO fruit(id, name) VALUES (12, 'Banana9');
INSERT INTO fruit(id, name) VALUES (13, 'Banana11');
INSERT INTO fruit(id, name) VALUES (14, 'Banana12');
INSERT INTO fruit(id, name) VALUES (15, 'Banana14');
INSERT INTO fruit(id, name) VALUES (16, 'Banana15');
INSERT INTO fruit(id, name) VALUES (17, 'Banana16');
INSERT INTO fruit(id, name) VALUES (18, 'Banana17');
INSERT INTO fruit(id, name) VALUES (19, 'Banana88');
ALTER SEQUENCE fruit_seq RESTART WITH 20;

Start server: mvn quarkus:dev

run test:

for i in {1..19}
 do
curl -X DELETE "http://localhost:8080/fruits/${i}"&
done

Result:

$ /bin/bash quarkus-quickstarts/hibernate-reactive-panache-quickstart/delete.sh
$ {"exceptionType":"org.hibernate.HibernateException","code":500,"error":"java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [138]: 'vert.x-eventloop-thread-3' current Thread [137]: 'vert.x-eventloop-thread-2'"}

and server exception:

Hibernate: 
    select
        f1_0.id,
        f1_0.name 
    from
        Fruit f1_0 
    where
        f1_0.id=$1

2023-10-16 04:18:18,103 ERROR [org.acm.hib.orm.pan.FruitResource] (vert.x-eventloop-thread-3) Failed to handle request: org.hibernate.HibernateException: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [138]: 'vert.x-eventloop-thread-3' current Thread [137]: 'vert.x-eventloop-thread-2'
        at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:28)
        at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$doFlush$27(ReactiveSessionImpl.java:994)
        at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
        at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
        at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:131)
        at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:126)
        at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
        at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
        at org.hibernate.reactive.persister.entity.mutation.ReactiveDeleteCoordinator.complete(ReactiveDeleteCoordinator.java:198)
        at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
        at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
        at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2179)
        at io.vertx.core.Future.lambda$toCompletionStage$3(Future.java:536)
        at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
        at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
        at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
        at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
        at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:88)
        at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:32)
        at io.vertx.core.Promise.complete(Promise.java:66)
        at io.vertx.core.Promise.handle(Promise.java:51)
        at io.vertx.core.Promise.handle(Promise.java:29)
        at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
        at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
        at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
        at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
        at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49)
        at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41)
        at io.vertx.sqlclient.impl.TransactionImpl.lambda$wrap$0(TransactionImpl.java:72)
        at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
        at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
        at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [138]: 'vert.x-eventloop-thread-3' current Thread [137]: 'vert.x-eventloop-thread-2'
        at org.hibernate.reactive.common.InternalStateAssertions.assertCurrentThreadMatches(InternalStateAssertions.java:46)
        at org.hibernate.reactive.session.impl.ReactiveSessionImpl.threadCheck(ReactiveSessionImpl.java:183)
        at org.hibernate.reactive.session.impl.ReactiveSessionImpl.checkOpen(ReactiveSessionImpl.java:1670)
        at org.hibernate.internal.AbstractSharedSessionContract.checkOpenOrWaitingForAutoClose(AbstractSharedSessionContract.java:447)
        at org.hibernate.internal.SessionImpl.checkOpenOrWaitingForAutoClose(SessionImpl.java:616)
        at org.hibernate.internal.SessionImpl.getPersistenceContext(SessionImpl.java:1825)
        at org.hibernate.reactive.event.impl.AbstractReactiveFlushingEventListener.lambda$performExecutions$0(AbstractReactiveFlushingEventListener.java:65)
        at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
        at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
        ... 40 more

devorgpl avatar Oct 16 '23 02:10 devorgpl

Exception is random. This workaround seems to work:

@Entity
@Cacheable
@NamedQueries({
        @NamedQuery(name = "Fruit.deleteById", query = "delete from Fruit p where p.id = ?1")
})
public class Fruit extends PanacheEntity {
[...]
    public static Uni<Boolean> deleteById(Long id) {
        return delete("#Fruit.deleteById", id).map(t -> t > 0);
    }
}

devorgpl avatar Oct 16 '23 02:10 devorgpl

I have the same problem. Simply performance testing the repository "deleteById" method, which is autogenerated by quarkus throws this error. If I replace the implementation with the code below, then delete works as it should (thanks @devorgpl, I have no idea how you managed to discover this). This tells me the problem seems to be in quarkus panache implementation itself. Debugging this is a real PITA.

override fun deleteById(id: UUID): Uni<Boolean> {
    return delete("id = ?1", id).map { result -> result > 0 }
}

zivkovic avatar Oct 23 '23 12:10 zivkovic

I'm not sure why it fails, but using @WithTransaction seems to fix the issue:

    @DELETE
    @Path("{id}")
    @WithTransaction
    public Uni<Response> delete(Long id) {
        return Fruit.deleteById(id)
                .map(deleted -> deleted
                        ? Response.ok().status(NO_CONTENT).build()
                        : Response.ok().status(NOT_FOUND).build());
    }

I'm still looking into this though

DavideD avatar Oct 30 '23 10:10 DavideD

Nevermind, using the annotation doesn't solve the issue

DavideD avatar Oct 30 '23 12:10 DavideD

@mkouba I think we might need your help with this issue

DavideD avatar Oct 30 '23 15:10 DavideD

@mkouba I think we might need your help with this issue

@DavideD I'm not sure I will be of any help here - the stack trace from the hibernate-reactive-panache-quickstart does not contain anything related to HR Panache. Am I missing somethig?

mkouba avatar Oct 31 '23 08:10 mkouba

I don't think it's Panache, but it seems that the session is created in one thread and then used in another. I was wondering if you might have some word of wisdom, or maybe there's an annotation that I'm not aware about that could help.

DavideD avatar Oct 31 '23 08:10 DavideD

I don't think it's Panache, but it seems that the session is created in one thread and then used in another. I was wondering if you might have some word of wisdom, or maybe there's an annotation that I'm not aware about that could help.

I'm not aware of any annotation that could help here. It seems that the session is opened on the thread that handles the request, in this particular case on the thread that executed the FruitResource.delete() method. But for some reason the flush operation seems to be executed on a different thread...

mkouba avatar Oct 31 '23 09:10 mkouba

I wonder if it's because the deleteById is split into a find and then a delete operation, instead of being a single one. Anyway, I will continue looking.

DavideD avatar Oct 31 '23 09:10 DavideD

I wonder if it's because the deleteById is split into a find and then a delete operation, instead of being a single one. Anyway, I will continue looking.

Well, it should not be a problem since the operations are executed within a single transaction, right?

mkouba avatar Oct 31 '23 10:10 mkouba

Yes, it shouldn't. Unless we are missing something.

DavideD avatar Oct 31 '23 10:10 DavideD

Same problem here fun getAllPets(): Uni<List<PetDTO>> { logger.info { "operation=getAllPetsBegin, layer=service" } val criteriaBuilder = sessionFactory.criteriaBuilder val query = criteriaBuilder.createQuery(PetDTO::class.java) //for some reason, root query must be specified, even if not unused val root = query.from(PetDTO::class.java) return sessionFactory.withSession { session -> logger.info { "operation=getAllPetsBegin, layer=hibernate" } session.createQuery(query).resultList .onItem().ifNull().continueWith{listOf(PetDTO())} .onItem().call(session::flush) .also { logger.info { "operation=getAllPetsEnd, layer=hibernate, result=complete" } } }.also { logger.info { "operation=getAllPetsEnd, layer=service" } } }

Dependencies: vertx-stack-depchain:4.1.8 hibernate-reactive-core:2.0.6.Final

ErrorStack: 2023-11-07T08:43:19.502Z INFO 1 --- [ntloop-thread-0] com.sgc.appd.vertxdemo.PetService : operation=getAllPetsEnd, layer=hibernate, result=complete [Hibernate] select p1_0.id,p1_0.name,p1_0.type from PetDTO p1_0 2023-11-07T08:43:19.504Z INFO 1 --- [ntloop-thread-0] com.sgc.appd.vertxdemo.PetHandlers : operation=getAllEnd, layer=handler [-- Mutiny had to drop the following exception --] Exception received by: io.smallrye.mutiny.infrastructure.Infrastructure.handleDroppedException(Infrastructure.java:295) io.smallrye.mutiny.CompositeException: Multiple exceptions caught: [Exception 0] java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [40]: 'vert.x-eventloop-thread-0' current Thread [47]: 'vert.x-eventloop-thread-1' [Exception 1] java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [40]: 'vert.x-eventloop-thread-0' current Thread [47]: 'vert.x-eventloop-thread-1' at io.smallrye.mutiny.groups.UniOnItemOrFailure.lambda$call$1(UniOnItemOrFailure.java:75) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap$UniOnItemOrFailureFlatMapProcessor.performInnerSubscription(UniOnItemOrFailureFlatMap.java:86) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap$UniOnItemOrFailureFlatMapProcessor.onFailure(UniOnItemOrFailureFlatMap.java:65) at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:55) at io.smallrye.mutiny.helpers.EmptyUniSubscription.propagateFailureEvent(EmptyUniSubscription.java:40) at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage.subscribe(UniCreateFromCompletionStage.java:26) at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.lambda$subscribe$0(UniRunSubscribeOn.java:27) at org.hibernate.reactive.context.impl.VertxContext.execute(VertxContext.java:91) at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.subscribe(UniRunSubscribeOn.java:25) at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap.subscribe(UniOnItemOrFailureFlatMap.java:27) at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap$UniOnItemOrFailureFlatMapProcessor.performInnerSubscription(UniOnItemOrFailureFlatMap.java:99) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureFlatMap$UniOnItemOrFailureFlatMapProcessor.onFailure(UniOnItemOrFailureFlatMap.java:65) at io.smallrye.mutiny.operators.uni.UniOnItemOrFailureConsume$UniOnItemOrFailureConsumeProcessor.onFailure(UniOnItemOrFailureConsume.java:46) at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:55) at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:55) at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:55) at io.smallrye.mutiny.operators.uni.UniOperatorProcessor.onFailure(UniOperatorProcessor.java:55) at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage$CompletionStageUniSubscription.forwardResult(UniCreateFromCompletionStage.java:58) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162) at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:123) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) at io.vertx.core.Future.lambda$toCompletionStage$2(Future.java:360) at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141) at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60) at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211) at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23) at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:102) at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:35) at io.vertx.core.Promise.complete(Promise.java:66) at io.vertx.core.Promise.handle(Promise.java:51) at io.vertx.core.Promise.handle(Promise.java:29) at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141) at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60) at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211) at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23) at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49) at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41) at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23) at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46) at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:287) at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:99) at io.vertx.core.net.impl.NetSocketImpl.lambda$new$1(NetSocketImpl.java:97) at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:240) at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:130) at io.vertx.core.net.impl.NetSocketImpl.lambda$handleMessage$9(NetSocketImpl.java:390) at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:50) at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:274) at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:22) at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:389) at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:155) at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:154) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.vertx.mssqlclient.impl.codec.TdsMessageEncoder.lambda$write$0(TdsMessageEncoder.java:63) at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.complete(MSSQLCommandCodec.java:199) at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.handleDecodingComplete(MSSQLCommandCodec.java:189) at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.decode(MSSQLCommandCodec.java:83) at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decodeMessage(TdsMessageDecoder.java:65) at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.channelRead(TdsMessageDecoder.java:43) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1371) at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1234) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1283) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:507) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:446) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:833) Suppressed: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [40]: 'vert.x-eventloop-thread-0' current Thread [47]: 'vert.x-eventloop-thread-1' at org.hibernate.reactive.common.InternalStateAssertions.assertCurrentThreadMatches(InternalStateAssertions.java:46) at org.hibernate.reactive.session.impl.ReactiveSessionImpl.threadCheck(ReactiveSessionImpl.java:183) at org.hibernate.reactive.session.impl.ReactiveSessionImpl.checkOpen(ReactiveSessionImpl.java:1670) at org.hibernate.internal.AbstractSharedSessionContract.checkOpenOrWaitingForAutoClose(AbstractSharedSessionContract.java:447) at org.hibernate.internal.SessionImpl.checkOpenOrWaitingForAutoClose(SessionImpl.java:616) at org.hibernate.internal.SessionImpl.closeWithoutOpenChecks(SessionImpl.java:410) at org.hibernate.internal.SessionImpl.close(SessionImpl.java:397) at org.hibernate.reactive.session.impl.ReactiveSessionImpl.reactiveClose(ReactiveSessionImpl.java:1622) at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage.subscribe(UniCreateFromCompletionStage.java:24) ... 95 more Caused by: java.lang.IllegalStateException: HR000069: Detected use of the reactive Session from a different Thread than the one which was used to open the reactive Session - this suggests an invalid integration; original thread [40]: 'vert.x-eventloop-thread-0' current Thread [47]: 'vert.x-eventloop-thread-1' at org.hibernate.reactive.common.InternalStateAssertions.assertCurrentThreadMatches(InternalStateAssertions.java:46) at org.hibernate.reactive.session.impl.ReactiveSessionImpl.threadCheck(ReactiveSessionImpl.java:183) at org.hibernate.reactive.session.impl.ReactiveSessionImpl.checkOpen(ReactiveSessionImpl.java:1670) at org.hibernate.internal.AbstractSharedSessionContract.checkOpenOrWaitingForAutoClose(AbstractSharedSessionContract.java:447) at org.hibernate.internal.SessionImpl.checkOpenOrWaitingForAutoClose(SessionImpl.java:616) at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1464) at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.instantiateEntity(AbstractEntityInitializer.java:687) at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveEntityInstance(AbstractEntityInitializer.java:680) at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveInstance(AbstractEntityInitializer.java:646) at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveEntityInstance(AbstractEntityInitializer.java:537) at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveInstance(AbstractEntityInitializer.java:397) at org.hibernate.reactive.sql.results.graph.entity.ReactiveAbstractEntityInitializer.reactiveResolveInstance(ReactiveAbstractEntityInitializer.java:79) at org.hibernate.reactive.sql.results.internal.ReactiveInitializersList.lambda$resolveInstances$1(ReactiveInitializersList.java:86) at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$2(CompletionStages.java:178) at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$7(CompletionStages.java:417) at org.hibernate.reactive.util.impl.CompletionStages$ArrayLoop.next(CompletionStages.java:491) at org.hibernate.reactive.util.async.impl.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:215) at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:121) at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:102) at org.hibernate.reactive.util.async.impl.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:197) at org.hibernate.reactive.util.async.impl.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:215) at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:418) at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:389) at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:178) at org.hibernate.reactive.sql.results.internal.ReactiveInitializersList.resolveInstances(ReactiveInitializersList.java:84) at org.hibernate.reactive.sql.results.internal.ReactiveStandardRowReader.coordinateInitializers(ReactiveStandardRowReader.java:125) at org.hibernate.reactive.sql.results.internal.ReactiveStandardRowReader.reactiveReadRow(ReactiveStandardRowReader.java:59) at org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.lambda$addToResultsSupplier$5(ReactiveListResultsConsumer.java:134) at org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.lambda$consume$1(ReactiveListResultsConsumer.java:108) at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ... 73 more [------------------------------------------------] java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:833)

DavidMachacek avatar Nov 07 '23 11:11 DavidMachacek