[NO ISSUE]: Handle unexpected EOF when reading from cloud storage
Ext-ref: MB-62987
Change-Id: I3a71d2b93e9e31ce38b345044624c987c77c5d37
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18586
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Hussain Towaileb <hussainht@gmail.com>
Reviewed-by: Michael Blow <mblow@apache.org>
diff --git a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/aws/s3/S3CloudClient.java b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/aws/s3/S3CloudClient.java
index 24d5fa9..319b713 100644
--- a/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/aws/s3/S3CloudClient.java
+++ b/asterixdb/asterix-cloud/src/main/java/org/apache/asterix/cloud/clients/aws/s3/S3CloudClient.java
@@ -129,17 +129,22 @@
public int read(String bucket, String path, long offset, ByteBuffer buffer) throws HyracksDataException {
guardian.checkReadAccess(bucket, path);
profiler.objectGet();
+ long bytesToRead = buffer.remaining();
long readTo = offset + buffer.remaining() - 1;
GetObjectRequest rangeGetObjectRequest = GetObjectRequest.builder().range("bytes=" + offset + "-" + readTo)
.bucket(bucket).key(config.getPrefix() + path).build();
int totalRead = 0;
- int read = 0;
+ int read;
// TODO(htowaileb): add retry logic here
try (ResponseInputStream<GetObjectResponse> response = s3Client.getObject(rangeGetObjectRequest)) {
while (buffer.remaining() > 0) {
read = response.read(buffer.array(), buffer.position(), buffer.remaining());
+ if (read == -1) {
+ throw new IllegalStateException("Unexpected EOF encountered. File: " + path + ", expected bytes: "
+ + bytesToRead + ", bytes read: " + totalRead);
+ }
buffer.position(buffer.position() + read);
totalRead += read;
}