From 04663a72f038cf923daa912db68148899f181dd5 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Wed, 24 Jun 2020 23:52:37 +0300 Subject: [PATCH] Revert "Reactive sql client pool in thread local" --- .../DataSourceReactiveRuntimeConfig.java | 6 -- .../datasource/runtime/ThreadLocalPool.java | 91 ------------------- .../db2/client/runtime/DB2PoolRecorder.java | 4 - .../client/runtime/ThreadLocalDB2Pool.java | 22 ----- .../client/runtime/MySQLPoolRecorder.java | 4 - .../client/runtime/ThreadLocalMySQLPool.java | 22 ----- .../pg/client/runtime/PgPoolRecorder.java | 4 - .../pg/client/runtime/ThreadLocalPgPool.java | 22 ----- integration-tests/reactive-pg-client/pom.xml | 10 -- .../pg/client/HotReloadFruitResource.java | 53 ----------- .../reactive/pg/client/HotReloadTestCase.java | 75 --------------- .../test/resources/application-tl.properties | 6 -- .../io/quarkus/test/QuarkusDevModeTest.java | 19 ---- 13 files changed, 338 deletions(-) delete mode 100644 extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ThreadLocalPool.java delete mode 100644 extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/ThreadLocalDB2Pool.java delete mode 100644 extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/ThreadLocalMySQLPool.java delete mode 100644 extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/ThreadLocalPgPool.java delete mode 100644 integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadFruitResource.java delete mode 100644 integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadTestCase.java delete mode 100644 integration-tests/reactive-pg-client/src/test/resources/application-tl.properties diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java index e527466abe325..709d06a23dcaf 100644 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java +++ b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/DataSourceReactiveRuntimeConfig.java @@ -88,10 +88,4 @@ public class DataSourceReactiveRuntimeConfig { */ @ConfigItem public PfxConfiguration keyCertificatePfx; - - /** - * Experimental: use one connection pool per thread. - */ - @ConfigItem - public Optional threadLocal; } diff --git a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ThreadLocalPool.java b/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ThreadLocalPool.java deleted file mode 100644 index 5617ff96d3fb3..0000000000000 --- a/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ThreadLocalPool.java +++ /dev/null @@ -1,91 +0,0 @@ -package io.quarkus.reactive.datasource.runtime; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; - -import org.jboss.logging.Logger; - -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.core.Vertx; -import io.vertx.sqlclient.Pool; -import io.vertx.sqlclient.PoolOptions; -import io.vertx.sqlclient.PreparedQuery; -import io.vertx.sqlclient.Query; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowSet; -import io.vertx.sqlclient.SqlConnection; -import io.vertx.sqlclient.Transaction; - -public abstract class ThreadLocalPool implements Pool { - - private static final Logger log = Logger.getLogger(ThreadLocalPool.class); - - private final AtomicReference> pool = new AtomicReference<>(new ThreadLocal<>()); - private static final List threadLocalPools = new ArrayList<>(); - - protected final PoolOptions poolOptions; - protected final Vertx vertx; - - public ThreadLocalPool(Vertx vertx, PoolOptions poolOptions) { - this.vertx = vertx; - this.poolOptions = poolOptions; - } - - private PoolType pool() { - ThreadLocal poolThreadLocal = pool.get(); - PoolType ret = poolThreadLocal.get(); - if (ret == null) { - log.debugf("Making pool for thread: %s", Thread.currentThread()); - ret = createThreadLocalPool(); - synchronized (threadLocalPools) { - threadLocalPools.add(ret); - } - poolThreadLocal.set(ret); - } - return ret; - } - - protected abstract PoolType createThreadLocalPool(); - - @Override - public void getConnection(Handler> handler) { - pool().getConnection(handler); - } - - @Override - public Query> query(String sql) { - return pool().query(sql); - } - - @Override - public PreparedQuery> preparedQuery(String sql) { - return pool().preparedQuery(sql); - } - - @Override - public void begin(Handler> handler) { - pool().begin(handler); - } - - /** - * This is a bit weird because it works on all ThreadLocal pools, but it's only - * called from a single thread, when doing shutdown, and needs to close all the - * pools and reinitialise the thread local so that all newly created pools after - * the restart will start with an empty thread local instead of a closed one. - */ - @Override - public void close() { - // close all the thread-local pools - synchronized (threadLocalPools) { - for (Pool pool : threadLocalPools) { - log.debugf("Closing pool: %s", pool); - pool.close(); - } - threadLocalPools.clear(); - } - // discard the TL to clear them all - pool.set(new ThreadLocal()); - } -} diff --git a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java index c26b5dd0ef737..092134f90e202 100644 --- a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java +++ b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/DB2PoolRecorder.java @@ -46,10 +46,6 @@ private DB2Pool initialize(Vertx vertx, DataSourceRuntimeConfig dataSourceRuntim dataSourceReactiveDB2Config); DB2ConnectOptions connectOptions = toConnectOptions(dataSourceRuntimeConfig, dataSourceReactiveRuntimeConfig, dataSourceReactiveDB2Config); - if (dataSourceReactiveRuntimeConfig.threadLocal.isPresent() && - dataSourceReactiveRuntimeConfig.threadLocal.get()) { - return new ThreadLocalDB2Pool(vertx, connectOptions, poolOptions); - } return DB2Pool.pool(vertx, connectOptions, poolOptions); } diff --git a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/ThreadLocalDB2Pool.java b/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/ThreadLocalDB2Pool.java deleted file mode 100644 index a9b6b6fd6ef24..0000000000000 --- a/extensions/reactive-db2-client/runtime/src/main/java/io/quarkus/reactive/db2/client/runtime/ThreadLocalDB2Pool.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.quarkus.reactive.db2.client.runtime; - -import io.quarkus.reactive.datasource.runtime.ThreadLocalPool; -import io.vertx.core.Vertx; -import io.vertx.db2client.DB2ConnectOptions; -import io.vertx.db2client.DB2Pool; -import io.vertx.sqlclient.PoolOptions; - -public class ThreadLocalDB2Pool extends ThreadLocalPool implements DB2Pool { - - private final DB2ConnectOptions db2ConnectOptions; - - public ThreadLocalDB2Pool(Vertx vertx, DB2ConnectOptions db2ConnectOptions, PoolOptions poolOptions) { - super(vertx, poolOptions); - this.db2ConnectOptions = db2ConnectOptions; - } - - @Override - protected DB2Pool createThreadLocalPool() { - return DB2Pool.pool(vertx, db2ConnectOptions, poolOptions); - } -} diff --git a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java index 6a16b2c184cdd..f906ce8dd6a34 100644 --- a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java +++ b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/MySQLPoolRecorder.java @@ -68,10 +68,6 @@ private MySQLPool initialize(Vertx vertx, DataSourceRuntimeConfig dataSourceRunt dataSourceReactiveMySQLConfig); MySQLConnectOptions mysqlConnectOptions = toMySQLConnectOptions(dataSourceRuntimeConfig, dataSourceReactiveRuntimeConfig, dataSourceReactiveMySQLConfig); - if (dataSourceReactiveRuntimeConfig.threadLocal.isPresent() && - dataSourceReactiveRuntimeConfig.threadLocal.get()) { - return new ThreadLocalMySQLPool(vertx, mysqlConnectOptions, poolOptions); - } return MySQLPool.pool(vertx, mysqlConnectOptions, poolOptions); } diff --git a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/ThreadLocalMySQLPool.java b/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/ThreadLocalMySQLPool.java deleted file mode 100644 index a6ed317e8fbb4..0000000000000 --- a/extensions/reactive-mysql-client/runtime/src/main/java/io/quarkus/reactive/mysql/client/runtime/ThreadLocalMySQLPool.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.quarkus.reactive.mysql.client.runtime; - -import io.quarkus.reactive.datasource.runtime.ThreadLocalPool; -import io.vertx.core.Vertx; -import io.vertx.mysqlclient.MySQLConnectOptions; -import io.vertx.mysqlclient.MySQLPool; -import io.vertx.sqlclient.PoolOptions; - -public class ThreadLocalMySQLPool extends ThreadLocalPool implements MySQLPool { - - private final MySQLConnectOptions mySQLConnectOptions; - - public ThreadLocalMySQLPool(Vertx vertx, MySQLConnectOptions mySQLConnectOptions, PoolOptions poolOptions) { - super(vertx, poolOptions); - this.mySQLConnectOptions = mySQLConnectOptions; - } - - @Override - protected MySQLPool createThreadLocalPool() { - return MySQLPool.pool(vertx, mySQLConnectOptions, poolOptions); - } -} diff --git a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java index 70e6b8a0f9b45..dcf0c1568c766 100644 --- a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java +++ b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/PgPoolRecorder.java @@ -68,10 +68,6 @@ private PgPool initialize(Vertx vertx, DataSourceRuntimeConfig dataSourceRuntime dataSourceReactivePostgreSQLConfig); PgConnectOptions pgConnectOptions = toPgConnectOptions(dataSourceRuntimeConfig, dataSourceReactiveRuntimeConfig, dataSourceReactivePostgreSQLConfig); - if (dataSourceReactiveRuntimeConfig.threadLocal.isPresent() && - dataSourceReactiveRuntimeConfig.threadLocal.get()) { - return new ThreadLocalPgPool(vertx, pgConnectOptions, poolOptions); - } return PgPool.pool(vertx, pgConnectOptions, poolOptions); } diff --git a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/ThreadLocalPgPool.java b/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/ThreadLocalPgPool.java deleted file mode 100644 index d5e5e9e86c5f5..0000000000000 --- a/extensions/reactive-pg-client/runtime/src/main/java/io/quarkus/reactive/pg/client/runtime/ThreadLocalPgPool.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.quarkus.reactive.pg.client.runtime; - -import io.quarkus.reactive.datasource.runtime.ThreadLocalPool; -import io.vertx.core.Vertx; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; -import io.vertx.sqlclient.PoolOptions; - -public class ThreadLocalPgPool extends ThreadLocalPool implements PgPool { - - private final PgConnectOptions pgConnectOptions; - - public ThreadLocalPgPool(Vertx vertx, PgConnectOptions pgConnectOptions, PoolOptions poolOptions) { - super(vertx, poolOptions); - this.pgConnectOptions = pgConnectOptions; - } - - @Override - protected PgPool createThreadLocalPool() { - return PgPool.pool(vertx, pgConnectOptions, poolOptions); - } -} diff --git a/integration-tests/reactive-pg-client/pom.xml b/integration-tests/reactive-pg-client/pom.xml index 81e304f65c6af..a04e31ab58d87 100644 --- a/integration-tests/reactive-pg-client/pom.xml +++ b/integration-tests/reactive-pg-client/pom.xml @@ -38,11 +38,6 @@ quarkus-junit5 test - - io.quarkus - quarkus-junit5-internal - test - io.rest-assured rest-assured @@ -56,11 +51,6 @@ src/main/resources true - - src/test/resources - true - ../test-classes - diff --git a/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadFruitResource.java b/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadFruitResource.java deleted file mode 100644 index 17a2937681a6c..0000000000000 --- a/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadFruitResource.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.quarkus.it.reactive.pg.client; - -import java.util.concurrent.CompletionStage; - -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.mutiny.pgclient.PgPool; -import io.vertx.mutiny.sqlclient.Row; - -@Path("/hot-fruits") -public class HotReloadFruitResource { - - @Inject - PgPool client; - - @PostConstruct - void setupDb() { - client.query("DROP TABLE IF EXISTS fruits").execute() - .flatMap(r -> client.query("CREATE TABLE fruits (id SERIAL PRIMARY KEY, name TEXT NOT NULL)").execute()) - .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Orange')").execute()) - .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Pear')").execute()) - .flatMap(r -> client.query("INSERT INTO fruits (name) VALUES ('Apple')").execute()) - .await().indefinitely(); - } - - @GET - @Produces(MediaType.APPLICATION_JSON) - public CompletionStage listFruits() { - return client.query("SELECT * FROM fruits").execute() - .map(pgRowSet -> { - JsonArray jsonArray = new JsonArray(); - for (Row row : pgRowSet) { - jsonArray.add(toJson(row)); - } - return jsonArray; - }) - .subscribeAsCompletionStage(); - } - - private JsonObject toJson(Row row) { - return new JsonObject() - .put("id", row.getLong("id")) - .put("name", row.getString("name")); - } - -} diff --git a/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadTestCase.java b/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadTestCase.java deleted file mode 100644 index 87c4ade5abecb..0000000000000 --- a/integration-tests/reactive-pg-client/src/test/java/io/quarkus/it/reactive/pg/client/HotReloadTestCase.java +++ /dev/null @@ -1,75 +0,0 @@ -package io.quarkus.it.reactive.pg.client; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsString; - -import java.util.List; -import java.util.function.Function; -import java.util.logging.LogRecord; - -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -import io.quarkus.test.QuarkusDevModeTest; - -public class HotReloadTestCase { - @RegisterExtension - final static QuarkusDevModeTest TEST = new QuarkusDevModeTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addClasses(HotReloadFruitResource.class) - .addAsResource("application-tl.properties", "application.properties")) - .setLogRecordPredicate(record -> { - return record.getLoggerName().startsWith("io.quarkus.reactive.datasource"); - }); - - @AfterAll - public static void afterAll() { - List records = TEST.getLogRecords(); - Assertions.assertEquals(8, records.size()); - // make sure that we closed all thread-local pools on reload and close - Assertions.assertEquals("Making pool for thread: %s", records.get(0).getMessage()); - Assertions.assertEquals("Making pool for thread: %s", records.get(1).getMessage()); - Assertions.assertEquals("Closing pool: %s", records.get(2).getMessage()); - Assertions.assertEquals("Closing pool: %s", records.get(3).getMessage()); - Assertions.assertEquals("Making pool for thread: %s", records.get(4).getMessage()); - Assertions.assertEquals("Making pool for thread: %s", records.get(5).getMessage()); - Assertions.assertEquals("Closing pool: %s", records.get(6).getMessage()); - Assertions.assertEquals("Closing pool: %s", records.get(7).getMessage()); - } - - @Test - public void testAddNewFieldToEntity() { - checkRequest("Orange"); - TEST.modifySourceFile(HotReloadFruitResource.class, new Function() { - @Override - public String apply(String s) { - return s.replace("'Orange'", "'Strawberry'"); - } - }); - // trigger a pool hot reload by changing the config - TEST.modifyResourceFile("application.properties", new Function() { - @Override - public String apply(String s) { - return s.replace("quarkus.datasource.reactive.thread-local=true", - "quarkus.datasource.reactive.thread-local = true"); - } - }); - - checkRequest("Strawberry"); - } - - private void checkRequest(String fruit) { - given() - .when().get("/hot-fruits") - .then() - .statusCode(200) - .body( - containsString(fruit), - containsString("Pear"), - containsString("Apple")); - } -} diff --git a/integration-tests/reactive-pg-client/src/test/resources/application-tl.properties b/integration-tests/reactive-pg-client/src/test/resources/application-tl.properties deleted file mode 100644 index 54e42ebfd6ceb..0000000000000 --- a/integration-tests/reactive-pg-client/src/test/resources/application-tl.properties +++ /dev/null @@ -1,6 +0,0 @@ -quarkus.datasource.db-kind=postgresql -quarkus.datasource.username=hibernate_orm_test -quarkus.datasource.password=hibernate_orm_test -quarkus.datasource.reactive.url=${reactive-postgres.url} -quarkus.datasource.reactive.thread-local=true -quarkus.log.category."io.quarkus.reactive.datasource".level=DEBUG diff --git a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java index c06aafeb2b99b..41554726513d3 100644 --- a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java +++ b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java @@ -17,13 +17,9 @@ import java.util.List; import java.util.ServiceLoader; import java.util.function.Function; -import java.util.function.Predicate; import java.util.function.Supplier; import java.util.jar.Attributes; import java.util.jar.Manifest; -import java.util.logging.LogManager; -import java.util.logging.LogRecord; -import java.util.logging.Logger; import java.util.stream.Stream; import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; @@ -62,18 +58,14 @@ public class QuarkusDevModeTest implements BeforeEachCallback, AfterEachCallback, TestInstanceFactory { - private static final Logger rootLogger; - static { System.setProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager"); - rootLogger = LogManager.getLogManager().getLogger(""); } private DevModeMain devModeMain; private Path deploymentDir; private Supplier archiveProducer; private String logFileName; - private InMemoryLogHandler inMemoryLogHandler = new InMemoryLogHandler((r) -> false); private Path deploymentSourcePath; private Path deploymentResourcePath; @@ -105,15 +97,6 @@ public QuarkusDevModeTest setLogFileName(String logFileName) { return this; } - public QuarkusDevModeTest setLogRecordPredicate(Predicate predicate) { - this.inMemoryLogHandler = new InMemoryLogHandler(predicate); - return this; - } - - public List getLogRecords() { - return inMemoryLogHandler.records; - } - public Object createTestInstance(TestInstanceFactoryContext factoryContext, ExtensionContext extensionContext) throws TestInstantiationException { try { @@ -127,7 +110,6 @@ public Object createTestInstance(TestInstanceFactoryContext factoryContext, Exte @Override public void beforeEach(ExtensionContext extensionContext) throws Exception { - rootLogger.addHandler(inMemoryLogHandler); if (archiveProducer == null) { throw new RuntimeException("QuarkusDevModeTest does not have archive producer set"); } @@ -192,7 +174,6 @@ public void afterEach(ExtensionContext extensionContext) throws Exception { FileUtil.deleteDirectory(deploymentDir); } } - rootLogger.removeHandler(inMemoryLogHandler); } private DevModeContext exportArchive(Path deploymentDir, Path testSourceDir) {