lhotari commented on code in PR #24790:
URL: https://github.com/apache/pulsar/pull/24790#discussion_r2384273934


##########
pulsar-common/src/main/java/org/apache/pulsar/common/util/netty/DnsResolverUtil.java:
##########
@@ -92,4 +113,97 @@ public static void 
applyJdkDnsCacheSettings(DnsNameResolverBuilder dnsNameResolv
         dnsNameResolverBuilder.ttl(MIN_TTL, TTL);
         dnsNameResolverBuilder.negativeTtl(NEGATIVE_TTL);
     }
+
+    public static int getDefaultMinTTL() {
+        return MIN_TTL;
+    }
+
+    public static int getDefaultTTL() {
+        return TTL;
+    }
+
+    public static int getDefaultNegativeTTL() {
+        return NEGATIVE_TTL;
+    }
+
+    /**
+     * Extract the underlying Netty NameResolver from an AddressResolver 
instance or creates an adapter as the
+     * fallback. If null is passed in a default Netty NameResolver will be 
returned which delegates to the
+     * blocking JDK DNS resolver.
+     *
+     * @param addressResolver Netty AddressResolver instance or null
+     * @return Netty NameResolver instance
+     */
+    @SuppressWarnings("unchecked")
+    public static NameResolver<InetAddress> 
adaptToNameResolver(AddressResolver<InetSocketAddress> addressResolver) {
+        if (addressResolver == null) {
+            return new DefaultNameResolver(ImmediateEventExecutor.INSTANCE);
+        }
+        // Use reflection to extract underlying Netty NameResolver instance.
+        if (InetSocketAddressResolver.class.isInstance(addressResolver)) {
+            try {
+                Field nameResolverField =
+                        
FieldUtils.getDeclaredField(InetSocketAddressResolver.class, "nameResolver", 
true);
+                if (nameResolverField != null) {
+                    return (NameResolver<InetAddress>) 
FieldUtils.readField(nameResolverField, addressResolver);
+                } else {
+                    log.warn("Could not find nameResolver Field in 
InetSocketAddressResolver instance.");
+                }
+            } catch (Throwable t) {
+                log.warn("Failed to extract NameResolver from 
InetSocketAddressResolver instance. {}", t.getMessage());
+            }
+        }
+        // fallback to use an adapter if reflection fails
+        log.info("Creating NameResolver adapter that wraps an AddressResolver 
instance.");
+        return createNameResolverAdapter(addressResolver, 
ImmediateEventExecutor.INSTANCE);
+    }
+
+    /**
+     * Creates a NameResolver adapter that wraps an AddressResolver instance.
+     * <p>
+     * This adapter is necessary because Netty doesn't provide a direct 
implementation for converting
+     * between AddressResolver and NameResolver, while AsyncHttpClient 
specifically requires a NameResolver.
+     * The adapter handles the resolution of hostnames to IP addresses by 
delegating to the underlying
+     * AddressResolver.
+     *
+     * @param addressResolver the AddressResolver instance to adapt, handling 
InetSocketAddress resolution
+     * @param executor        the EventExecutor to be used for executing 
resolution tasks
+     * @return a NameResolver instance that wraps the provided AddressResolver
+     */
+    static NameResolver<InetAddress> createNameResolverAdapter(
+            AddressResolver<InetSocketAddress> addressResolver, EventExecutor 
executor) {
+        return new InetNameResolver(executor) {
+            @Override
+            protected void doResolve(String inetHost, Promise<InetAddress> 
promise) throws Exception {
+                Promise<InetSocketAddress> delegatedPromise = 
executor().newPromise();
+                
addressResolver.resolve(InetSocketAddress.createUnresolved(inetHost, 1), 
delegatedPromise);
+                delegatedPromise.addListener(new 
GenericFutureListener<Promise<InetSocketAddress>>() {
+                    @Override
+                    public void operationComplete(Promise<InetSocketAddress> 
future) throws Exception {
+                        if (future.isSuccess()) {
+                            promise.setSuccess(future.get().getAddress());
+                        } else {
+                            promise.setFailure(future.cause());
+                        }
+                    }
+                });
+            }
+
+            @Override
+            protected void doResolveAll(String inetHost, 
Promise<List<InetAddress>> promise) throws Exception {
+                Promise<List<InetSocketAddress>> delegatedPromise = 
executor().newPromise();
+                
addressResolver.resolveAll(InetSocketAddress.createUnresolved(inetHost, 1), 
delegatedPromise);
+                delegatedPromise.addListener(new 
GenericFutureListener<Promise<List<InetSocketAddress>>>() {
+                    @Override
+                    public void 
operationComplete(Promise<List<InetSocketAddress>> future) throws Exception {
+                        if (future.isSuccess()) {
+                            
promise.setSuccess(future.get().stream().map(InetSocketAddress::getAddress).toList());

Review Comment:
   Java 8 support will be addressed in possible backporting



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to