diff --git a/native/src/main/java/com/velocitypowered/natives/util/Natives.java b/native/src/main/java/com/velocitypowered/natives/util/Natives.java index 7e4f05e97..e63c87c20 100644 --- a/native/src/main/java/com/velocitypowered/natives/util/Natives.java +++ b/native/src/main/java/com/velocitypowered/natives/util/Natives.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class Natives { @@ -24,12 +25,12 @@ public class Natives { private static Runnable copyAndLoadNative(String path) { return () -> { try { - Path tempFile = Files.createTempFile("native-", path.substring(path.lastIndexOf('.'))); InputStream nativeLib = Natives.class.getResourceAsStream(path); if (nativeLib == null) { throw new IllegalStateException("Native library " + path + " not found."); } + Path tempFile = createTemporaryNativeFilename(path.substring(path.lastIndexOf('.'))); Files.copy(nativeLib, tempFile, StandardCopyOption.REPLACE_EXISTING); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { @@ -38,13 +39,27 @@ public class Natives { // Well, it doesn't matter... } })); - System.load(tempFile.toAbsolutePath().toString()); + + try { + System.load(tempFile.toAbsolutePath().toString()); + } catch (UnsatisfiedLinkError e) { + throw new NativeSetupException("Unable to load native " + tempFile.toAbsolutePath(), e); + } } catch (IOException e) { throw new NativeSetupException("Unable to copy natives", e); } }; } + private static Path createTemporaryNativeFilename(String ext) throws IOException { + String temporaryFolderPath = System.getProperty("velocity.natives-tmpdir"); + if (temporaryFolderPath != null) { + return Files.createTempFile(Paths.get(temporaryFolderPath), "native-", ext); + } else { + return Files.createTempFile("native-", ext); + } + } + public static final NativeCodeLoader compress = new NativeCodeLoader<>( ImmutableList.of( new NativeCodeLoader.Variant<>(NativeConstraints.MACOS, diff --git a/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java b/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java index d00274735..1a7e33c65 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java @@ -23,6 +23,12 @@ public class Velocity { if (System.getProperty("io.netty.allocator.maxOrder") == null) { System.setProperty("io.netty.allocator.maxOrder", "9"); } + + // If Velocity's natives are being extracted to a different temporary directory, make sure the + // Netty natives are extracted there as well + if (System.getProperty("velocity.natives-tmpdir") != null) { + System.setProperty("io.netty.native.workdir", System.getProperty("velocity.natives-tmpdir")); + } } /** diff --git a/proxy/src/main/java/com/velocitypowered/proxy/network/netty/DnsAddressResolverGroupNameResolverAdapter.java b/proxy/src/main/java/com/velocitypowered/proxy/network/netty/DnsAddressResolverGroupNameResolverAdapter.java index f76a160c9..169b60a49 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/network/netty/DnsAddressResolverGroupNameResolverAdapter.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/network/netty/DnsAddressResolverGroupNameResolverAdapter.java @@ -7,6 +7,7 @@ import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.FutureListener; import io.netty.util.concurrent.ImmediateEventExecutor; import io.netty.util.concurrent.Promise; +import io.netty.util.internal.ThreadExecutorMap; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.ArrayList; @@ -61,13 +62,7 @@ public class DnsAddressResolverGroupNameResolverAdapter extends InetNameResolver } private EventExecutor findExecutor() { - for (EventExecutor executor : group) { - if (executor.inEventLoop()) { - return executor; - } - } - - // otherwise, pick one - return group.next(); + EventExecutor current = ThreadExecutorMap.currentExecutor(); + return current == null ? group.next() : current; } }