From f23566ab8b707de4c3d1d6c8e78679d8c564d8c2 Mon Sep 17 00:00:00 2001 From: Anant Furia Date: Mon, 4 Feb 2019 12:53:20 -0800 Subject: [PATCH 1/3] Instead of using keyCount, changing it to check the size of objectSummaries. For issue: https://github.com/apache/incubator-druid/issues/6980 https://github.com/apache/incubator-druid/issues/6980#issuecomment-460006580 --- .../src/main/java/org/apache/druid/storage/s3/S3Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java index e0a3dac8cae5..b3f48d9c2118 100644 --- a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java +++ b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java @@ -251,7 +251,7 @@ public static S3ObjectSummary getSingleObjectSummary(ServerSideEncryptingAmazonS .withMaxKeys(1); final ListObjectsV2Result result = s3Client.listObjectsV2(request); - if (result.getKeyCount() == 0) { + if (result.getObjectSummaries().size() == 0) { throw new ISE("Cannot find object for bucket[%s] and key[%s]", bucket, key); } final S3ObjectSummary objectSummary = result.getObjectSummaries().get(0); From ce7e40d5ffba203a00adee31608bb2d4dd0ed491 Mon Sep 17 00:00:00 2001 From: Anant Furia Date: Mon, 4 Feb 2019 12:58:35 -0800 Subject: [PATCH 2/3] Changing another usage of keyCount with size of objectSummaries. --- .../java/org/apache/druid/storage/s3/S3DataSegmentMover.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java index 4fd54b499566..2f875df7972d 100644 --- a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java +++ b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java @@ -174,7 +174,7 @@ private void selfCheckingMove( .withPrefix(s3Path) .withMaxKeys(1) ); - if (listResult.getKeyCount() == 0) { + if (listResult.getObjectSummaries().size() == 0) { // should never happen throw new ISE("Unable to list object [s3://%s/%s]", s3Bucket, s3Path); } From 7e215ecb61f6a9cca44f009aac7936c24bb69694 Mon Sep 17 00:00:00 2001 From: Anant Furia Date: Tue, 5 Feb 2019 06:41:49 -0800 Subject: [PATCH 3/3] Adding some comments to explain why using keyCount is not working as expected. --- .../java/org/apache/druid/storage/s3/S3DataSegmentMover.java | 3 +++ .../src/main/java/org/apache/druid/storage/s3/S3Utils.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java index 2f875df7972d..84a76d15e41a 100644 --- a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java +++ b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3DataSegmentMover.java @@ -174,6 +174,9 @@ private void selfCheckingMove( .withPrefix(s3Path) .withMaxKeys(1) ); + // Using getObjectSummaries().size() instead of getKeyCount as, in some cases + // it is observed that even though the getObjectSummaries returns some data + // keyCount is still zero. if (listResult.getObjectSummaries().size() == 0) { // should never happen throw new ISE("Unable to list object [s3://%s/%s]", s3Bucket, s3Path); diff --git a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java index b3f48d9c2118..97858864b149 100644 --- a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java +++ b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/S3Utils.java @@ -251,6 +251,9 @@ public static S3ObjectSummary getSingleObjectSummary(ServerSideEncryptingAmazonS .withMaxKeys(1); final ListObjectsV2Result result = s3Client.listObjectsV2(request); + // Using getObjectSummaries().size() instead of getKeyCount as, in some cases + // it is observed that even though the getObjectSummaries returns some data + // keyCount is still zero. if (result.getObjectSummaries().size() == 0) { throw new ISE("Cannot find object for bucket[%s] and key[%s]", bucket, key); }