Replace JNDI with other DNS resolver library
Feature Description
The Java JNDI library is known to be poorly maintained and may have security holes. Replace the JndiDnsResolver with a different implementation using the https://github.com/dnsjava/dnsjava library instead.
Sample code
Alternatives Considered
No response
Additional Details
No response
It seems this was done in 1.26.0, but I get exceptions now in java 24 (Docker tag azul/zulu-openjdk-alpine:24-jre-headless-latest@sha256:ec048d365be0b15b062106d2c03260508995fcdb4512fa141214f77ba4aa5ded )
Exception in thread "main" com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Something unusual has occurred to cause the driver to fail. Please report this exception.
at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:610)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:597)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:97)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
at // REDACTED, this is my stuff...
Caused by: org.postgresql.util.PSQLException: Something unusual has occurred to cause the driver to fail. Please report this exception.
at org.postgresql.Driver.connect(Driver.java:321)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)
... 8 more
Caused by: java.lang.RuntimeException: Unable to get valid instance data within 45000 ms. Last refresh attempt failed:java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
at com.google.cloud.sql.core.RefreshAheadStrategy.getConnectionInfo(RefreshAheadStrategy.java:138)
at com.google.cloud.sql.core.RefreshAheadStrategy.refreshIfExpired(RefreshAheadStrategy.java:187)
at com.google.cloud.sql.core.RefreshAheadConnectionInfoCache.refreshIfExpired(RefreshAheadConnectionInfoCache.java:83)
at com.google.cloud.sql.core.MonitoredCache.refreshIfExpired(MonitoredCache.java:126)
at com.google.cloud.sql.core.Connector.getConnection(Connector.java:182)
at com.google.cloud.sql.core.Connector.connect(Connector.java:124)
at com.google.cloud.sql.core.InternalConnectorRegistry.connect(InternalConnectorRegistry.java:184)
at com.google.cloud.sql.postgres.SocketFactory.createSocket(SocketFactory.java:89)
at org.postgresql.core.PGStream.createSocket(PGStream.java:249)
at org.postgresql.core.PGStream.<init>(PGStream.java:122)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:57)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:279)
at org.postgresql.Driver.makeConnection(Driver.java:448)
at org.postgresql.Driver.connect(Driver.java:298)
... 13 more
Caused by: java.util.concurrent.ExecutionException: java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:292)
at com.google.common.util.concurrent.AbstractFutureState.blockingGet(AbstractFutureState.java:235)
at com.google.common.util.concurrent.Platform.get(Platform.java:54)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:253)
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:96)
at com.google.cloud.sql.core.RefreshAheadStrategy.handleRefreshResult(RefreshAheadStrategy.java:238)
at com.google.cloud.sql.core.RefreshAheadStrategy.lambda$startRefreshAttempt$1(RefreshAheadStrategy.java:230)
at com.google.common.util.concurrent.CombinedFuture$AsyncCallableInterruptibleTask.runInterruptibly(CombinedFuture.java:165)
at com.google.common.util.concurrent.CombinedFuture$AsyncCallableInterruptibleTask.runInterruptibly(CombinedFuture.java:153)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:74)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:309)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1095)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:619)
at java.base/java.lang.Thread.run(Thread.java:1447)
Caused by: java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:559)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1090)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1099)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1142)
at java.base/java.util.ServiceLoader$1.hasNext(ServiceLoader.java:1164)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1246)
at java.base/java.util.ServiceLoader.findFirst(ServiceLoader.java:1659)
at java.base/java.net.InetAddress.loadResolver(InetAddress.java:487)
at java.base/java.net.InetAddress.resolver(InetAddress.java:467)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1695)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:1056)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1687)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1568)
at java.base/java.net.InetAddress.getByName(InetAddress.java:1478)
at java.base/java.net.InetSocketAddress.<init>(InetSocketAddress.java:223)
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:161)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:516)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:604)
at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:205)
at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:287)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:963)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:899)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:141)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:151)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:84)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:565)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:506)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:616)
at com.google.cloud.sql.core.DefaultConnectionInfoRepository.lambda$fetchMetadata$9(DefaultConnectionInfoRepository.java:253)
at com.google.cloud.sql.core.RetryingCallable.call(RetryingCallable.java:69)
at com.google.cloud.sql.core.DefaultConnectionInfoRepository.fetchMetadata(DefaultConnectionInfoRepository.java:254)
at com.google.cloud.sql.core.DefaultConnectionInfoRepository.lambda$getConnectionInfo$0(DefaultConnectionInfoRepository.java:144)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:128)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:74)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:80)
... 6 more
Hi @krissrex thank you for reporting this issue.
I am wondering if you get this issue only on Java 21? or any other Java as well?
Hi @krissrex I think there was some issue with 1.26.0. I wonder if you can try newest version 1.26.1?
Hi @krissrex I think there was some issue with 1.26.0. I wonder if you can try newest version
1.26.1?
It was 1.26.1 I used to get the exception. On Java 24. I can try Java 25 and see if it makes a difference.
1.26.1 on azul/zulu-openjdk-alpine:25-jre-headless-latest@sha256:3b12b8a7a4a2d4fd165c5bbbcd93badc9b040f26e6115e59f076fea2e5e63fc0 same issue.
Exception in thread "main" com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: java.net.spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:610)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:597)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:97)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
at // My main method here
Caused by: java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:559)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1090)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1099)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1142)
at java.base/java.util.ServiceLoader$1.hasNext(ServiceLoader.java:1164)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1246)
at java.base/java.util.ServiceLoader.findFirst(ServiceLoader.java:1659)
at java.base/java.net.InetAddress.loadResolver(InetAddress.java:491)
at java.base/java.net.InetAddress.resolver(InetAddress.java:471)
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1710)
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:1060)
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1702)
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1582)
at java.base/java.net.InetAddress.getByName(InetAddress.java:1492)
at java.base/java.net.InetSocketAddress.<init>(InetSocketAddress.java:223)
at org.postgresql.core.PGStream.createSocket(PGStream.java:259)
at org.postgresql.core.PGStream.<init>(PGStream.java:122)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:57)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:279)
at org.postgresql.Driver.makeConnection(Driver.java:448)
at org.postgresql.Driver.connect(Driver.java:298)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)
... 8 more
https://github.com/dnsjava/dnsjava/issues/338
Seems to be a common issue. The resulting jar has a file in META-INF/services/java.net.spi.InetAddressResolverProvider with org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider, but the actual java class for DnsjavaInetAddressResolverProvider is not added into the jar as a dependency:
The solution seems to be to alter the default Maven Shade configuration to enable multi-release:
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Multi-Release>true</Multi-Release>
</manifestEntries>
</transformer>
</transformers>
Because this will add the necessary files when running on java 21+:
@krissrex Thank you for the info.
Just making sure, were you able to run successfully in any of the 1.25 releases? I am guessing no problem before dnsjava was introduced?
I just encountered the issue when migrated from 1.25.3 (to 1.27.1) .
Hi @matihost, can you try altering the configuration as in https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/issues/2181#issuecomment-3425624312