aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-15 19:30:22 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-15 19:30:22 +0200
commit7c06c952c366deae06c7b138df26debea8a4ebc2 (patch)
treec1055f06a170cc8a6a194eb1acdc93887b0787cb
parentchore(deps): bump dependencies (diff)
downloadrefinery-7c06c952c366deae06c7b138df26debea8a4ebc2.tar.gz
refinery-7c06c952c366deae06c7b138df26debea8a4ebc2.tar.zst
refinery-7c06c952c366deae06c7b138df26debea8a4ebc2.zip
refactor: remove virtual thread support
Java 19 is out of support, but Gradle current does not run on Java 20: https://github.com/gradle/gradle/issues/23488 To avoid the complexity of running the build tool on a different JDK than the application, we temporarily remove code that depends on experimental Java 19 or Java 20 features. Revert once the build can run on Java 20.
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java6
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java4
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java57
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java21
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java9
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java4
6 files changed, 12 insertions, 89 deletions
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
index 12e39e55..b0197c01 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ProblemWebModule.java
@@ -9,13 +9,11 @@
9 */ 9 */
10package tools.refinery.language.web; 10package tools.refinery.language.web;
11 11
12import org.eclipse.xtext.ide.ExecutorServiceProvider;
13import org.eclipse.xtext.web.server.XtextServiceDispatcher; 12import org.eclipse.xtext.web.server.XtextServiceDispatcher;
14import org.eclipse.xtext.web.server.model.IWebDocumentProvider; 13import org.eclipse.xtext.web.server.model.IWebDocumentProvider;
15import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess; 14import org.eclipse.xtext.web.server.model.XtextWebDocumentAccess;
16import org.eclipse.xtext.web.server.occurrences.OccurrencesService; 15import org.eclipse.xtext.web.server.occurrences.OccurrencesService;
17import tools.refinery.language.web.occurrences.ProblemOccurrencesService; 16import tools.refinery.language.web.occurrences.ProblemOccurrencesService;
18import tools.refinery.language.web.xtext.VirtualThreadExecutorServiceProvider;
19import tools.refinery.language.web.xtext.server.push.PushServiceDispatcher; 17import tools.refinery.language.web.xtext.server.push.PushServiceDispatcher;
20import tools.refinery.language.web.xtext.server.push.PushWebDocumentAccess; 18import tools.refinery.language.web.xtext.server.push.PushWebDocumentAccess;
21import tools.refinery.language.web.xtext.server.push.PushWebDocumentProvider; 19import tools.refinery.language.web.xtext.server.push.PushWebDocumentProvider;
@@ -39,8 +37,4 @@ public class ProblemWebModule extends AbstractProblemWebModule {
39 public Class<? extends OccurrencesService> bindOccurrencesService() { 37 public Class<? extends OccurrencesService> bindOccurrencesService() {
40 return ProblemOccurrencesService.class; 38 return ProblemOccurrencesService.class;
41 } 39 }
42
43 public Class<? extends ExecutorServiceProvider> bindExecutorServiceProvider() {
44 return VirtualThreadExecutorServiceProvider.class;
45 }
46} 40}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
index 1924f661..ad19e77d 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
@@ -19,6 +19,7 @@ import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletConta
19import org.eclipse.jetty.server.Server; 19import org.eclipse.jetty.server.Server;
20import org.eclipse.jetty.util.resource.Resource; 20import org.eclipse.jetty.util.resource.Resource;
21import org.eclipse.jetty.util.resource.ResourceFactory; 21import org.eclipse.jetty.util.resource.ResourceFactory;
22import org.eclipse.jetty.util.thread.QueuedThreadPool;
22import org.slf4j.Logger; 23import org.slf4j.Logger;
23import org.slf4j.LoggerFactory; 24import org.slf4j.LoggerFactory;
24import tools.refinery.language.web.config.BackendConfigServlet; 25import tools.refinery.language.web.config.BackendConfigServlet;
@@ -49,7 +50,8 @@ public class ServerLauncher {
49 private final Server server; 50 private final Server server;
50 51
51 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) { 52 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) {
52 server = VirtualThreadUtils.newServerWithVirtualThreadsThreadPool("jetty", bindAddress); 53 server = new Server(bindAddress);
54 ((QueuedThreadPool) server.getThreadPool()).setName("jetty");
53 var handler = new ServletContextHandler(); 55 var handler = new ServletContextHandler();
54 addSessionHandler(handler); 56 addSessionHandler(handler);
55 addProblemServlet(handler, allowedOrigins); 57 addProblemServlet(handler, allowedOrigins);
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
deleted file mode 100644
index 27802e0c..00000000
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
+++ /dev/null
@@ -1,57 +0,0 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web;
7
8import org.eclipse.jetty.server.Server;
9import org.eclipse.jetty.server.ServerConnector;
10import org.eclipse.jetty.util.thread.QueuedThreadPool;
11import org.eclipse.jetty.util.thread.ThreadPool;
12
13import java.net.InetSocketAddress;
14import java.time.Duration;
15import java.util.concurrent.ExecutorService;
16import java.util.concurrent.Executors;
17
18public final class VirtualThreadUtils {
19 private VirtualThreadUtils() {
20 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
21 }
22
23 public static ExecutorService newNamedVirtualThreadsExecutor(String name) {
24 // Based on
25 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
26 return Executors.newThreadPerTaskExecutor(Thread.ofVirtual()
27 .allowSetThreadLocals(true)
28 .inheritInheritableThreadLocals(false)
29 .name(name + "-virtual-", 0)
30 .factory());
31 }
32
33 public static ThreadPool newThreadPoolWithVirtualThreadsExecutor(String name) {
34 // Based on
35 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
36 int timeout = (int) Duration.ofMinutes(1).toMillis();
37 var threadPool = new QueuedThreadPool(200, 10, timeout, -1, null, null);
38 threadPool.setName(name);
39 threadPool.setDetailedDump(false);
40 threadPool.setVirtualThreadsExecutor(newNamedVirtualThreadsExecutor(name));
41 return threadPool;
42 }
43
44 public static Server newServerWithVirtualThreadsThreadPool(String name, InetSocketAddress listenAddress) {
45 var server = new Server(newThreadPoolWithVirtualThreadsExecutor(name));
46 var connector = new ServerConnector(server);
47 try {
48 connector.setHost(listenAddress.getHostName());
49 connector.setPort(listenAddress.getPort());
50 server.addConnector(connector);
51 } catch (Exception e) {
52 connector.close();
53 throw e;
54 }
55 return server;
56 }
57}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
deleted file mode 100644
index 699a09ab..00000000
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.language.web.xtext;
7
8import org.eclipse.xtext.ide.ExecutorServiceProvider;
9import tools.refinery.language.web.VirtualThreadUtils;
10
11import java.util.concurrent.ExecutorService;
12
13public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvider {
14 private static final String THREAD_POOL_NAME = "xtextWeb";
15
16 @Override
17 protected ExecutorService createInstance(String key) {
18 var name = key == null ? THREAD_POOL_NAME : THREAD_POOL_NAME + "-" + key;
19 return VirtualThreadUtils.newNamedVirtualThreadsExecutor(name);
20 }
21}
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
index 53a757eb..40f5281d 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
@@ -17,9 +17,13 @@ import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletConta
17import org.eclipse.jetty.http.HttpHeader; 17import org.eclipse.jetty.http.HttpHeader;
18import org.eclipse.jetty.http.HttpStatus; 18import org.eclipse.jetty.http.HttpStatus;
19import org.eclipse.jetty.server.Server; 19import org.eclipse.jetty.server.Server;
20import org.eclipse.jetty.util.thread.QueuedThreadPool;
20import org.eclipse.xtext.testing.GlobalRegistries; 21import org.eclipse.xtext.testing.GlobalRegistries;
21import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; 22import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
22import org.junit.jupiter.api.*; 23import org.junit.jupiter.api.AfterEach;
24import org.junit.jupiter.api.BeforeEach;
25import org.junit.jupiter.api.Test;
26import org.junit.jupiter.api.TestInfo;
23import org.junit.jupiter.params.ParameterizedTest; 27import org.junit.jupiter.params.ParameterizedTest;
24import org.junit.jupiter.params.provider.ValueSource; 28import org.junit.jupiter.params.provider.ValueSource;
25import tools.refinery.language.web.tests.WebSocketIntegrationTestClient; 29import tools.refinery.language.web.tests.WebSocketIntegrationTestClient;
@@ -193,7 +197,8 @@ class ProblemWebSocketServletIntegrationTest {
193 private void startServer(String allowedOrigins) { 197 private void startServer(String allowedOrigins) {
194 var testName = getClass().getSimpleName() + "-" + testInfo.getDisplayName(); 198 var testName = getClass().getSimpleName() + "-" + testInfo.getDisplayName();
195 var listenAddress = new InetSocketAddress(HOSTNAME, serverPort); 199 var listenAddress = new InetSocketAddress(HOSTNAME, serverPort);
196 server = VirtualThreadUtils.newServerWithVirtualThreadsThreadPool(testName, listenAddress); 200 server = new Server(listenAddress);
201 ((QueuedThreadPool) server.getThreadPool()).setName(testName);
197 var handler = new ServletContextHandler(); 202 var handler = new ServletContextHandler();
198 var holder = new ServletHolder(ProblemWebSocketServlet.class); 203 var holder = new ServletHolder(ProblemWebSocketServlet.class);
199 if (allowedOrigins != null) { 204 if (allowedOrigins != null) {
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
index 630549d4..52acee6d 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
@@ -6,14 +6,14 @@
6package tools.refinery.language.web.tests; 6package tools.refinery.language.web.tests;
7 7
8import com.google.inject.Singleton; 8import com.google.inject.Singleton;
9import tools.refinery.language.web.xtext.VirtualThreadExecutorServiceProvider; 9import org.eclipse.xtext.ide.ExecutorServiceProvider;
10 10
11import java.util.ArrayList; 11import java.util.ArrayList;
12import java.util.List; 12import java.util.List;
13import java.util.concurrent.ExecutorService; 13import java.util.concurrent.ExecutorService;
14 14
15@Singleton 15@Singleton
16public class AwaitTerminationExecutorServiceProvider extends VirtualThreadExecutorServiceProvider { 16public class AwaitTerminationExecutorServiceProvider extends ExecutorServiceProvider {
17 private final List<RestartableCachedThreadPool> servicesToShutDown = new ArrayList<>(); 17 private final List<RestartableCachedThreadPool> servicesToShutDown = new ArrayList<>();
18 18
19 @Override 19 @Override