diff --git a/LaunchServer/build.gradle b/LaunchServer/build.gradle index f9d16e6c..c8836539 100644 --- a/LaunchServer/build.gradle +++ b/LaunchServer/build.gradle @@ -26,14 +26,11 @@ targetCompatibility = '21' configurations { - compileOnlyA bundleOnly bundle - hikari pack - launch4j bundleOnly.extendsFrom bundle - api.extendsFrom bundle, hikari, pack, launch4j + api.extendsFrom bundle, pack } jar { @@ -88,6 +85,13 @@ pack project(':LauncherAPI') bundle group: 'io.netty', name: 'netty-transport-classes-epoll', version: rootProject['verNetty'] bundle group: 'io.netty', name: 'netty-transport-native-epoll', version: rootProject['verNetty'], classifier: 'linux-x86_64' bundle group: 'io.netty', name: 'netty-transport-native-epoll', version: rootProject['verNetty'], classifier: 'linux-aarch_64' + bundle group: 'io.netty', name: 'netty-transport-classes-io_uring', version: rootProject['verNetty'] + bundle group: 'io.netty', name: 'netty-transport-native-io_uring', version: rootProject['verNetty'], classifier: 'linux-x86_64' + bundle group: 'io.netty', name: 'netty-transport-native-io_uring', version: rootProject['verNetty'], classifier: 'linux-aarch_64' + // Netty + bundle 'org.jboss.marshalling:jboss-marshalling:1.4.11.Final' + bundle 'com.google.protobuf.nano:protobuf-javanano:3.1.0' + // bundle group: 'org.slf4j', name: 'slf4j-api', version: rootProject['verSlf4j'] bundle group: 'com.mysql', name: 'mysql-connector-j', version: rootProject['verMySQLConn'] bundle group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: rootProject['verMariaDBConn'] @@ -103,40 +107,26 @@ pack project(':LauncherAPI') annotationProcessor(group: 'org.apache.logging.log4j', name: 'log4j-core', version: rootProject['verLog4j']) testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: rootProject['verJunit'] - hikari 'io.micrometer:micrometer-core:1.13.1' - hikari('com.zaxxer:HikariCP:5.1.0') { + bundle 'io.micrometer:micrometer-core:1.14.4' + bundle('com.zaxxer:HikariCP:6.2.1') { exclude group: 'javassist' exclude group: 'io.micrometer' exclude group: 'org.slf4j' } } -tasks.register('hikari', Copy) { - duplicatesStrategy = 'EXCLUDE' - into "$buildDir/libs/libraries/hikaricp" - from configurations.hikari -} - tasks.register('dumpLibs', Copy) { duplicatesStrategy = 'EXCLUDE' - dependsOn tasks.hikari into "$buildDir/libs/libraries" from configurations.bundleOnly } -tasks.register('dumpCompileOnlyLibs', Copy) { - duplicatesStrategy = 'EXCLUDE' - into "$buildDir/libs/launcher-libraries-compile" - from configurations.compileOnlyA -} - tasks.register('bundle', Zip) { duplicatesStrategy = 'EXCLUDE' - dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar + dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.jar archiveFileName = 'LaunchServer.zip' destinationDirectory = file("$buildDir") from(tasks.dumpLibs.destinationDir) { into 'libraries' } - from(tasks.dumpCompileOnlyLibs.destinationDir) { into 'launcher-libraries-compile' } from(tasks.jar) from(parent.childProjects.Launcher.tasks.dumpLibs) { into 'launcher-libraries' } } @@ -147,7 +137,7 @@ pack project(':LauncherAPI') from parent.childProjects.Launcher.tasks.dumpLibs } -assemble.dependsOn tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar +assemble.dependsOn tasks.dumpLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar publishing { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java index 3db4c2be..34a6fd26 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServerStarter.java @@ -63,7 +63,7 @@ public static void main(String[] args) throws Exception { directories.collect(); CertificateManager certificateManager = new CertificateManager(); try { - certificateManager.readTrustStore(dir.resolve("truststore")); + certificateManager.readTrustStore(directories.trustStore); } catch (CertificateException e) { throw new IOException(e); } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/Main.java b/LaunchServer/src/main/java/pro/gravit/launchserver/Main.java index aabf4fe1..f12ae900 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/Main.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/Main.java @@ -18,7 +18,7 @@ import java.util.stream.Stream; public class Main { - private static final List classpathOnly = List.of("proguard", "jline", "progressbar", "kotlin", "epoll"); + private static final List classpathOnly = List.of("proguard", "jline", "progressbar", "kotlin"); private static final String LOG4J_PROPERTY = "log4j2.configurationFile"; private static final String DEBUG_PROPERTY = "launchserver.main.debug"; private static final String LIBRARIES_PROPERTY = "launchserver.dir.libraries"; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/DebugCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/DebugCommand.java index 355f1463..888c666b 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/DebugCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/basic/DebugCommand.java @@ -32,6 +32,7 @@ public void invoke(String... args) throws Exception { boolean value = Boolean.parseBoolean(args[0]); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); + config.getWatchManager().setIntervalSeconds(-1); LoggerConfig loggerConfig = config.getLoggerConfig("pro.gravit"); loggerConfig.setLevel(value ? Level.TRACE : Level.DEBUG); ctx.updateLoggers(); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java index f2121ba7..ccd7a71c 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java @@ -19,6 +19,7 @@ import pro.gravit.launchserver.components.AuthLimiterComponent; import pro.gravit.launchserver.components.Component; import pro.gravit.launchserver.components.ProGuardComponent; +import pro.gravit.launchserver.socket.NettyObjectFactory; import java.util.*; @@ -64,12 +65,7 @@ public static LaunchServerConfig getDefault(LaunchServer.LaunchServerEnv env) { newConfig.netty.fileServerEnabled = true; newConfig.netty.binds = new NettyBindAddress[]{new NettyBindAddress("0.0.0.0", 9274)}; newConfig.netty.performance = new NettyPerformanceConfig(); - try { - newConfig.netty.performance.usingEpoll = Epoll.isAvailable(); - } catch (Throwable e) { - // Epoll class line 51+ catch (Exception) but Error will be thrown by System.load - newConfig.netty.performance.usingEpoll = false; - } // such as on ARM + newConfig.netty.performance.mode = NettyObjectFactory.NettyFactoryMode.AUTO; newConfig.netty.performance.bossThread = 2; newConfig.netty.performance.workerThread = 8; newConfig.netty.performance.schedulerThread = 2; @@ -277,7 +273,7 @@ public static class NettyConfig { } public static class NettyPerformanceConfig { - public boolean usingEpoll; + public NettyObjectFactory.NettyFactoryMode mode = NettyObjectFactory.NettyFactoryMode.AUTO; public int bossThread; public int workerThread; public int schedulerThread; diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java index fa822fcf..81f7f68b 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/CertificateManager.java @@ -29,6 +29,7 @@ public class CertificateManager { private transient final Logger logger = LogManager.getLogger(); public LauncherTrustManager trustManager; + private Path truststorePath; public void writePrivateKey(Path file, PrivateKey privateKey) throws IOException { writePrivateKey(IOHelper.newWriter(file), privateKey); @@ -91,6 +92,7 @@ public X509CertificateHolder readCertificate(Reader reader) throws IOException { } public void readTrustStore(Path dir) throws IOException, CertificateException { + this.truststorePath = dir; if (!IOHelper.isDir(dir)) { Files.createDirectories(dir); try { @@ -131,4 +133,8 @@ public LauncherTrustManager.CheckClassResult checkClass(Class clazz) { X509Certificate[] certificates = JVMHelper.getCertificates(clazz); return trustManager.checkCertificates(certificates, trustManager::stdCertificateChecker); } + + public Path getTruststorePath() { + return truststorePath; + } } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java index 592a79d3..987c78f1 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/LauncherNettyServer.java @@ -36,14 +36,9 @@ public class LauncherNettyServer implements AutoCloseable { public LauncherNettyServer(LaunchServer server) { LaunchServerConfig.NettyConfig config = server.config.netty; - NettyObjectFactory.setUsingEpoll(config.performance.usingEpoll); + NettyObjectFactory.setMode(config.performance.mode); Logger logger = LogManager.getLogger(); - if (config.performance.usingEpoll) { - logger.debug("Netty: Epoll enabled"); - } - if (config.performance.usingEpoll && !Epoll.isAvailable()) { - logger.error("Epoll is not available: (netty,perfomance.usingEpoll configured wrongly)", Epoll.unavailabilityCause()); - } + logger.info("Netty usage {} transport mode", NettyObjectFactory.getMode()); bossGroup = NettyObjectFactory.newEventLoopGroup(config.performance.bossThread, "LauncherNettyServer.bossGroup"); workerGroup = NettyObjectFactory.newEventLoopGroup(config.performance.workerThread, "LauncherNettyServer.workerGroup"); serverBootstrap = new ServerBootstrap(); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyObjectFactory.java b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyObjectFactory.java index 3b622bde..5a13e460 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyObjectFactory.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/socket/NettyObjectFactory.java @@ -2,30 +2,60 @@ import io.netty.channel.ChannelFactory; import io.netty.channel.EventLoopGroup; +import io.netty.channel.MultiThreadIoEventLoopGroup; import io.netty.channel.ServerChannel; +import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.epoll.EpollIoHandler; import io.netty.channel.epoll.EpollServerSocketChannel; import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.nio.NioIoHandler; import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.uring.IoUring; +import io.netty.channel.uring.IoUringIoHandler; +import io.netty.channel.uring.IoUringServerSocketChannel; public class NettyObjectFactory { - private static boolean epoll = false; + private static NettyFactoryMode mode; - public static void setUsingEpoll(boolean value) { - epoll = value; + public static void setMode(NettyFactoryMode mode) { + NettyObjectFactory.mode = mode; + if(mode == NettyFactoryMode.AUTO) { + if(IoUring.isAvailable()) { + NettyObjectFactory.mode = NettyFactoryMode.IO_URING; + return; + } + if(Epoll.isAvailable()) { + NettyObjectFactory.mode = NettyFactoryMode.EPOLL; + return; + } + NettyObjectFactory.mode = NettyFactoryMode.NIO; + } + } + + public static NettyFactoryMode getMode() { + return mode; } public static EventLoopGroup newEventLoopGroup(int threads, String poolName) { - if (epoll) - return new EpollEventLoopGroup(threads); - else - return new NioEventLoopGroup(threads); + return switch (mode) { + case AUTO -> null; + case NIO -> new MultiThreadIoEventLoopGroup(threads, NioIoHandler.newFactory()); + case EPOLL -> new MultiThreadIoEventLoopGroup(threads, EpollIoHandler.newFactory()); + case IO_URING -> new MultiThreadIoEventLoopGroup(threads, IoUringIoHandler.newFactory()); + }; } public static ChannelFactory getServerSocketChannelFactory() { - if (epoll) - return EpollServerSocketChannel::new; - else - return NioServerSocketChannel::new; + return switch (mode) { + case AUTO -> null; + case NIO -> NioServerSocketChannel::new; + case EPOLL -> EpollServerSocketChannel::new; + case IO_URING -> IoUringServerSocketChannel::new; + }; + } + + public enum NettyFactoryMode { + AUTO, NIO, EPOLL, IO_URING } } diff --git a/LauncherCore/src/main/java/pro/gravit/utils/Version.java b/LauncherCore/src/main/java/pro/gravit/utils/Version.java index f5632187..ffd345ae 100644 --- a/LauncherCore/src/main/java/pro/gravit/utils/Version.java +++ b/LauncherCore/src/main/java/pro/gravit/utils/Version.java @@ -6,7 +6,7 @@ public final class Version implements Comparable { public static final int MAJOR = 5; public static final int MINOR = 6; - public static final int PATCH = 9; + public static final int PATCH = 10; public static final int BUILD = 1; public static final Version.Type RELEASE = Type.STABLE; public final int major; diff --git a/build.gradle b/build.gradle index 43de18a3..9904eb01 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,11 @@ plugins { - id 'com.github.johnrengelman.shadow' version '7.1.2' apply false + id 'com.github.johnrengelman.shadow' version '8.1.1' apply false id 'maven-publish' id 'signing' id 'org.openjfx.javafxplugin' version '0.1.0' apply false } group = 'pro.gravit.launcher' -version = '5.6.9' +version = '5.6.10' apply from: 'props.gradle' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 79eb9d00..e0fd0202 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d..f3b75f3b 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/modules b/modules index bf37c686..aa5ab332 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit bf37c6860a80acfd516ee533494d64b226d89309 +Subproject commit aa5ab332d65dd14ce5321453aa809e30b87a186d diff --git a/props.gradle b/props.gradle index 99b9aa98..fece1ba7 100644 --- a/props.gradle +++ b/props.gradle @@ -1,18 +1,18 @@ project.ext { verAsm = '9.7.1' - verNetty = '4.1.114.Final' - verOshiCore = '6.6.5' - verJunit = '5.11.2' + verNetty = '4.2.0.RC3' + verOshiCore = '6.6.6' + verJunit = '5.11.4' verJansi = '2.4.1' - verJline = '3.26.3' + verJline = '3.29.0' verJwt = '0.12.6' - verGson = '2.11.0' - verBcpkix = '1.78.1' + verGson = '2.12.1' + verBcpkix = '1.80' verSlf4j = '2.0.16' - verLog4j = '2.24.1' - verMySQLConn = '9.0.0' - verMariaDBConn = '3.4.1' - verPostgreSQLConn = '42.7.4' + verLog4j = '2.24.3' + verMySQLConn = '9.2.0' + verMariaDBConn = '3.5.1' + verPostgreSQLConn = '42.7.5' verH2Conn = '2.3.232' - verProguard = '7.6.0' + verProguard = '7.6.1' }