Author: mattryan
Date: Tue Jul 21 18:41:31 2020
New Revision: 1880114

URL: http://svn.apache.org/viewvc?rev=1880114&view=rev
Log:
OAK-9142: Use concurrent request limit option for all Azure interactions

Modified:
    
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
    
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/Utils.java

Modified: 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java?rev=1880114&r1=1880113&r2=1880114&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
 Tue Jul 21 18:41:31 2020
@@ -54,7 +54,6 @@ import com.google.common.collect.Abstrac
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.microsoft.azure.storage.AccessCondition;
-import com.microsoft.azure.storage.RequestOptions;
 import com.microsoft.azure.storage.ResultContinuation;
 import com.microsoft.azure.storage.ResultSegment;
 import com.microsoft.azure.storage.RetryPolicy;
@@ -77,11 +76,11 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.DataRecord;
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
+import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordDownloadOptions;
+import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordUpload;
 import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordUploadException;
 import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordUploadOptions;
 import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordUploadToken;
-import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordDownloadOptions;
-import 
org.apache.jackrabbit.oak.plugins.blob.datastore.directaccess.DataRecordUpload;
 import org.apache.jackrabbit.oak.spi.blob.AbstractDataRecord;
 import org.apache.jackrabbit.oak.spi.blob.AbstractSharedBackend;
 import org.apache.jackrabbit.util.Base64;
@@ -108,11 +107,13 @@ public class AzureBlobStoreBackend exten
     static final long MAX_BINARY_UPLOAD_SIZE = (long) Math.floor(1024L * 1024L 
* 1024L * 1024L * 4.75); // 4.75TB, Azure limit
     private static final int MAX_ALLOWABLE_UPLOAD_URIS = 50000; // Azure limit
     private static final int MAX_UNIQUE_RECORD_TRIES = 10;
+    private static final int DEFAULT_CONCURRENT_REQUEST_COUNT = 2;
+    private static final int MAX_CONCURRENT_REQUEST_COUNT = 50;
 
     private Properties properties;
     private String containerName;
     private String connectionString;
-    private int concurrentRequestCount = 1;
+    private int concurrentRequestCount = DEFAULT_CONCURRENT_REQUEST_COUNT;
     private RetryPolicy retryPolicy;
     private Integer requestTimeout;
     private int httpDownloadURIExpirySeconds = 0; // disabled by default
@@ -131,15 +132,16 @@ public class AzureBlobStoreBackend exten
     }
 
     protected CloudBlobContainer getAzureContainer() throws DataStoreException 
{
-        CloudBlobContainer container = 
Utils.getBlobContainer(connectionString, containerName);
-        RequestOptions requestOptions = 
container.getServiceClient().getDefaultRequestOptions();
-        if (retryPolicy != null) {
+        BlobRequestOptions requestOptions = new BlobRequestOptions();
+        if (null != retryPolicy) {
             requestOptions.setRetryPolicyFactory(retryPolicy);
         }
-        if (requestTimeout != null) {
+        if (null != requestTimeout) {
             requestOptions.setTimeoutIntervalInMs(requestTimeout);
         }
-        return container;
+        requestOptions.setConcurrentRequestCount(concurrentRequestCount);
+
+        return Utils.getBlobContainer(connectionString, containerName, 
requestOptions);
     }
 
     @Override
@@ -164,8 +166,23 @@ public class AzureBlobStoreBackend exten
                 containerName = (String) 
properties.get(AzureConstants.AZURE_BLOB_CONTAINER_NAME);
                 createBlobContainer = 
PropertiesUtil.toBoolean(properties.getProperty(AzureConstants.AZURE_CREATE_CONTAINER),
 true);
                 connectionString = 
Utils.getConnectionStringFromProperties(properties);
-                concurrentRequestCount = 
PropertiesUtil.toInteger(properties.get(AzureConstants.AZURE_BLOB_CONCURRENT_REQUESTS_PER_OPERATION),
 1);
+
+                concurrentRequestCount = PropertiesUtil.toInteger(
+                        
properties.get(AzureConstants.AZURE_BLOB_CONCURRENT_REQUESTS_PER_OPERATION),
+                        DEFAULT_CONCURRENT_REQUEST_COUNT);
+                if (concurrentRequestCount < DEFAULT_CONCURRENT_REQUEST_COUNT) 
{
+                    LOG.warn("Invalid setting [{}] for 
concurrentRequestsPerOperation (too low); resetting to {}",
+                            concurrentRequestCount,
+                            DEFAULT_CONCURRENT_REQUEST_COUNT);
+                    concurrentRequestCount = DEFAULT_CONCURRENT_REQUEST_COUNT;
+                } else if (concurrentRequestCount > 
MAX_CONCURRENT_REQUEST_COUNT) {
+                    LOG.warn("Invalid setting [{}] for 
concurrentRequestsPerOperation (too high); resetting to {}",
+                            concurrentRequestCount,
+                            MAX_CONCURRENT_REQUEST_COUNT);
+                    concurrentRequestCount = MAX_CONCURRENT_REQUEST_COUNT;
+                }
                 LOG.info("Using concurrentRequestsPerOperation={}", 
concurrentRequestCount);
+
                 retryPolicy = 
Utils.getRetryPolicy((String)properties.get(AzureConstants.AZURE_BLOB_MAX_REQUEST_RETRY));
                 if 
(properties.getProperty(AzureConstants.AZURE_BLOB_REQUEST_TIMEOUT) != null) {
                     requestTimeout = 
PropertiesUtil.toInteger(properties.getProperty(AzureConstants.AZURE_BLOB_REQUEST_TIMEOUT),
 RetryPolicy.DEFAULT_CLIENT_RETRY_COUNT);

Modified: 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/Utils.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/Utils.java?rev=1880114&r1=1880113&r2=1880114&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/Utils.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/Utils.java
 Tue Jul 21 18:41:31 2020
@@ -19,6 +19,17 @@
 
 package org.apache.jackrabbit.oak.blob.cloud.azure.blobstorage;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.SocketAddress;
+import java.net.URISyntaxException;
+import java.security.InvalidKeyException;
+import java.util.Properties;
+
 import com.google.common.base.Strings;
 import com.microsoft.azure.storage.CloudStorageAccount;
 import com.microsoft.azure.storage.OperationContext;
@@ -26,21 +37,13 @@ import com.microsoft.azure.storage.Retry
 import com.microsoft.azure.storage.RetryNoRetry;
 import com.microsoft.azure.storage.RetryPolicy;
 import com.microsoft.azure.storage.StorageException;
+import com.microsoft.azure.storage.blob.BlobRequestOptions;
 import com.microsoft.azure.storage.blob.CloudBlobClient;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
 import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
-import java.net.SocketAddress;
-import java.net.URISyntaxException;
-import java.security.InvalidKeyException;
-import java.util.Properties;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public final class Utils {
 
@@ -60,15 +63,34 @@ public final class Utils {
      * @param connectionString connectionString to configure @link {@link 
CloudBlobClient}
      * @return {@link CloudBlobClient}
      */
-    public static CloudBlobClient getBlobClient(final String connectionString) 
throws URISyntaxException, InvalidKeyException {
+    public static CloudBlobClient getBlobClient(@NotNull final String 
connectionString) throws URISyntaxException, InvalidKeyException {
+        return getBlobClient(connectionString, null);
+    }
+
+    public static CloudBlobClient getBlobClient(@NotNull final String 
connectionString,
+                                                @Nullable final 
BlobRequestOptions requestOptions) throws URISyntaxException, 
InvalidKeyException {
         CloudStorageAccount account = 
CloudStorageAccount.parse(connectionString);
         CloudBlobClient client = account.createCloudBlobClient();
+        if (null != requestOptions) {
+            client.setDefaultRequestOptions(requestOptions);
+        }
         return client;
     }
 
-    public static CloudBlobContainer getBlobContainer(final String 
connectionString, final String containerName) throws DataStoreException {
+    public static CloudBlobContainer getBlobContainer(@NotNull final String 
connectionString,
+                                                      @NotNull final String 
containerName) throws DataStoreException {
+        return getBlobContainer(connectionString, containerName, null);
+    }
+
+    public static CloudBlobContainer getBlobContainer(@NotNull final String 
connectionString,
+                                                      @NotNull final String 
containerName,
+                                                      @Nullable final 
BlobRequestOptions requestOptions) throws DataStoreException {
         try {
-            CloudBlobClient client = Utils.getBlobClient(connectionString);
+            CloudBlobClient client = (
+                    (null == requestOptions)
+                            ? Utils.getBlobClient(connectionString)
+                            : Utils.getBlobClient(connectionString, 
requestOptions)
+            );
             return client.getContainerReference(containerName);
         } catch (InvalidKeyException | URISyntaxException | StorageException 
e) {
             throw new DataStoreException(e);


Reply via email to