cloud-sql-jdbc-socket-factory icon indicating copy to clipboard operation
cloud-sql-jdbc-socket-factory copied to clipboard

Replace JNDI with other DNS resolver library

Open hessjcg opened this issue 4 months ago • 9 comments

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

hessjcg avatar Aug 07 '25 23:08 hessjcg

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

krissrex avatar Oct 17 '25 14:10 krissrex

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?

panavenue avatar Oct 17 '25 16:10 panavenue

Hi @krissrex I think there was some issue with 1.26.0. I wonder if you can try newest version 1.26.1?

panavenue avatar Oct 17 '25 18:10 panavenue

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.

krissrex avatar Oct 21 '25 08:10 krissrex

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:

Image

krissrex avatar Oct 21 '25 08:10 krissrex

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+:

Image

krissrex avatar Oct 21 '25 09:10 krissrex

@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?

panavenue avatar Oct 21 '25 16:10 panavenue

I just encountered the issue when migrated from 1.25.3 (to 1.27.1) .

matihost avatar Dec 14 '25 19:12 matihost

Hi @matihost, can you try altering the configuration as in https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/issues/2181#issuecomment-3425624312

kgala2 avatar Dec 16 '25 18:12 kgala2