This repository has been archived by the owner on Apr 16, 2021. It is now read-only.
Report actual read count instead of buffer size during transfer #82
+31
−40
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
During large uploads to an Azure Blob Container I received errors like:
[WARNING] Encountered issue during deployment: Failed to deploy artifacts: Could not transfer artifact blahblah from/to repo-id (bs://blob-artifacts/libs-snapshot/): IndexOutOfBoundsException
Running Maven with debug logging showed several warnings:
[DEBUG] Failed to dispatch transfer event 'PUT PROGRESSED bs://blob-artifacts/libs-snapshot/blah/blahblah/1.0.0-SNAPSHOT/blahblah-1.0.0-20210207.042725-1.pom <> C:\Java\blahblah\pom.xml' to org.apache.maven.cli.transfer.ConsoleMavenTransferListener java.lang.IllegalArgumentException: progressed file size cannot be greater than size: 10054 > 5027 at org.apache.commons.lang3.Validate.isTrue (Validate.java:158) at org.apache.maven.cli.transfer.AbstractMavenTransferListener$FileSizeFormat.formatProgress (AbstractMavenTransferListener.java:195) at org.apache.maven.cli.transfer.ConsoleMavenTransferListener.getStatus (ConsoleMavenTransferListener.java:117) at org.apache.maven.cli.transfer.ConsoleMavenTransferListener.transferProgressed (ConsoleMavenTransferListener.java:90) at org.eclipse.aether.internal.impl.SafeTransferListener.transferProgressed (SafeTransferListener.java:105) at org.eclipse.aether.connector.basic.TransferTransportListener.transportProgressed (TransferTransportListener.java:95) at org.eclipse.aether.transport.wagon.WagonTransferListener.transferProgress (WagonTransferListener.java:64) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.lambda$fireTransferProgress$2 (TransferListenerContainerImpl.java:75) at java.util.Vector.forEach (Vector.java:1275) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.fireTransferProgress (TransferListenerContainerImpl.java:75) at com.gkatzioura.maven.cloud.transfer.TransferProgressImpl.progress (TransferProgressImpl.java:36) at com.gkatzioura.maven.cloud.transfer.TransferProgressFileInputStream.read (TransferProgressFileInputStream.java:75) at java.io.FilterInputStream.read (FilterInputStream.java:133) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1364) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1293) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1257) at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry (ExecutionEngine.java:99) at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadFullBlob (CloudBlockBlob.java:892) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:722) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:601) at com.gkatzioura.maven.cloud.abs.AzureStorageRepository.put (AzureStorageRepository.java:123) at com.gkatzioura.maven.cloud.abs.AzureStorageWagon.put (AzureStorageWagon.java:95) at org.eclipse.aether.transport.wagon.WagonTransporter$PutTaskRunner.run (WagonTransporter.java:686) at org.eclipse.aether.transport.wagon.WagonTransporter.execute (WagonTransporter.java:435) at org.eclipse.aether.transport.wagon.WagonTransporter.put (WagonTransporter.java:418) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$PutTaskRunner.runTask (BasicRepositoryConnector.java:554) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:363) at org.eclipse.aether.connector.basic.BasicRepositoryConnector.put (BasicRepositoryConnector.java:287) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:295) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:211) at org.eclipse.aether.internal.impl.DefaultRepositorySystem.deploy (DefaultRepositorySystem.java:371) at org.apache.maven.shared.transfer.artifact.deploy.internal.Maven31ArtifactDeployer.deploy (Maven31ArtifactDeployer.java:122) at org.apache.maven.shared.transfer.artifact.deploy.internal.DefaultArtifactDeployer.deploy (DefaultArtifactDeployer.java:79) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:190) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:134) at org.apache.maven.plugins.deploy.DeployMojo.deployProject (DeployMojo.java:193) at org.apache.maven.plugins.deploy.DeployMojo.execute (DeployMojo.java:177) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) 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:956) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
The reported
IndexOutOfBoundsException
appeared to happen during a subsequent attempt to use the byte buffer with an incorrect length:java.lang.IndexOutOfBoundsException at java.nio.ByteBuffer.wrap (ByteBuffer.java:375) at org.eclipse.aether.transport.wagon.WagonTransferListener.transferProgress (WagonTransferListener.java:64) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.lambda$fireTransferProgress$2 (TransferListenerContainerImpl.java:75) at java.util.Vector.forEach (Vector.java:1275) at com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.fireTransferProgress (TransferListenerContainerImpl.java:75) at com.gkatzioura.maven.cloud.transfer.TransferProgressImpl.progress (TransferProgressImpl.java:36) at com.gkatzioura.maven.cloud.transfer.TransferProgressFileInputStream.read (TransferProgressFileInputStream.java:78) at java.io.FilterInputStream.read (FilterInputStream.java:133) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1392) at com.microsoft.azure.storage.core.Utility.writeToOutputStream (Utility.java:1293) at com.microsoft.azure.storage.blob.BlobOutputStreamInternal.write (BlobOutputStreamInternal.java:663) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:754) at com.microsoft.azure.storage.blob.CloudBlockBlob.upload (CloudBlockBlob.java:601) at com.gkatzioura.maven.cloud.abs.AzureStorageRepository.put (AzureStorageRepository.java:123) at com.gkatzioura.maven.cloud.abs.AzureStorageWagon.put (AzureStorageWagon.java:95) at org.eclipse.aether.transport.wagon.WagonTransporter$PutTaskRunner.run (WagonTransporter.java:686) at org.eclipse.aether.transport.wagon.WagonTransporter.execute (WagonTransporter.java:435) at org.eclipse.aether.transport.wagon.WagonTransporter.put (WagonTransporter.java:418) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$PutTaskRunner.runTask (BasicRepositoryConnector.java:554) at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run (BasicRepositoryConnector.java:363) at org.eclipse.aether.connector.basic.BasicRepositoryConnector.put (BasicRepositoryConnector.java:287) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:295) at org.eclipse.aether.internal.impl.DefaultDeployer.deploy (DefaultDeployer.java:211) at org.eclipse.aether.internal.impl.DefaultRepositorySystem.deploy (DefaultRepositorySystem.java:371) at org.apache.maven.shared.transfer.artifact.deploy.internal.Maven31ArtifactDeployer.deploy (Maven31ArtifactDeployer.java:122) at org.apache.maven.shared.transfer.artifact.deploy.internal.DefaultArtifactDeployer.deploy (DefaultArtifactDeployer.java:79) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:190) at org.apache.maven.shared.transfer.project.deploy.internal.DefaultProjectDeployer.deploy (DefaultProjectDeployer.java:134) at org.apache.maven.plugins.deploy.DeployMojo.deployProject (DeployMojo.java:193) at org.apache.maven.plugins.deploy.DeployMojo.execute (DeployMojo.java:177) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210) 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:956) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
This appears to relate to misreporting of the buffer size length in
TransferProgressFileInputStream
: the code assumed that every call to read would completely fill the requested length, rather than checking and reporting the byte count returned fromsuper.read()
. This PR fixes these issues by checking the returned bytes read. I expect this fixes #50.