maven-mvnd icon indicating copy to clipboard operation
maven-mvnd copied to clipboard

DNS resolution errors if DNS changes after daemon has started

Open kwin opened this issue 4 years ago • 9 comments

I am using a corporate private Maven repository whose domain can only be resolved once connected via VPN. When I use mvnd before I am connected to the VPN it obviously fails. But if I afterwards connect to the VPN, the DNS lookup does still not work and I get the message

[ERROR] Failed to execute goal on project org.apache.sling.feature.cpconverter: Could not resolve dependencies for project org.apache.sling:org.apache.sling.feature.cpconverter:jar:1.1.1-SNAPSHOT: Failed to collect dependencies at org.apache.sling:org.apache.sling.jcr.contentloader:jar:2.4.3-SNAPSHOT: Failed to read artifact descriptor for org.apache.sling:org.apache.sling.jcr.contentloader:jar:2.4.3-SNAPSHOT: Could not transfer artifact org.apache.sling:org.apache.sling.jcr.contentloader:pom:2.4.3-SNAPSHOT from/to nexus (https://repo.int.netcentric.biz/nexus/content/groups/public/): Transfer failed for https://repo.int.netcentric.biz/nexus/content/groups/public/org/apache/sling/org.apache.sling.jcr.contentloader/2.4.3-SNAPSHOT/org.apache.sling.jcr.contentloader-2.4.3-SNAPSHOT.pom: Unknown host repo.int.netcentric.biz -> [Help 1]

If I execute the same Maven command via regular mvn it starts working immediately once I am connected to the VPN.

Seems that either the Java process or some Maven internals still use the old DNS or cache resolutions aggressively.

kwin avatar May 17 '21 10:05 kwin

Probably the system property https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html#nct has to be set.

kwin avatar May 17 '21 10:05 kwin

The default is 30 seconds afaik: https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/sun/net/InetAddressCachePolicy.java#L48

gnodet avatar May 17 '21 11:05 gnodet

@kwin can you double check that it works if you wait one minute ? Also, note that networkaddress.cache.ttl is a security property (it has to be set in the [JAVA_HOME]/conf/security/java.security file), but you can try adding -Dsun.net.inetaddr.ttl=5 to the command line, or adding mvnd.jvmArgs=-Dsun.net.inetaddr.ttl=5 to your ~/.m2/mvnd.properties file.

gnodet avatar May 19 '21 09:05 gnodet

The weird thing is that the DNS resolution was not successful before, therefore sun.net.inetaddr.negative.ttl should be taken into account, but this is already set to 10 by default. I will try to do some more tests...

kwin avatar May 19 '21 09:05 kwin

This error is persistent until I restart the mvn daemon. Seems that Maven is doing some kind of caching here. I don't think that Java is to blame here

kwin avatar May 31 '21 06:05 kwin

Do you have the full stack trace to verify which transport is used ? The default http transport uses the org.apache.http.client.HttpClient which can optionally be configured with a custom DnsResolver, but I don't think that's the case. What's weird is that afaik, transports should not live longer than the maven session, which is tied to the build.

gnodet avatar Jun 03 '21 08:06 gnodet

This is the full stack trace when not yet connected to the proper DNS:

Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not transfer artifact org.apache.sling:org.apache.sling.repoinit.parser:pom:1.6.9-SNAPSHOT from/to nexus (https://repo.int.netcentric.biz/nexus/content/groups/public/): transfer failed for https://repo.int.netcentric.biz/nexus/content/groups/public/org/apache/sling/org.apache.sling.repoinit.parser/1.6.9-SNAPSHOT/org.apache.sling.repoinit.parser-1.6.9-SNAPSHOT.pom
	at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:424)
	at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:229)
	at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:207)
	at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:240)
	... 23 common frames omitted
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact org.apache.sling:org.apache.sling.repoinit.parser:pom:1.6.9-SNAPSHOT from/to nexus (https://repo.int.netcentric.biz/nexus/content/groups/public/): transfer failed for https://repo.int.netcentric.biz/nexus/content/groups/public/org/apache/sling/org.apache.sling.repoinit.parser/1.6.9-SNAPSHOT/org.apache.sling.repoinit.parser-1.6.9-SNAPSHOT.pom
	at org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:52)
	at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:369)
	at org.eclipse.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:75)
	at org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:628)
	at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:262)
	at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:513)
	at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:401)
	... 26 common frames omitted
Caused by: org.apache.maven.wagon.TransferFailedException: transfer failed for https://repo.int.netcentric.biz/nexus/content/groups/public/org/apache/sling/org.apache.sling.repoinit.parser/1.6.9-SNAPSHOT/org.apache.sling.repoinit.parser-1.6.9-SNAPSHOT.pom
	at org.apache.maven.wagon.providers.http.wagon.shared.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:1250)
	at org.apache.maven.wagon.providers.http.wagon.shared.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:1140)
	at org.apache.maven.wagon.StreamWagon.getInputStream(StreamWagon.java:126)
	at org.apache.maven.wagon.StreamWagon.getIfNewer(StreamWagon.java:88)
	at org.apache.maven.wagon.StreamWagon.get(StreamWagon.java:61)
	at org.eclipse.aether.transport.wagon.WagonTransporter$GetTaskRunner.run(WagonTransporter.java:546)
	at org.eclipse.aether.transport.wagon.WagonTransporter.execute(WagonTransporter.java:430)
	at org.eclipse.aether.transport.wagon.WagonTransporter.get(WagonTransporter.java:407)
	at org.eclipse.aether.connector.basic.BasicRepositoryConnector$GetTaskRunner.runTask(BasicRepositoryConnector.java:457)
	at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:364)
	... 31 common frames omitted
Caused by: java.net.UnknownHostException: repo.int.netcentric.biz
	at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
	at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1509)
	at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1368)
	at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1302)
	at org.apache.maven.wagon.providers.http.httpclient.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
	at org.apache.maven.wagon.providers.http.httpclient.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
	at org.apache.maven.wagon.providers.http.httpclient.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
	at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
	at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
	at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
	at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec.execute(RetryExec.java:89)
	at org.apache.maven.wagon.providers.http.httpclient.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
	at org.apache.maven.wagon.providers.http.httpclient.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.maven.wagon.providers.http.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
	at org.apache.maven.wagon.providers.http.wagon.shared.AbstractHttpClientWagon.execute(AbstractHttpClientWagon.java:1005)
	at org.apache.maven.wagon.providers.http.wagon.shared.AbstractHttpClientWagon.fillInputData(AbstractHttpClientWagon.java:1162)
	... 40 common frames omitted
[ERROR]

the same appears after switching to the right DNS, with standalone mvn it starts working then. This happens with

mvnd native client 0.5.0-darwin-amd64 (ce80fc5ed8b7858af8ce16119336b43d5776bb13)
Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jansi.osx.OsXNativePty
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: /usr/local/Cellar/mvnd/0.5.0/libexec/mvn
Java version: 11.0.11, vendor: AdoptOpenJDK, runtime: /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
Default locale: en_DE, platform encoding: UTF-8
OS name: "mac os x", version: "11.4", arch: "x86_64", family: "mac"

kwin avatar Jun 04 '21 06:06 kwin

@gnodet Is this fixed by https://github.com/mvndaemon/mvnd/pull/495 as well?

kwin avatar Oct 11 '21 15:10 kwin

@kwin I doubt it unfortunately. I'll try to get back to this issue and investigate more...

gnodet avatar Oct 12 '21 06:10 gnodet