[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2021-02-02 Thread Igor Dvorzhak (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17277726#comment-17277726
 ] 

Igor Dvorzhak edited comment on WAGON-575 at 2/3/21, 6:31 AM:
--

[~michael-o] Yes, I think that 8u and 11u both are affected - this bug was 
introduced in [JDK-8145252|https://bugs.openjdk.java.net/browse/JDK-8145252] 
that added TLS v1.3 support in JDK 8 (after backport) and 11+


was (Author: medb):
[~michael-o] Yes, I think that 8u and 11u both are affected - this bug was 
introduced in [JDK-8145252|https://bugs.openjdk.java.net/browse/JDK-8145252] 
that added TLS v1.3 support in JDK 8 and 11+

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)}}
> {{ at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)}}
> {{ at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)}}
> {{ at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke 
> (NativeMethodAccessorImpl.java:62)}}
> {{ at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke 
> (DelegatingMethodAccessorImpl.java:43)}}
> {{ at java.lang.reflect.Method.invoke (Method.java:566)}}
> {{ at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced 
> (Launcher.java:282)}}
> {{ at org.codehaus.plexus.classworlds.launcher.Launcher.launch 
> (Launcher.java:225)}}
> {{

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-12-24 Thread Michael Osipov (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17245396#comment-17245396
 ] 

Michael Osipov edited comment on WAGON-575 at 12/24/20, 6:07 PM:
-

Some assumptions do not apply which I have made. Resets are properly performed. 
I am still rejecting the PR after rereading all comments and our codebsae and 
will explain why:
* First of all {{TransferFailedExceptions}} wrap:
{code}
catch ( IOException | HttpException | InterruptedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );

throw new TransferFailedException( formatTransferFailedMessage( 
url, getProxyInfo() ), e );
}
{code}

Not all I/O exceptions can be recovered. {{HttpException}} is so generic that 
most of the subtypes cannot be recovered from. This is not a way to go. 
Especially not on such a high level because the changeset in the PR applies to 
all stream wagons. Basically [~olegk] has already provide the way to go: One 
needs to utilize 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.createRetryHandler()}}
 inside 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.fillInputData(int, 
InputData)}} to make work what you have in mind. That is something I would 
really consider to include when there is a test depicting that it works. This 
would not require to introduce any new user visiable changes.


was (Author: michael-o):
Some assumptions do not apply which I have made. Resets are properly performed. 
I am still rejecting the PR after rereading all comments and our codebsae and 
will explain why:
* First of all {{TransferFailedException}}s wrap:
{code}
catch ( IOException | HttpException | InterruptedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );

throw new TransferFailedException( formatTransferFailedMessage( 
url, getProxyInfo() ), e );
}
{code}

Not all I/O exceptions can be recovered. {{HttpException}} is so generic that 
most of the subtypes cannot be recovered from. This is not a way to go. 
Especially not on such a high level because the changeset in the PR applies to 
all stream wagons. Basically [~olegk] has already provide the way to go: One 
needs to utilize 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.createRetryHandler()}}
 inside 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.fillInputData(int, 
InputData)}} to make work what you have in mind. That is something I would 
really consider to include when there is a test depicting that it works. This 
would not require to introduce any new user visiable changes.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDe

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-12-11 Thread Michael Osipov (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17245396#comment-17245396
 ] 

Michael Osipov edited comment on WAGON-575 at 12/11/20, 6:13 PM:
-

Some assumptions do not apply which I have made. Resets are properly performed. 
I am still rejecting the PR after rereading all comments and our codebsae and 
will explain why:
* First of all {{TransferFailedException}}s wrap:
{code}
catch ( IOException | HttpException | InterruptedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );

throw new TransferFailedException( formatTransferFailedMessage( 
url, getProxyInfo() ), e );
}
{code}

Not all I/O exceptions can be recovered. {{HttpException}} is so generic that 
most of the subtypes cannot be recovered from. This is not a way to go. 
Especially not on such a high level because the changeset in the PR applies to 
all stream wagons. Basically [~olegk] has already provide the way to go: One 
needs to utilize 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.createRetryHandler()}}
 inside 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.fillInputData(int, 
InputData)}} to make work what you have in mind. That is something I would 
really consider to include when there is a test depicting that it works. This 
would not require to introduce any new user visiable changes.


was (Author: michael-o):
Some assumptions do not apply which I have made. Resets are properly performed. 
I am still rejecting the PR after rereading all comments and our codebsae and 
will explain why:
* First of all {{TransferFailedException}} wraps:
{code}
catch ( IOException | HttpException | InterruptedException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );

throw new TransferFailedException( formatTransferFailedMessage( 
url, getProxyInfo() ), e );
}
{code}

Not all I/O exceptions can be recovered. {{HttpException}} is so generic that 
most of the subtypes cannot be recovered from. This is not a way to go. 
Especially not on such a high level because the changeset in the PR applies to 
all stream wagons. Basically [~olegk] has already provide the way to go. One 
needs to utilize 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.createRetryHandler()}}
 inside 
{{org.apache.maven.wagon.shared.http.AbstractHttpClientWagon.fillInputData(int, 
InputData)}} to make work what you have in mind. That is something I would 
really consider to include when there is a test depicting that it works. This 
would not require to introduce any new user visiable changes.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDe

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-12-07 Thread Igor Dvorzhak (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17245321#comment-17245321
 ] 

