diff --git a/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java b/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java index 43b25cbba8..06f049f620 100644 --- a/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java +++ b/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3Backend.java @@ -48,6 +48,7 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.HttpMethod; import com.amazonaws.SdkClientException; import com.amazonaws.regions.Regions; +import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.S3ClientOptions; import com.amazonaws.services.s3.model.BucketAccelerateConfiguration; @@ -130,10 +131,10 @@ public class S3Backend extends AbstractSharedBackend { static final long MAX_BINARY_UPLOAD_SIZE = 1024L * 1024L * 1024L * 1024L * 5L; // 5TB, AWS limitation private static final int MAX_ALLOWABLE_UPLOAD_URIS = 10000; // AWS limitation - private AmazonS3Client s3service; + private AmazonS3 s3service; // needed only in case of transfer acceleration is enabled for presigned URIs - private AmazonS3Client s3PresignService; + private AmazonS3 s3PresignService; private String bucket; @@ -1159,19 +1160,19 @@ public class S3Backend extends AbstractSharedBackend { * S3DataRecord which lazily retrieves the input stream of the record. */ static class S3DataRecord extends AbstractDataRecord { - private AmazonS3Client s3service; + private AmazonS3 s3service; private long length; private long lastModified; private String bucket; private boolean isMeta; - public S3DataRecord(AbstractSharedBackend backend, AmazonS3Client s3service, String bucket, + public S3DataRecord(AbstractSharedBackend backend, AmazonS3 s3service, String bucket, DataIdentifier key, long lastModified, long length) { this(backend, s3service, bucket, key, lastModified, length, false); } - public S3DataRecord(AbstractSharedBackend backend, AmazonS3Client s3service, String bucket, + public S3DataRecord(AbstractSharedBackend backend, AmazonS3 s3service, String bucket, DataIdentifier key, long lastModified, long length, boolean isMeta) { super(backend, key); diff --git a/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/Utils.java b/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/Utils.java index 40d756b436..cb000753f1 100644 --- a/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/Utils.java +++ b/oak-blob-cloud/src/main/java/org/apache/jackrabbit/oak/blob/cloud/s3/Utils.java @@ -28,10 +28,13 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.util.StringUtils; @@ -80,24 +83,14 @@ public final class Utils { * @param prop properties to configure @link {@link AmazonS3Client} * @return {@link AmazonS3Client} */ - public static AmazonS3Client openService(final Properties prop) { + public static AmazonS3 openService(final Properties prop) { String accessKey = prop.getProperty(S3Constants.ACCESS_KEY); String secretKey = prop.getProperty(S3Constants.SECRET_KEY); - AmazonS3Client s3service = null; - if (StringUtils.isNullOrEmpty(accessKey) - || StringUtils.isNullOrEmpty(secretKey)) { - LOG.info("Configuring Amazon Client from environment"); - s3service = new AmazonS3Client(getClientConfiguration(prop)); - } else { - LOG.info("Configuring Amazon Client from property file."); - AWSCredentials credentials = new BasicAWSCredentials(accessKey, - secretKey); - s3service = new AmazonS3Client(credentials, - getClientConfiguration(prop)); - } + String region = prop.getProperty(S3Constants.S3_REGION); String endpoint = null; String propEndPoint = prop.getProperty(S3Constants.S3_END_POINT); + if ((propEndPoint != null) & !"".equals(propEndPoint)) { endpoint = propEndPoint; } else { @@ -118,14 +111,37 @@ public final class Utils { endpoint = S3 + DOT + region + DOT + AWSDOTCOM; } } + /* * setting endpoint to remove latency of redirection. If endpoint is * not set, invocation first goes us standard region, which * redirects it to correct location. */ - s3service.setEndpoint(endpoint); LOG.info("S3 service endpoint [{}] ", endpoint); - return s3service; + + AmazonS3 s3Client = null; + AmazonS3ClientBuilder amazonS3ClientBuilder = AmazonS3ClientBuilder + .standard() + .withClientConfiguration(getClientConfiguration(prop)) + .withEndpointConfiguration( + new AmazonS3ClientBuilder.EndpointConfiguration(endpoint, region) + ); + + if (!StringUtils.isNullOrEmpty(accessKey) + && !StringUtils.isNullOrEmpty(secretKey)) { + + LOG.info("Configuring Amazon Client from property file."); + AWSCredentials credentials = new BasicAWSCredentials(accessKey, + secretKey); + amazonS3ClientBuilder.withCredentials(new AWSStaticCredentialsProvider(credentials)); + + } else { + LOG.info("Amazon Client configured from environment"); + } + + s3Client = amazonS3ClientBuilder.build(); + + return s3Client; } /** @@ -149,8 +165,8 @@ public final class Utils { if (bucketExists) break; try { Thread.sleep(100 * tries); + } catch (InterruptedException e) { } - catch (InterruptedException e) { } } return bucketExists; } diff --git a/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3DataStoreUtils.java b/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3DataStoreUtils.java index cbef6561d1..8e1845b6f6 100644 --- a/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3DataStoreUtils.java +++ b/oak-blob-cloud/src/test/java/org/apache/jackrabbit/oak/blob/cloud/s3/S3DataStoreUtils.java @@ -34,7 +34,7 @@ import java.util.Properties; import javax.net.ssl.HttpsURLConnection; -import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.S3ObjectSummary; @@ -152,9 +152,9 @@ public class S3DataStoreUtils extends DataStoreUtils { public static void deleteBucket(String bucket, Date date) throws Exception { log.info("cleaning bucket [" + bucket + "]"); Properties props = getS3Config(); - AmazonS3Client s3service = Utils.openService(props); + AmazonS3 s3service = Utils.openService(props); TransferManager tmx = new TransferManager(s3service); - if (s3service.doesBucketExist(bucket)) { + if (s3service.doesBucketExistV2(bucket)) { for (int i = 0; i < 4; i++) { tmx.abortMultipartUploads(bucket, date); ObjectListing prevObjectListing = s3service.listObjects(bucket);