Skip to content

IllegalStateException when pooled Oracle connection used on other context #1147

@tsegismont

Description

@tsegismont

When an Oracle pooled connection is created on a specific context, and then later another context uses it for query, an IllegalStateException is thrown:

java.lang.IllegalStateException
	at io.vertx.oracleclient.impl.CommandHandler.afterAcquire(CommandHandler.java:88)
	at io.vertx.oracleclient.spi.OracleDriver.lambda$newPoolImpl$1(OracleDriver.java:60)
	at io.vertx.sqlclient.impl.pool.SqlConnectionPool.lambda$execute$5(SqlConnectionPool.java:161)
	at io.vertx.core.impl.future.Composition.onSuccess(Composition.java:38)
	at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
	at io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:196)
	at io.vertx.core.impl.future.PromiseImpl.addListener(PromiseImpl.java:23)
	at io.vertx.core.impl.future.FutureBase.compose(FutureBase.java:84)
	at io.vertx.core.impl.future.PromiseImpl.compose(PromiseImpl.java:23)
	at io.vertx.core.Future.compose(Future.java:199)
	at io.vertx.sqlclient.impl.pool.SqlConnectionPool.execute(SqlConnectionPool.java:157)
	at io.vertx.sqlclient.impl.PoolImpl.schedule(PoolImpl.java:161)
	at io.vertx.sqlclient.impl.QueryExecutor.executeSimpleQuery(QueryExecutor.java:93)
	at io.vertx.sqlclient.impl.SqlClientBase$QueryImpl.execute(SqlClientBase.java:120)
	at io.vertx.sqlclient.impl.SqlClientBase$QueryImpl.execute(SqlClientBase.java:109)

Reproducer:

  @Test
  public void testDirectQueryFromDuplicatedContext(TestContext ctx) {
    OraclePool pool = createPool(options, new PoolOptions().setMaxSize(1));
    Async async = ctx.async();
    vertx.runOnContext(v1 -> {
      ContextInternal current = (ContextInternal) Vertx.currentContext();
      pool.query("SELECT 1 FROM DUAL").execute(ctx.asyncAssertSuccess(res1 -> {
        ctx.assertTrue(Vertx.currentContext() == current);
        ContextInternal duplicated = current.duplicate();
        duplicated.runOnContext(v2 -> {
          pool.query("SELECT 1 FROM DUAL").execute(ctx.asyncAssertSuccess(res2 -> {
            ctx.assertTrue(Vertx.currentContext() == duplicated);
            async.complete();
          }));
        });
      }));
    });
  }

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions