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]