Skip to content

ClassCastException in ReactiveAbstractSelectionQuery #1682

Closed
@oleg-alexeyev

Description

@oleg-alexeyev

We're observing the following exception:

java.lang.ClassCastException: class java.lang.IllegalAccessError cannot be cast to class java.lang.RuntimeException (java.lang.IllegalAccessError and java.lang.RuntimeException are in module java.base of loader 'bootstrap')
13:13:43     at org.hibernate.reactive.query.spi.ReactiveAbstractSelectionQuery.convertException(ReactiveAbstractSelectionQuery.java:193)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.uniExceptionally(CompletableFuture.java:990)
13:13:43     at java.base/java.util.concurrent.CompletableFuture$UniExceptionally.tryFire(CompletableFuture.java:974)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
13:13:43     at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:131)
13:13:43     at org.hibernate.reactive.util.async.impl.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:126)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
13:13:43     at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
13:13:43     at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
13:13:43     at io.vertx.core.Future.lambda$toCompletionStage$3(Future.java:536)
13:13:43     at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
13:13:43     at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
13:13:43     at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
13:13:43     at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:88)
13:13:43     at io.vertx.sqlclient.impl.QueryResultBuilder.tryComplete(QueryResultBuilder.java:32)
13:13:43     at io.vertx.core.Promise.complete(Promise.java:66)
13:13:43     at io.vertx.core.Promise.handle(Promise.java:51)
13:13:43     at io.vertx.core.Promise.handle(Promise.java:29)
13:13:43     at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
13:13:43     at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
13:13:43     at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41)
13:13:43     at io.vertx.sqlclient.impl.TransactionImpl.lambda$wrap$0(TransactionImpl.java:72)
13:13:43     at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
13:13:43     at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
13:13:43     at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
13:13:43     at io.vertx.core.impl.future.Transformation$1.onSuccess(Transformation.java:63)
13:13:43     at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
13:13:43     at io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:196)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.addListener(PromiseImpl.java:23)
13:13:43     at io.vertx.core.impl.future.Transformation.onSuccess(Transformation.java:44)
13:13:43     at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
13:13:43     at io.vertx.core.impl.EventLoopContext.execute(EventLoopContext.java:86)
13:13:43     at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:163)
13:13:43     at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:51)
13:13:43     at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.onSuccess(PromiseImpl.java:49)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:41)
13:13:43     at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23)
13:13:43     at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46)
13:13:43     at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:325)
13:13:43     at io.vertx.pgclient.impl.PgSocketConnection.handleMessage(PgSocketConnection.java:118)
13:13:43     at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:138)
13:13:43     at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:55)
13:13:43     at io.vertx.core.impl.ContextBase.emit(ContextBase.java:239)
13:13:43     at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:378)
13:13:43     at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:158)
13:13:43     at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:153)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
13:13:43     at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
13:13:43     at io.vertx.pgclient.impl.codec.PgEncoder.lambda$write$0(PgEncoder.java:100)
13:13:43     at io.vertx.pgclient.impl.codec.PgCommandCodec.handleReadyForQuery(PgCommandCodec.java:139)
13:13:43     at io.vertx.pgclient.impl.codec.PgDecoder.decodeReadyForQuery(PgDecoder.java:237)
13:13:43     at io.vertx.pgclient.impl.codec.PgDecoder.channelRead(PgDecoder.java:96)
13:13:43     at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
13:13:43     at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
13:13:43     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
13:13:43     at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
13:13:43     at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
13:13:43     at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
13:13:43     at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
13:13:43     at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
13:13:43     at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
13:13:43     at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
13:13:43     at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
13:13:43     at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
13:13:43     at java.base/java.lang.Thread.run(Thread.java:831)

Unfortunately it's not clear how to reproduce this. But it's evident that the following code doesn't account for java.lang.Error subclasses:

	private R convertException(Throwable t) {
		if ( t instanceof CompletionException ) {
			t = t.getCause();
		}
		if ( t instanceof HibernateException ) {
			throw getSession().getExceptionConverter().convert( (HibernateException) t, getLockOptions() );
		}
		throw getSession().getExceptionConverter().convert( (RuntimeException) t, getLockOptions() );
	}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions