Skip to content

Commit c75ded8

Browse files
committed
Start Testcontainers containers with the Platform CL as TCCL
Testcontainers start several long lived threads (Ryuk reaper, ducttape), and if the TCCL is one of the QuarkusClassLoader, we end up leaking the class loaders. Using the Platform CL makes sure we don't leak any QuarkusClassLoader via these threads. The observability containers have not been adjusted as they are a bit of a weird beast and not worth having a look in the scope of this experiment.
1 parent 53e9c49 commit c75ded8

File tree

18 files changed

+43
-17
lines changed

18 files changed

+43
-17
lines changed

extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.testcontainers.containers.Db2Container;
1414
import org.testcontainers.utility.DockerImageName;
1515

16+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1617
import io.quarkus.datasource.common.runtime.DataSourceUtil;
1718
import io.quarkus.datasource.common.runtime.DatabaseKind;
1819
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
@@ -65,7 +66,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6566
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6667
containerConfig.getCommand().ifPresent(container::setCommand);
6768
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
68-
container.start();
69+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
6970

7071
LOG.info("Dev Services for IBM Db2 started.");
7172

extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.testcontainers.containers.MariaDBContainer;
1414
import org.testcontainers.utility.DockerImageName;
1515

16+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1617
import io.quarkus.datasource.common.runtime.DataSourceUtil;
1718
import io.quarkus.datasource.common.runtime.DatabaseKind;
1819
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
@@ -74,7 +75,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
7475
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
7576
containerConfig.getCommand().ifPresent(container::setCommand);
7677
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
77-
container.start();
78+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
7879

7980
LOG.info("Dev Services for MariaDB started.");
8081

extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.testcontainers.containers.MSSQLServerContainer;
1212
import org.testcontainers.utility.DockerImageName;
1313

14+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1415
import io.quarkus.datasource.common.runtime.DatabaseKind;
1516
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
1617
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
@@ -66,7 +67,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6667
containerConfig.getCommand().ifPresent(container::setCommand);
6768
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6869

69-
container.start();
70+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
7071

7172
LOG.info("Dev Services for Microsoft SQL Server started.");
7273

extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.testcontainers.containers.MySQLContainer;
1414
import org.testcontainers.utility.DockerImageName;
1515

16+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1617
import io.quarkus.datasource.common.runtime.DataSourceUtil;
1718
import io.quarkus.datasource.common.runtime.DatabaseKind;
1819
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
@@ -74,7 +75,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
7475
containerConfig.getCommand().ifPresent(container::setCommand);
7576
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
7677

77-
container.start();
78+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
7879

7980
LOG.info("Dev Services for MySQL started.");
8081

extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.testcontainers.containers.OracleContainer;
1414
import org.testcontainers.utility.DockerImageName;
1515

16+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1617
import io.quarkus.datasource.common.runtime.DataSourceUtil;
1718
import io.quarkus.datasource.common.runtime.DatabaseKind;
1819
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
@@ -80,7 +81,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
8081
containerConfig.getCommand().ifPresent(container::setCommand);
8182
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
8283

83-
container.start();
84+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
8485

8586
LOG.info("Dev Services for Oracle started.");
8687

extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
1717
import org.testcontainers.utility.DockerImageName;
1818

19+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
1920
import io.quarkus.datasource.common.runtime.DataSourceUtil;
2021
import io.quarkus.datasource.common.runtime.DatabaseKind;
2122
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
@@ -77,7 +78,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
7778
containerConfig.getCommand().ifPresent(container::setCommand);
7879
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
7980

80-
container.start();
81+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
8182

8283
LOG.info("Dev Services for PostgreSQL started.");
8384

extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevServicesElasticsearchProcessor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.testcontainers.elasticsearch.ElasticsearchContainer;
1818
import org.testcontainers.utility.DockerImageName;
1919

20+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
2021
import io.quarkus.builder.BuildException;
2122
import io.quarkus.deployment.Feature;
2223
import io.quarkus.deployment.IsNormal;
@@ -208,7 +209,8 @@ private DevServicesResultBuildItem.RunningDevService startElasticsearchDevServic
208209

209210
container.withReuse(config.reuse);
210211

211-
container.start();
212+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
213+
212214
return new DevServicesResultBuildItem.RunningDevService(Feature.ELASTICSEARCH_REST_CLIENT_COMMON.getName(),
213215
container.getContainerId(),
214216
new ContainerShutdownCloseable(container, "Elasticsearch"),

extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/devservices/InfinispanDevServiceProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.jboss.logging.Logger;
2121
import org.testcontainers.containers.BindMode;
2222

23+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
2324
import io.quarkus.deployment.Feature;
2425
import io.quarkus.deployment.IsNormal;
2526
import io.quarkus.deployment.annotations.BuildStep;
@@ -212,7 +213,7 @@ private RunningDevService startContainer(String clientName, DockerStatusBuildIte
212213
useSharedNetwork);
213214
timeout.ifPresent(infinispanContainer::withStartupTimeout);
214215
infinispanContainer.withEnv(devServicesConfig.containerEnv);
215-
infinispanContainer.start();
216+
QuarkusClassLoader.runWithPlatformClassLoader(infinispanContainer::start);
216217

217218
return getRunningDevService(clientName, infinispanContainer.getContainerId(), infinispanContainer::close,
218219
infinispanContainer.getHost() + ":" + infinispanContainer.getPort(),

extensions/kubernetes-client/deployment/src/main/java/io/quarkus/kubernetes/client/deployment/DevServicesKubernetesProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.github.dockerjava.api.command.InspectContainerResponse;
4242

4343
import io.fabric8.kubernetes.client.Config;
44+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
4445
import io.quarkus.deployment.Feature;
4546
import io.quarkus.deployment.IsNormal;
4647
import io.quarkus.deployment.annotations.BuildStep;
@@ -229,7 +230,7 @@ private RunningDevService startKubernetes(DockerStatusBuildItem dockerStatusBuil
229230

230231
container.withEnv(config.containerEnv);
231232

232-
container.start();
233+
QuarkusClassLoader.runWithPlatformClassLoader(container::start);
233234

234235
KubeConfig kubeConfig = KubeConfigUtils.parseKubeConfig(container.getKubeconfig());
235236

extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/DevServicesMongoProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.message.BasicNameValuePair;
2222
import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.net.URLEncodedUtils;
2323

24+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
2425
import io.quarkus.deployment.Feature;
2526
import io.quarkus.deployment.IsNormal;
2627
import io.quarkus.deployment.annotations.BuildStep;
@@ -188,7 +189,7 @@ private RunningDevService startMongo(DockerStatusBuildItem dockerStatusBuildItem
188189
}
189190
timeout.ifPresent(mongoDBContainer::withStartupTimeout);
190191
mongoDBContainer.withEnv(capturedProperties.containerEnv);
191-
mongoDBContainer.start();
192+
QuarkusClassLoader.runWithPlatformClassLoader(mongoDBContainer::start);
192193

193194
final String effectiveUrl = getEffectiveUrl(configPrefix, mongoDBContainer.getEffectiveHost(),
194195
mongoDBContainer.getEffectivePort(), capturedProperties);

0 commit comments

Comments
 (0)