From c78820bcb9214aa40077db026b93b7d5a80dce1e Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Mon, 30 Sep 2024 07:44:46 +0200 Subject: [PATCH 1/2] fix: replace virtual thread executor for http request processing --- .../ext/modules/rest/config/RestConfiguration.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java b/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java index 365f15f7..fd5eceb8 100644 --- a/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java +++ b/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java @@ -17,6 +17,7 @@ package eu.cloudnetservice.ext.modules.rest.config; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import eu.cloudnetservice.ext.rest.api.config.ComponentConfig; import eu.cloudnetservice.ext.rest.api.config.CorsConfig; import eu.cloudnetservice.ext.rest.api.config.HttpProxyMode; @@ -31,6 +32,7 @@ public record RestConfiguration( int maxContentLength, + int requestDispatchThreadLimit, boolean disableNativeTransport, @NonNull CorsConfig corsConfig, @NonNull HttpProxyMode proxyMode, @@ -42,6 +44,7 @@ public record RestConfiguration( public static final RestConfiguration DEFAULT = new RestConfiguration( ComponentConfig.DEFAULT_MAX_CONTENT_LENGTH, + 50, false, CorsConfig.builder() .addAllowedOrigin("*") @@ -70,6 +73,11 @@ public void validate() { } public @NonNull ComponentConfig toComponentConfig() { + var requestDispatchThreadFactory = new ThreadFactoryBuilder() + .setDaemon(true) + .setPriority(Thread.NORM_PRIORITY) + .setNameFormat("rest-request-dispatcher-%d") + .build(); return ComponentConfig.builder() .corsConfig(this.corsConfig) .haProxyMode(this.proxyMode) @@ -77,7 +85,7 @@ public void validate() { .sslConfiguration(this.sslConfiguration) .disableNativeTransport(this.disableNativeTransport) .connectionInfoResolver(this.httpConnectionInfoResolver()) - .executorService(Executors.newVirtualThreadPerTaskExecutor()) + .executorService(Executors.newFixedThreadPool(this.requestDispatchThreadLimit, requestDispatchThreadFactory)) .build(); } From ce6c40f70b7edcb42a5ebdf2ddd4cd0e2808f50f Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Mon, 7 Oct 2024 20:20:39 +0200 Subject: [PATCH 2/2] use custom cached thread pool --- .../ext/modules/rest/config/RestConfiguration.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java b/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java index fd5eceb8..0b2d426b 100644 --- a/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java +++ b/cloudnet-rest-module/src/main/java/eu/cloudnetservice/ext/modules/rest/config/RestConfiguration.java @@ -26,7 +26,9 @@ import eu.cloudnetservice.ext.rest.api.connection.HttpConnectionInfoResolver; import eu.cloudnetservice.ext.rest.api.util.HostAndPort; import java.util.List; -import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import lombok.NonNull; import org.jetbrains.annotations.Nullable; @@ -78,14 +80,22 @@ public void validate() { .setPriority(Thread.NORM_PRIORITY) .setNameFormat("rest-request-dispatcher-%d") .build(); + var requestDispatchExecutor = new ThreadPoolExecutor( + 1, + this.requestDispatchThreadLimit, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue<>(), + requestDispatchThreadFactory); + return ComponentConfig.builder() .corsConfig(this.corsConfig) .haProxyMode(this.proxyMode) .maxContentLength(this.maxContentLength) .sslConfiguration(this.sslConfiguration) + .executorService(requestDispatchExecutor) .disableNativeTransport(this.disableNativeTransport) .connectionInfoResolver(this.httpConnectionInfoResolver()) - .executorService(Executors.newFixedThreadPool(this.requestDispatchThreadLimit, requestDispatchThreadFactory)) .build(); }