Skip to content
This repository was archived by the owner on Apr 16, 2021. It is now read-only.

Report actual read count instead of buffer size during transfer - #82

Open
wrosenuance wants to merge 4 commits into
gkatzioura:masterfrom
wrosenuance:fix-progress-reporting
Open

Report actual read count instead of buffer size during transfer#82
wrosenuance wants to merge 4 commits into
gkatzioura:masterfrom
wrosenuance:fix-progress-reporting

Conversation

@wrosenuance

@wrosenuance wrosenuance commented Feb 7, 2021

Copy link
Copy Markdown

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 from super.read(). This PR fixes these issues by checking the returned bytes read. I expect this fixes #50.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

com.gkatzioura.maven.cloud.listener.TransferListenerContainerImpl.lambda$fireTransferProgress produces java.lang.IndexOutOfBoundsException

1 participant