From df0c58eec42a3db488c3128bfbbd4934d0614a09 Mon Sep 17 00:00:00 2001 From: Aleksandr Nikolaev <> Date: Mon, 28 Sep 2026 17:57:43 +0300 Subject: [PATCH 1/2] IGNITE-29080 Fix the TcpDiscoveryVmIpFinderDnsResolveTest for JDK 21 --- .../TcpDiscoveryVmIpFinderDnsResolveTest.java | 63 +++++++------------ 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java index 86d5ffaa28b9e..1980a0daf4bee 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java @@ -26,11 +26,11 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Objects; import java.util.Set; +import java.util.stream.Stream; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -527,59 +527,38 @@ else if (multipleFqdn.equals(paramStr)) { /** */ public interface INameService extends InvocationHandler { /** */ - static void install( - INameService dns - ) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { - final Class inetAddrCls = InetAddress.class; + static void install(INameService dns) throws ReflectiveOperationException { + Field nameSvcField = nameServiceField(); - Object neu; + Class iface = nameSvcField.getType(); - Field nameSvcField; - - try { - //JAVA 9+ class - final Class iface = Class.forName("java.net.InetAddress$NameService"); - - nameSvcField = inetAddrCls.getDeclaredField("nameService"); - - neu = Proxy.newProxyInstance(iface.getClassLoader(), new Class[] {iface}, dns); - } - catch (final ClassNotFoundException | NoSuchFieldException e) { - //JAVA <8 class - nameSvcField = inetAddrCls.getDeclaredField("nameServices"); - - final Class iface = Class.forName("sun.net.spi.nameservice.NameService"); - - neu = Collections.singletonList(Proxy.newProxyInstance(iface.getClassLoader(), new Class[] {iface}, dns)); - } + nameSvc = nameSvcField.get(null); - nameSvcField.setAccessible(true); - - nameSvc = nameSvcField.get(inetAddrCls); - - nameSvcField.set(inetAddrCls, neu); + nameSvcField.set(null, Proxy.newProxyInstance(iface.getClassLoader(), new Class[] {iface}, dns)); } /** */ - static void uninstall() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - final Class inetAddrCls = InetAddress.class; + static void uninstall() throws ReflectiveOperationException { + nameServiceField().set(null, nameSvc); + } + /** + * @return Accessible {@link InetAddress} static field holding the system-wide name service: + * {@code InetAddressResolver resolver} since JDK 18, {@code InetAddress.NameService nameService} before. + */ + private static Field nameServiceField() throws NoSuchFieldException { Field nameSvcField; try { - //JAVA 9+ class - Class.forName("java.net.InetAddress$NameService"); - - nameSvcField = inetAddrCls.getDeclaredField("nameService"); + nameSvcField = InetAddress.class.getDeclaredField("nameService"); } - catch (final ClassNotFoundException | NoSuchFieldException e) { - //JAVA <8 class - nameSvcField = inetAddrCls.getDeclaredField("nameServices"); + catch (NoSuchFieldException e) { + nameSvcField = InetAddress.class.getDeclaredField("resolver"); } nameSvcField.setAccessible(true); - nameSvcField.set(inetAddrCls, nameSvc); + return nameSvcField; } /** @@ -604,10 +583,16 @@ static void uninstall() throws IllegalArgumentException, IllegalAccessException, @Override default Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { switch (method.getName()) { + // InetAddress.NameService, JDK 9-17. case "lookupAllHostAddr": return lookupAllHostAddr((String)args[0]); case "getHostByAddr": return getHostByAddr((byte[])args[0]); + // java.net.spi.InetAddressResolver, JDK 18+. + case "lookupByName": + return Stream.of(lookupAllHostAddr((String)args[0])); + case "lookupByAddress": + return getHostByAddr((byte[])args[0]); default: final StringBuilder o = new StringBuilder(); From 7886dab0fd751428c86d49077d98efc0f71de8c6 Mon Sep 17 00:00:00 2001 From: Aleksandr Nikolaev Date: Thu, 1 Oct 2026 11:20:20 +0300 Subject: [PATCH 2/2] IGNITE-29080 fix after reviewing --- .../ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java index 1980a0daf4bee..b65018322315a 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderDnsResolveTest.java @@ -31,12 +31,14 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Stream; +import org.apache.ignite.testframework.junits.WithSystemProperty; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; /** */ +@WithSystemProperty(key = "sun.net.inetaddr.ttl", value = "0") public class TcpDiscoveryVmIpFinderDnsResolveTest extends GridCommonAbstractTest { /** Fqnd */ @@ -149,11 +151,6 @@ public void fqdnResolveAfterDnsHostChange(String fqdn, int expectedCount) throws InetSocketAddress addr1 = resolved1.iterator().next(); - //because of JAVA networkaddress cache ttl can be turn on. - //will be great to change current test and run it in separate JVM. - //and set there -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0 - Thread.sleep(50_000); - Collection resolved2 = ipFinder.getRegisteredAddresses(); assertEquals(expectedCount, resolved2.size());