diff --git a/Dockerfile b/Dockerfile index 7451201..80d1070 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ COPY assembly/jar-with-dependencies.xml assembly/ # https://issues.apache.org/jira/browse/MDEP-689 #RUN mvn -B -T 4 dependency:go-offline -RUN mvn -B -T 4 compile -Dorg.slf4j.simpleLogger.defaultLogLevel=ERROR -Dmaven.test.skip=true -Dmaven.site.skip=true -Dmaven.source.skip=true -Dmaven.javadoc.skip=true +RUN mvn -B -T 4 -pl '!modules/client' compile -Dorg.slf4j.simpleLogger.defaultLogLevel=ERROR -Dmaven.test.skip=true -Dmaven.site.skip=true -Dmaven.source.skip=true -Dmaven.javadoc.skip=true FROM app-deps AS app-build @@ -33,13 +33,12 @@ COPY modules/tftp modules/tftp COPY modules/common modules/common COPY modules/lib modules/lib COPY modules/parsers modules/parsers -COPY modules/client modules/client COPY modules/vclu modules/vclu COPY .git .git -RUN mvn -B -T 4 clean package -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -Dmaven.test.skip=true -Dmaven.site.skip=true -Dmaven.source.skip=true -Dmaven.javadoc.skip=true +RUN mvn -B -T 4 -pl '!modules/client' clean package -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -Dmaven.test.skip=true -Dmaven.site.skip=true -Dmaven.source.skip=true -Dmaven.javadoc.skip=true -FROM --platform=$BUILDPLATFORM eclipse-temurin:21 AS jre-build +FROM --platform=$BUILDPLATFORM eclipse-temurin:21-alpine AS jre-build RUN mkdir -p /opt/build WORKDIR /opt/build @@ -55,7 +54,7 @@ RUN $JAVA_HOME/bin/jlink \ --compress=2 \ --output /opt/build/jre -FROM --platform=$BUILDPLATFORM ubuntu:22.04 AS app-runtime +FROM --platform=$BUILDPLATFORM alpine:latest AS app-runtime ENV JAVA_HOME=/opt/java/openjdk ENV PATH "${JAVA_HOME}/bin:${PATH}" diff --git a/modules/common/src/main/java/pl/psobiech/opengr8on/util/ThreadUtil.java b/modules/common/src/main/java/pl/psobiech/opengr8on/util/ThreadUtil.java index 3484fce..d6f2a6f 100644 --- a/modules/common/src/main/java/pl/psobiech/opengr8on/util/ThreadUtil.java +++ b/modules/common/src/main/java/pl/psobiech/opengr8on/util/ThreadUtil.java @@ -237,7 +237,8 @@ public static ExecutorService daemonExecutor(String name) { * @return true, if JVM version has fixed JDK-8312166 (>= 21.0.2+2) */ public static boolean supportsNonBlockingDatagramSockets() { - return Runtime.version().compareTo(JVM_VERSION_NON_BLOCKING_DATAGRAM_SOCKET) >= 0; + return Runtime.version() + .compareTo(JVM_VERSION_NON_BLOCKING_DATAGRAM_SOCKET) >= 0; } /** diff --git a/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/RemoteCLU.java b/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/RemoteCLU.java index b48ecf5..4398e16 100644 --- a/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/RemoteCLU.java +++ b/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/RemoteCLU.java @@ -19,6 +19,8 @@ package pl.psobiech.opengr8on.vclu.system.objects; import java.net.Inet4Address; +import java.util.Optional; +import java.util.concurrent.ExecutionException; import org.apache.commons.lang3.StringUtils; import org.luaj.vm2.Globals; @@ -29,7 +31,10 @@ import org.slf4j.LoggerFactory; import pl.psobiech.opengr8on.client.CLUClient; import pl.psobiech.opengr8on.client.CipherKey; +import pl.psobiech.opengr8on.exceptions.UncheckedInterruptedException; +import pl.psobiech.opengr8on.exceptions.UnexpectedException; import pl.psobiech.opengr8on.util.IOUtil; +import pl.psobiech.opengr8on.util.ThreadUtil; import pl.psobiech.opengr8on.vclu.system.VirtualSystem; public class RemoteCLU extends VirtualObject { @@ -44,7 +49,8 @@ public class RemoteCLU extends VirtualObject { public RemoteCLU(VirtualSystem virtualSystem, String name, Inet4Address address, Inet4Address localAddress, CipherKey cipherKey, int port) { super( virtualSystem, name, - IFeature.EMPTY.class, Methods.class, IEvent.EMPTY.class + IFeature.EMPTY.class, Methods.class, IEvent.EMPTY.class, + ThreadUtil.supportsNonBlockingDatagramSockets() ? ThreadUtil::virtualScheduler : ThreadUtil::daemonScheduler ); this.localLuaContext = new Globals(); @@ -56,27 +62,39 @@ public RemoteCLU(VirtualSystem virtualSystem, String name, Inet4Address address, register(Methods.EXECUTE, arg1 -> { final String script = arg1.checkjstring(); - return client.execute(script) - .map(returnValue -> { - returnValue = StringUtils.stripToNull(returnValue); - if (returnValue == null) { - return null; - } - - if (returnValue.startsWith("{")) { - return localLuaContext.load("return %s".formatted(returnValue)) - .call(); - } - - final LuaString luaString = LuaValue.valueOf(returnValue); - if (luaString.isnumber()) { - return luaString.checknumber(); - } - - return luaString; - } - ) - .orElse(LuaValue.NIL); + final Optional returnValueOptional; + try { + // TODO: remove this workaround, when DockerSockets stop thread pinning + returnValueOptional = scheduler.submit(() -> + client.execute(script) + ) + .get(); + } catch (InterruptedException e) { + throw new UncheckedInterruptedException(e); + } catch (ExecutionException e) { + throw new UnexpectedException(e); + } + + return returnValueOptional.map(returnValue -> { + returnValue = StringUtils.stripToNull(returnValue); + if (returnValue == null) { + return null; + } + + if (returnValue.startsWith("{")) { + return localLuaContext.load("return %s".formatted(returnValue)) + .call(); + } + + final LuaString luaString = LuaValue.valueOf(returnValue); + if (luaString.isnumber()) { + return luaString.checknumber(); + } + + return luaString; + } + ) + .orElse(LuaValue.NIL); }); } diff --git a/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/VirtualObject.java b/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/VirtualObject.java index 2e25212..85366b7 100644 --- a/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/VirtualObject.java +++ b/modules/vclu/src/main/java/pl/psobiech/opengr8on/vclu/system/objects/VirtualObject.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Function; import org.luaj.vm2.LuaFunction; import org.luaj.vm2.LuaValue; @@ -77,10 +78,26 @@ public VirtualObject( Class> featureClass, Class> methodClass, Class> eventClass + ) { + this( + virtualSystem, + name, + featureClass, methodClass, eventClass, + ThreadUtil::virtualScheduler + ); + } + + public VirtualObject( + VirtualSystem virtualSystem, + String name, + Class> featureClass, + Class> methodClass, + Class> eventClass, + Function schedulerSupplier ) { this.virtualSystem = virtualSystem; this.name = name; - this.scheduler = ThreadUtil.virtualScheduler(name); + this.scheduler = schedulerSupplier.apply(name); this.featureClass = featureClass; this.methodClass = methodClass;