Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to upload to S3 - SocketTimeoutException #37

Closed
thomasdao opened this issue Apr 10, 2015 · 16 comments
Closed

Unable to upload to S3 - SocketTimeoutException #37

thomasdao opened this issue Apr 10, 2015 · 16 comments

Comments

@thomasdao
Copy link

Hi,

I just upgrade the android SDK to version 2.2.0, but unable to upload file to S3. Downloading and deleting file works, but uploading always has the exception below. We are using TransferManager and unauthenticated Cognito to connect to S3.

Previous version works, not sure any changes we need to be aware of when upgrading to 2.2.0?

Thanks

Unable to execute HTTP request: sendto failed: EPIPE (Broken pipe)
    java.net.SocketException: sendto failed: EPIPE (Broken pipe)
            at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:546)
            at libcore.io.IoBridge.sendto(IoBridge.java:515)
            at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504)
            at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
            at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
            at com.android.okio.Okio$1.write(Okio.java:70)
            at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)
            at com.android.okio.RealBufferedSink.write(RealBufferedSink.java:44)
            at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.write(HttpConnection.java:287)
            at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)
            at com.android.okio.RealBufferedSink$1.write(RealBufferedSink.java:131)
            at com.amazonaws.http.UrlHttpClient.write(UrlHttpClient.java:155)
            at com.amazonaws.http.UrlHttpClient.createConnection(UrlHttpClient.java:143)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:60)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:361)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:211)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3838)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1512)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:123)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:185)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:143)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:53)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.system.ErrnoException: sendto failed: EPIPE (Broken pipe)
            at libcore.io.Posix.sendtoBytes(Native Method)
            at libcore.io.Posix.sendto(Posix.java:176)
            at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
            at libcore.io.IoBridge.sendto(IoBridge.java:513)
            at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504)
            at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
            at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
            at com.android.okio.Okio$1.write(Okio.java:70)
            at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)
            at com.android.okio.RealBufferedSink.write(RealBufferedSink.java:44)
            at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.write(HttpConnection.java:287)
            at com.android.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:116)
            at com.android.okio.RealBufferedSink$1.write(RealBufferedSink.java:131)
            at com.amazonaws.http.UrlHttpClient.write(UrlHttpClient.java:155)
            at com.amazonaws.http.UrlHttpClient.createConnection(UrlHttpClient.java:143)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:60)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:361)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:211)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3838)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1512)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:123)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:185)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:143)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:53)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
@fosterzhang
Copy link
Contributor

The exception shows S3 closes the socket while the client tries to write data into the pipe. It can happen if the request is invalid and is rejected by S3. Would you please share how you use Transfer manager? Do you use OkHttp? A code snippet will help.

@thomasdao
Copy link
Author

Hi @fosterzhang, thanks for fast reply. Here's how I setup a static TransferManager:

public class S3Manager {
    // For single instance
    private static AWSCredentialsProvider sCredProvider;

    // Private attributes
    private static AmazonS3Client s3Client;
    private static TransferManager transferManager;

    public static AWSCredentialsProvider getCredentialProvider() {
        if (sCredProvider == null) {
            try {
                sCredProvider = new CognitoCachingCredentialsProvider(
                        App.getInstance(),
                        "xxxxxxx",
                        "xxxxxxx",
                        "xxxxxxx",
                        null,
                        Regions.US_EAST_1);

                sCredProvider.refresh();
            } catch (Exception e) {
                LogHelper.log(e);
            }
        }

        return sCredProvider;
    }

    public static TransferManager getTransferManager() {
        if (transferManager == null) setup();
        return transferManager;
    }

    public static void setup() {
        if (s3Client == null) {
            initS3Client();
        }
    }

    // Initialize AWS S3 Client
    private static AmazonS3Client initS3Client() {
        if (s3Client == null) {
            AWSCredentialsProvider credProvider = getCredentialProvider();
            if (credProvider == null) return null;

            // Turn off HTTPS because our objects are already encrypted
            ClientConfiguration s3Config = new ClientConfiguration();
            s3Config.setProtocol(Protocol.HTTP);
            s3Client = new AmazonS3Client(credProvider, s3Config);

            // Setup TransferManager from s3Client
            if (s3Client != null) {
                transferManager = new TransferManager(s3Client);
            }
        }

        return s3Client;
    }
}

Then I use this TransferManager to upload file:

