From a85b827333e32dc9abe9b92ee8259077ae7a7f2d Mon Sep 17 00:00:00 2001
From: Xing Lin <linxingnku@gmail.com>
Date: Sat, 2 Dec 2017 13:20:44 -0800
Subject: [PATCH] [s3] Remove unnecessary getObjectMetadata() from
 getS3ObjectAndMetadata() (#1060)

* Remove unnecessary getObjectMetadata() from getS3ObjectAndMetadata()

ObjectMetadata is available from S3Object.getObjectMetadata().
We don't need to send a separate GetObjectMetadata Request (an
HTTP HEAD request), in order to get the metadata. This will double
performance for read workloads.

Signed-off-by: Xing Lin <Xing.Lin@netapp.com>

* Remove one unused import to pass style check.

Signed-off-by: Xing Lin <xing.lin@netapp.com>
(cherry picked from commit 381aaebc83476e1d1c844f6db207f336bea4f8c6)
---
 .../main/java/com/yahoo/ycsb/db/S3Client.java | 23 +++++++------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java b/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
index 3f0c9f65..8f548534 100644
--- a/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
+++ b/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
@@ -51,7 +51,6 @@ import com.amazonaws.services.s3.model.ObjectListing;
 import com.amazonaws.services.s3.model.S3ObjectSummary;
 import com.amazonaws.services.s3.model.SSECustomerKey;
 import com.amazonaws.services.s3.model.PutObjectRequest;
-import com.amazonaws.services.s3.model.GetObjectMetadataRequest;
 
 /**
  * S3 Storage client for YCSB framework.
@@ -350,11 +349,11 @@ public class S3Client extends DB {
       totalSize = sizeArray*fieldCount;
     } else {
       try {
-        Map.Entry<S3Object, ObjectMetadata> objectAndMetadata = getS3ObjectAndMetadata(bucket, key, ssecLocal);
-        int sizeOfFile = (int)objectAndMetadata.getValue().getContentLength();
+        S3Object object = getS3ObjectAndMetadata(bucket, key, ssecLocal);
+        int sizeOfFile = (int)object.getObjectMetadata().getContentLength();
         fieldCount = sizeOfFile/sizeArray;
         totalSize = sizeOfFile;
-        objectAndMetadata.getKey().close();
+        object.close();
       } catch (Exception e){
         System.err.println("Not possible to get the object :"+key);
         e.printStackTrace();
@@ -425,12 +424,12 @@ public class S3Client extends DB {
   protected Status readFromStorage(String bucket, String key,
                                    Map<String, ByteIterator> result, SSECustomerKey ssecLocal) {
     try {
-      Map.Entry<S3Object, ObjectMetadata> objectAndMetadata = getS3ObjectAndMetadata(bucket, key, ssecLocal);
-      InputStream objectData = objectAndMetadata.getKey().getObjectContent(); //consuming the stream
+      S3Object object = getS3ObjectAndMetadata(bucket, key, ssecLocal);
+      InputStream objectData = object.getObjectContent(); //consuming the stream
       // writing the stream to bytes and to results
       result.put(key, new ByteArrayByteIterator(IOUtils.toByteArray(objectData)));
       objectData.close();
-      objectAndMetadata.getKey().close();
+      object.close();
     } catch (Exception e){
       System.err.println("Not possible to get the object "+key);
       e.printStackTrace();
@@ -440,23 +439,17 @@ public class S3Client extends DB {
     return Status.OK;
   }
 
-  private Map.Entry<S3Object, ObjectMetadata> getS3ObjectAndMetadata(String bucket,
+  private S3Object getS3ObjectAndMetadata(String bucket,
                                                                      String key, SSECustomerKey ssecLocal) {
     GetObjectRequest getObjectRequest;
-    GetObjectMetadataRequest getObjectMetadataRequest;
     if (ssecLocal != null) {
       getObjectRequest = new GetObjectRequest(bucket,
               key).withSSECustomerKey(ssecLocal);
-      getObjectMetadataRequest = new GetObjectMetadataRequest(bucket,
-              key).withSSECustomerKey(ssecLocal);
     } else {
       getObjectRequest = new GetObjectRequest(bucket, key);
-      getObjectMetadataRequest = new GetObjectMetadataRequest(bucket,
-              key);
     }
 
-    return new AbstractMap.SimpleEntry<>(s3Client.getObject(getObjectRequest),
-            s3Client.getObjectMetadata(getObjectMetadataRequest));
+    return s3Client.getObject(getObjectRequest);
   }
 
   /**
-- 
GitLab