Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AmazonS3: Getting warning: S3AbortableInputStream:Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection

Here's the warning that I am getting:

S3AbortableInputStream:Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.

I tried using try with resources but S3ObjectInputStream doesn't seem to close via this method.

 try (S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));       S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();       BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));     ){   //some code here blah blah blah  } 

I also tried below code and explicitly closing but that doesn't work either:

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key)); S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();  try (BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8)); ){      //some code here blah blah      s3ObjectInputStream.close();      s3object.close(); } 

Any help would be appreciated.

PS: I am only reading two lines of the file from S3 and the file has more data.

like image 734
Chirag Sejpal Avatar asked Aug 10 '17 22:08

Chirag Sejpal


2 Answers

I ran into the same problem and the following class helped me

@Data @AllArgsConstructor public class S3ObjectClosable implements Closeable {     private final S3Object s3Object;      @Override     public void close() throws IOException {         s3Object.getObjectContent().abort();         s3Object.close();     } } 

and now you can use without warning

try (final var s3ObjectClosable = new S3ObjectClosable(s3Client.getObject(bucket, key))) {  //same code  }  
like image 44
Dmitry Sleptsov Avatar answered Sep 17 '22 13:09

Dmitry Sleptsov


Got the answer via other medium. Sharing it here:

The warning indicates that you called close() without reading the whole file. This is problematic because S3 is still trying to send the data and you're leaving the connection in a sad state.

There's two options here:

  1. Read the rest of the data from the input stream so the connection can be reused.
  2. Call s3ObjectInputStream.abort() to close the connection without reading the data. The connection won't be reused, so you take some performance hit with the next request to re-create the connection. This may be worth it if it's going to take a long time to read the rest of the file.
like image 182
Chirag Sejpal Avatar answered Sep 17 '22 13:09

Chirag Sejpal