Igor Dvorzhak edited comment on WAGON-575 at 12/7/20, 4:19 PM:
---

I can add configuration if retry mechanism is acceptable in general.

It retries only `TransferFailedException` exceptions. I expect that wrong 
credentials are covered by `AuthorizationException` exceptions that are not 
retried.

I think that this PR does not need to deal with `InputStream` and progress 
tracking because it retries whole file download e2e?

I agree that retries on a lower level will be a better and more efficient 
solution, but from discussion in this thread I understood that nobody has a 
time to implement them, so I proposed a quick fix that solves this problem.


was (Author: medb):
I can add configuration if retry mechanism is acceptable in general.

It retries only `TransferFailedException` exceptions. I expect that wrong 
credentials are covered by `AuthorizationException` exceptions that are not 
retried.

These PR is not dealing with `InputStream` and progress tracking because it 
retries whole file download e2e.

I agree that retries on a lower level will be a better and more efficient 
solution, but from discussion in this thread I understood that nobody has a 
time to implement them, so I proposed a quick fix that solves this problem.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:1

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-12-06 Thread Igor Dvorzhak (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17244923#comment-17244923
 ] 

Igor Dvorzhak edited comment on WAGON-575 at 12/7/20, 3:22 AM:
---

I have sent a [PR|https://github.com/apache/maven-wagon/pull/75] that fixes 
this issue by adding high-level retries for failed downloads in Maven Wagon. 
It's less efficient retry mechanism than what was discussed in the comments 
above but much simpler to implement and solves stability issue with my 
multi-hour build.

Please, let me know if this is something that you are willing to consider/merge 
with some additional work (configuration, tests, etc).


was (Author: medb):
I have sent a [PR|https://github.com/apache/maven-wagon/pull/75] that fixes 
this issue by adding high-level retries for failed downloads in Maven Wagon. 
It's less efficient retry mechanism than what was discussed in the comments 
above but much simpler to implement and solves the issue for my build.

Please, let me know if this is something that you are willing to consider/merge 
with some additional work (configuration, tests, etc).

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)}}
> {{ at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)}}
> {{ at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)}}
> {{ at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.in

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-12-06 Thread Igor Dvorzhak (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17244923#comment-17244923
 ] 

Igor Dvorzhak edited comment on WAGON-575 at 12/7/20, 3:21 AM:
---

I have sent a [PR|https://github.com/apache/maven-wagon/pull/75] that fixes 
this issue by adding high-level retries for failed downloads in Maven Wagon. 
It's less efficient retry mechanism than what was discussed in the comments 
above but much simpler to implement and solves the issue for my build.

Please, let me know if this is something that you are willing to consider/merge 
with some additional work (configuration, tests, etc).


was (Author: medb):
I have sent a [PR|https://github.com/apache/maven-wagon/pull/75] that fixes 
this issue by adding high-level retries for failed downloads. It's less 
efficient retry mechanism than what was discussed in the comments above but 
much simpler to implement and solves the issue for my build.

Please, let me know if this is something that you are willing to consider/merge 
with some additional work (configuration, tests, etc).

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)}}
> {{ at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)}}
> {{ at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)}}
> {{ at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)}}
> {{ at jd

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-02-22 Thread Michael Osipov (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17042738#comment-17042738
 ] 

Michael Osipov edited comment on WAGON-575 at 2/22/20 10:55 PM:


That is going to require

* the server to accept ranges
* us to memorize that
* resume the download
* simulate a TCP reset for this to test. I have no idea how to do that in Java 
for now.

and likely other stuff. While this sounds like a very interesting task it takes 
a serious amount of time to implement that.

For an average JAR of a few hundred kilobytes this is overkill.


was (Author: michael-o):
That is going to require

* the server to accept ranges
* us to memorize that
* resume the download
* simulate a TCP reset for this to test. I have no idea how to do that in Java 
for now.

and likely other stuff. While this sounds like a very interesting task it takes 
a serious amount of time to implement that.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)}}
> {{ at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)}}
> {{ at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)}}
> {{ at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke 
> (NativeMethodAccessorImpl.java:62)}}
> {{ at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke 
> (Del

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-02-22 Thread Michael Osipov (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17042738#comment-17042738
 ] 

Michael Osipov edited comment on WAGON-575 at 2/22/20 10:51 PM:


That is going to require

* the server to accept ranges
* us to memorize that
* resume the download
* simulate a TCP reset for this to test. I have no idea how to do that in Java 
for now.

and likely other stuff. While this sounds like a very interesting task it takes 
a serious amount of time to implement that.


was (Author: michael-o):
That is going to require

* the server to accept ranges
* us to memorize that
* resume the download

and likely other stuff. While this sounds like a very interesting task it takes 
a serious amount of time to implement that.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: New Feature
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Minor
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:117)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject 
> (LifecycleModuleBuilder.java:81)}}
> {{ at 
> org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build
>  (SingleThreadedBuilder.java:56)}}
> {{ at org.apache.maven.lifecycle.internal.LifecycleStarter.execute 
> (LifecycleStarter.java:128)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)}}
> {{ at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)}}
> {{ at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)}}
> {{ at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)}}
> {{ at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)}}
> {{ at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)}}
> {{ at jdk.internal.reflect.NativeMethodAccessorImpl.invoke 
> (NativeMethodAccessorImpl.java:62)}}
> {{ at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke 
> (DelegatingMethodAccessorImpl.java:43)}}
> {{ at java.lang.reflect.Method.invoke (Method.java:566)}}
> {{ at org.codehaus.plexus.classworlds.launcher.Launcher

[jira] [Comment Edited] (WAGON-575) Retry for connection issues

2020-01-27 Thread Michael Osipov (Jira)


[ 
https://issues.apache.org/jira/browse/WAGON-575?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17024323#comment-17024323
 ] 

Michael Osipov edited comment on WAGON-575 at 1/27/20 1:06 PM:
---

bq. Does this mean retry for connection issue is beyond the scope of maven, 
wagon, http client or all of them?

As mentioned by Oleg, not at all, but not in HttpClient. This would require 
HttpClient to pipe through the input stream, catch exceptions and handle them 
for you. This is best handled in client code. This has to be implemented in 
Wagon. It is not that easy, these things have to be considered:

* Shall this apply for GET only? Or all idempotent requests?
* Wagon triggers events on state change, this needs to added/handled
* New properties for a retry count have to be added
* Count needs to be maintained with new methods
* How to test this? One needs to send a TCP RST, I was manage to do that by 
killing the Tomcat process. Does not seem to be feasible in unit tests.

Unless someone makes a proposal, this will have a low priority for me since I 
mostly focus on bugs in Wagon.


was (Author: michael-o):
bq. Does this mean retry for connection issue is beyond the scope of maven, 
wagon, http client or all of them?

As mentioned by Oleg, not all all, but not in HttpClient. This would require 
HttpClient to pipe through the input stream, catch exceptions and handle them 
for your. This is best handled in client code. This has to be implemented in 
Wagon. It is not that easy, these things have to be observed:

* Shall this apply for GET only? Or all idempotent requests?
* Wagon triggers events on state change, this needs to added
* New properties for a retry count have to be added
* Counts needs to be maintained with new methods
* How to test this? One needs to send a TCP RST, I was manage to do that by 
killing the Tomcat process. Does not seems to be feasible in unit tests.

Unless someone makes a proposal, this will have a low priority for me since I 
mostly focus on bugs in Wagon.

> Retry for connection issues
> ---
>
> Key: WAGON-575
> URL: https://issues.apache.org/jira/browse/WAGON-575
> Project: Maven Wagon
>  Issue Type: Improvement
>  Components: wagon-http
>Affects Versions: 3.3.4
> Environment: windows and linux
>Reporter: Michael Medin
>Priority: Major
>
> There are a RetryHandler and now also a ServiceRetryHandler but both seem to 
> focus only the handshake and no the data stream.
> In our case we download large artifacts (1+Gb) over a sometimes shaky 
> connection which causes frequent "Connection reset" issues.
> To mitigate this we started to implement retry logic based on this 
> [https://maven.apache.org/wagon/wagon-providers/wagon-http/] document. But 
> seems our retry handler is never invoked when the connection is reset.
> So after some digging into the source code it seems the retryhandler are only 
> used when connecting to the server and once the connection has been 
> established and the HTTP headers have been read there is no retry handling 
> for the reminder stream copy.
> Looking at the code it seems non trivial to add retry for this at is split up 
> so I wanted to know if I am missing something before looking at implementing 
> a PR for this.
>  
> A simple way to simulate this behavior is to start a maven build with some 
> large dependencies and during the download phase just kill the internet 
> connection.
> If you have a RetryHandler enabled it will never be called instead you will 
> get a stack trace along the following:
> {{[ERROR] Failed to execute goal on project test: Could not resolve 
> dependencies for project test:test:jar:1.0.0: Could not transfer artifact 
> REDACTED from/to REDACTED from REDACTED failed: Connection reset -> [Help 1]}}
> {{org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute 
> goal on project test: Could not resolve dependencies for project 
> test:test:jar:1.0.0: Could not transfer artifact REDACTED from/to REDACTED 
> (REDACTED): GET request of: REDACTED from REDACTED failed}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies
>  (LifecycleDependencyResolver.java:269)}}
> {{ at 
> org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies
>  (LifecycleDependencyResolver.java:147)}}
> {{ at 
> org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved
>  (MojoExecutor.java:248)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:202)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:156)}}
> {{ at org.apache.maven.lifecycle.internal.MojoExecutor.execute 
> (MojoExecutor.java:148)}}
> {{ at org.apache.maven.lifecycle.internal.Life