TransferManager transferManager = S3Manager.getTransferManager();
Upload upload = transferManager.upload(bucket, key, file);

@fosterzhang
Copy link
Contributor

Hmm, interesting. It should use the default UrlHttpClient. But I don't understand why I see com.android.okio which belongs to OkHttp in the stacktrace. Do you run it on a real device or an emulator?

@thomasdao
Copy link
Author

I tested on real device Google Nexus 5, Android 5.0.1

@thomasdao
Copy link
Author

And btw I don't have any dependency with OkHttp in my app

@fosterzhang
Copy link
Contributor

Thanks for the information. Not sure if it's a platform issue. I will try it on Android 5.0.1. BTW, would you please test your code on early API versions?

@thomasdao
Copy link
Author

I just tested again on Samsung S4 Android 4.4.2, has the same issue. The stacktrace is as below:

AmazonHttpClient﹕ Unable to execute HTTP request: null
    java.net.SocketTimeoutException
            at java.net.PlainSocketImpl.read(PlainSocketImpl.java:492)
            at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
            at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
            at java.io.InputStream.read(InputStream.java:162)
            at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
            at java.io.BufferedInputStream.read(BufferedInputStream.java:227)
            at com.android.okhttp.internal.Util.readAsciiLine(Util.java:316)
            at com.android.okhttp.internal.http.RawHeaders.fromBytes(RawHeaders.java:308)
            at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:135)
            at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:644)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseMessage(HttpURLConnectionImpl.java:499)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:62)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:361)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:211)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3838)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1512)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:123)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:185)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:143)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:53)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

AmazonHttpClient﹕ Unable to execute HTTP request: sendto failed: EPIPE (Broken pipe)
    java.net.SocketException: sendto failed: EPIPE (Broken pipe)
            at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:499)
            at libcore.io.IoBridge.sendto(IoBridge.java:468)
            at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)
            at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
            at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)
            at java.io.BufferedOutputStream.write(BufferedOutputStream.java:131)
            at com.android.okhttp.internal.http.HttpTransport$FixedLengthOutputStream.write(HttpTransport.java:236)
            at com.amazonaws.http.UrlHttpClient.write(UrlHttpClient.java:155)
            at com.amazonaws.http.UrlHttpClient.createConnection(UrlHttpClient.java:143)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:60)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:361)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:211)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3838)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1512)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:123)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:185)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:143)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:53)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

@fosterzhang
Copy link
Contributor

I tested it on emulator and couldn't reproduce the problem. I will test it on real device shortly. Would you please tell me approximate size of the file you upload? Just want to figure out if it's caused by multipart upload.

@thomasdao
Copy link
Author

It happened with both photo and video with various sizes, from 1mb to 13mb

@fosterzhang
Copy link
Contributor

Sorry for the delay. I tested s3 transfer manager on latest 5.1 (level 22) emulator, 4.1.2 (level 16) samsung galaxy tab3, and 4.4.2 (level 19) samsung galaxy tab3. I tried different file sizes as well, but I couldn't reproduce the problem. Would you please share your code sample that can reliably reproduce the problem?

@thomasdao
Copy link
Author

Hi @fosterzhang it's weird that with the same code and test on same device, I can upload to S3 today with no exception... Maybe some changes on server side? Not sure but let's close this issue for now and I will monitor it in the future.

@fosterzhang
Copy link
Contributor

Cool. Feel free to reopen this issue when it comes back to you.

@relisher
Copy link

Just a comment if people reach this question, I was having the same errors until I attached policies to my user that would allow it to upload to S3 in the IAM console. After doing so, I no longer had the Broken Pipe Error

@swats1010
Copy link

Hi @relisher - how do we attach policies. Is it from the code from the android app or from the aws console . Because i an also having this broken pipe issue

@relisher
Copy link

relisher commented Jun 24, 2016

@swats1010 here is the official documentation of how to do it from the CLI, and you can also do it from the aws console:
http://docs.aws.amazon.com/cli/latest/userguide/cli-iam.html

@alokipandey
Copy link

alokipandey commented Mar 2, 2021

I also had this issue and I resolved it while going through multiple stackoverflow /github /aws doc pages. leaving a link to my documentation below for whomsoever may need it.
https://alokipandey.medium.com/upload-to-aws-s3-from-android-s3-integration-customizations-for-large-files-f7b8e2c35b3c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants