This is an automated email from the ASF dual-hosted git repository.

lhotari pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new cce0b058efd [improve][misc] Remove the call to sun 
InetAddressCachePolicy (#22329)
cce0b058efd is described below

commit cce0b058efd55e2d5ac42c4ecaceddacee648a7c
Author: Jian Yun <[email protected]>
AuthorDate: Thu Mar 28 06:59:28 2024 +0800

    [improve][misc] Remove the call to sun InetAddressCachePolicy (#22329)
    
    Co-authored-by: Lari Hotari <[email protected]>
---
 .../pulsar/common/util/netty/DnsResolverUtil.java  | 52 ++++++++++++++++------
 .../pulsar/common/util/netty/DnsResolverTest.java  | 44 ++++++++++++++++++
 2 files changed, 82 insertions(+), 14 deletions(-)

diff --git 
a/pulsar-common/src/main/java/org/apache/pulsar/common/util/netty/DnsResolverUtil.java
 
b/pulsar-common/src/main/java/org/apache/pulsar/common/util/netty/DnsResolverUtil.java
index f49a6453c72..bcff83acd94 100644
--- 
a/pulsar-common/src/main/java/org/apache/pulsar/common/util/netty/DnsResolverUtil.java
+++ 
b/pulsar-common/src/main/java/org/apache/pulsar/common/util/netty/DnsResolverUtil.java
@@ -19,12 +19,20 @@
 package org.apache.pulsar.common.util.netty;
 
 import io.netty.resolver.dns.DnsNameResolverBuilder;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.security.Security;
+import java.util.Optional;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class DnsResolverUtil {
+
+    private static final String CACHE_POLICY_PROP = "networkaddress.cache.ttl";
+    private static final String CACHE_POLICY_PROP_FALLBACK = 
"sun.net.inetaddr.ttl";
+    private static final String NEGATIVE_CACHE_POLICY_PROP = 
"networkaddress.cache.negative.ttl";
+    private static final String NEGATIVE_CACHE_POLICY_PROP_FALLBACK = 
"sun.net.inetaddr.negative.ttl";
+    /* default ttl value from sun.net.InetAddressCachePolicy.DEFAULT_POSITIVE, 
which is used when no security manager
+     is used */
+    private static final int JDK_DEFAULT_TTL = 30;
     private static final int MIN_TTL = 0;
     private static final int TTL;
     private static final int NEGATIVE_TTL;
@@ -39,19 +47,35 @@ public class DnsResolverUtil {
         int ttl = DEFAULT_TTL;
         int negativeTtl = DEFAULT_NEGATIVE_TTL;
         try {
-            // use reflection to call sun.net.InetAddressCachePolicy's get and 
getNegative methods for getting
-            // effective JDK settings for DNS caching
-            Class<?> inetAddressCachePolicyClass = 
Class.forName("sun.net.InetAddressCachePolicy");
-            Method getTTLMethod = inetAddressCachePolicyClass.getMethod("get");
-            ttl = (Integer) getTTLMethod.invoke(null);
-            Method getNegativeTTLMethod = 
inetAddressCachePolicyClass.getMethod("getNegative");
-            negativeTtl = (Integer) getNegativeTTLMethod.invoke(null);
-        } catch (NoSuchMethodException | ClassNotFoundException | 
InvocationTargetException
-                 | IllegalAccessException e) {
-            log.warn("Cannot get DNS TTL settings from 
sun.net.InetAddressCachePolicy class", e);
+            String ttlStr = Security.getProperty(CACHE_POLICY_PROP);
+            if (ttlStr == null) {
+                // Compatible with sun.net.inetaddr.ttl settings
+                ttlStr = System.getProperty(CACHE_POLICY_PROP_FALLBACK);
+            }
+            String negativeTtlStr = 
Security.getProperty(NEGATIVE_CACHE_POLICY_PROP);
+            if (negativeTtlStr == null) {
+                // Compatible with sun.net.inetaddr.negative.ttl settings
+                negativeTtlStr = 
System.getProperty(NEGATIVE_CACHE_POLICY_PROP_FALLBACK);
+            }
+            ttl = Optional.ofNullable(ttlStr)
+                    .map(Integer::decode)
+                    .filter(i -> i > 0)
+                    .orElseGet(() -> {
+                        if (System.getSecurityManager() == null) {
+                            return JDK_DEFAULT_TTL;
+                        }
+                        return DEFAULT_TTL;
+                    });
+
+            negativeTtl = Optional.ofNullable(negativeTtlStr)
+                    .map(Integer::decode)
+                    .filter(i -> i >= 0)
+                    .orElse(DEFAULT_NEGATIVE_TTL);
+        } catch (NumberFormatException e) {
+            log.warn("Cannot get DNS TTL settings", e);
         }
-        TTL = ttl <= 0 ? DEFAULT_TTL : ttl;
-        NEGATIVE_TTL = negativeTtl < 0 ? DEFAULT_NEGATIVE_TTL : negativeTtl;
+        TTL = ttl;
+        NEGATIVE_TTL = negativeTtl;
     }
 
     private DnsResolverUtil() {
diff --git 
a/pulsar-common/src/test/java/org/apache/pulsar/common/util/netty/DnsResolverTest.java
 
b/pulsar-common/src/test/java/org/apache/pulsar/common/util/netty/DnsResolverTest.java
index 0ccb960e798..46599cc45a0 100644
--- 
a/pulsar-common/src/test/java/org/apache/pulsar/common/util/netty/DnsResolverTest.java
+++ 
b/pulsar-common/src/test/java/org/apache/pulsar/common/util/netty/DnsResolverTest.java
@@ -18,13 +18,57 @@
  */
 package org.apache.pulsar.common.util.netty;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertEquals;
 import io.netty.channel.EventLoop;
 import io.netty.resolver.dns.DnsNameResolverBuilder;
+import java.security.Security;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 public class DnsResolverTest {
+    private static final int MIN_TTL = 0;
+    private static final int TTL = 101;
+    private static final int NEGATIVE_TTL = 121;
+    private static final String CACHE_POLICY_PROP = "networkaddress.cache.ttl";
+    private static final String NEGATIVE_CACHE_POLICY_PROP = 
"networkaddress.cache.negative.ttl";
+
+    private String originalCachePolicy;
+    private String originalNegativeCachePolicy;
+
+    @BeforeClass(alwaysRun = true)
+    public void beforeClass() {
+        originalCachePolicy = Security.getProperty(CACHE_POLICY_PROP);
+        originalNegativeCachePolicy = 
Security.getProperty(NEGATIVE_CACHE_POLICY_PROP);
+        Security.setProperty(CACHE_POLICY_PROP, Integer.toString(TTL));
+        Security.setProperty(NEGATIVE_CACHE_POLICY_PROP, 
Integer.toString(NEGATIVE_TTL));
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void afterClass() {
+        Security.setProperty(CACHE_POLICY_PROP, originalCachePolicy != null ? 
originalCachePolicy : "-1");
+        Security.setProperty(NEGATIVE_CACHE_POLICY_PROP,
+                originalNegativeCachePolicy != null ? 
originalNegativeCachePolicy : "0");
+    }
+
+    @Test
+    public void testTTl() {
+        final DnsNameResolverBuilder builder = 
mock(DnsNameResolverBuilder.class);
+        ArgumentCaptor<Integer> minTtlCaptor = 
ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Integer> maxTtlCaptor = 
ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Integer> negativeTtlCaptor = 
ArgumentCaptor.forClass(Integer.class);
+        DnsResolverUtil.applyJdkDnsCacheSettings(builder);
+        verify(builder).ttl(minTtlCaptor.capture(), maxTtlCaptor.capture());
+        verify(builder).negativeTtl(negativeTtlCaptor.capture());
+        assertEquals(minTtlCaptor.getValue(), MIN_TTL);
+        assertEquals(maxTtlCaptor.getValue(), TTL);
+        assertEquals(negativeTtlCaptor.getValue(), NEGATIVE_TTL);
+    }
 
     @Test
     public void testMaxTtl() {

Reply via email to