com.amazonaws.services.s3.transfer.TransferManagerConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.services.s3.transfer.TransferManagerConfiguration.java

Source

/*
 * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package com.amazonaws.services.s3.transfer;

import com.amazonaws.annotation.SdkTestInternalApi;

import static com.amazonaws.services.s3.internal.Constants.*;

/**
 * Configuration options for how {@link TransferManager} processes requests.
 * <p>
 * The best configuration settings depend on network
 * configuration, latency and bandwidth.
 * The default configuration settings are suitable
 * for most applications, but this class enables developers to experiment with
 * different configurations and tune transfer manager performance.
 */
public class TransferManagerConfiguration {

    /** Default minimum part size for upload parts. */
    @SdkTestInternalApi
    static final int DEFAULT_MINIMUM_UPLOAD_PART_SIZE = 5 * MB;

    /** Default size threshold for when to use multipart uploads.  */
    @SdkTestInternalApi
    static final long DEFAULT_MULTIPART_UPLOAD_THRESHOLD = 16 * MB;

    /** Default size threshold for Amazon S3 object after which multi-part copy is initiated. */
    @SdkTestInternalApi
    static final long DEFAULT_MULTIPART_COPY_THRESHOLD = 5 * GB;

    /** Default minimum size of each part for multi-part copy. */
    @SdkTestInternalApi
    static final long DEFAULT_MINIMUM_COPY_PART_SIZE = 100 * MB;

    /**
     * The minimum part size for upload parts. Decreasing the minimum part size
     * will cause multipart uploads to be split into a larger number of smaller
     * parts. Setting this value too low can have a negative effect on transfer
     * speeds since it will cause extra latency and network communication for
     * each part.
     */
    private long minimumUploadPartSize = DEFAULT_MINIMUM_UPLOAD_PART_SIZE;

    /**
     * The size threshold, in bytes, for when to use multipart uploads. Uploads
     * over this size will automatically use a multipart upload strategy, while
     * uploads smaller than this threshold will use a single connection to
     * upload the whole object.
     * <p>
     * Multipart uploads are easier to recover from and also potentially faster
     * than single part uploads, especially when the upload parts can be
     * uploaded in parallel as with files. Because there is additional network
     * communication, small uploads are still recommended to use a single
     * connection for the upload.
     */
    private long multipartUploadThreshold = DEFAULT_MULTIPART_UPLOAD_THRESHOLD;

    /**
     * The size threshold, in bytes, for when to use multi-part copy. Copy
     * requests for objects over this size will automatically use a multi-part
     * copy strategy, while copy requests for objects smaller than this
     * threshold will use a single connection to copy the whole object.
     */
    private long multipartCopyThreshold = DEFAULT_MULTIPART_COPY_THRESHOLD;

    /**
     * The minimum size in bytes of each part when a multi-part copy operation
     * is carried out. Decreasing the minimum part size will cause a large
     * number of copy part requests being initiated.
     */
    private long multipartCopyPartSize = DEFAULT_MINIMUM_COPY_PART_SIZE;

    /**
     * Option to disable parallel downloads. By default, the value is set to false.
     *
     * <p>
     * TransferManager automatically detects and downloads a multipart object
     * in parallel. Setting this option to true will disable parallel downloads.
     * </p>
     * <p>
     * During parallel downloads, each part is downloaded to a temporary file, gets merged
     * into the final destination file and will be deleted. These temporary files uses disk space temporarily.
     * Disable parallel downloads if your system do not have enough space to store these files during download.
     * </p>
     * <p>
     * Disabling parallel downloads might reduce performance for large files.
     * </p>
     */
    private boolean disableParallelDownloads = false;

    /**
     * Returns the minimum part size for upload parts.
     * Decreasing the minimum part size causes
     * multipart uploads to be split into a larger number
     * of smaller parts. Setting this value too low has a negative effect
     * on transfer speeds, causing extra latency and network
     * communication for each part.
     *
     * @return The minimum part size for upload parts.
     */
    public long getMinimumUploadPartSize() {
        return minimumUploadPartSize;
    }

    /**
     * Sets the minimum part size for upload parts.
     * Decreasing the minimum part size causes
     * multipart uploads to be split into a larger number
     * of smaller parts. Setting this value too low has a negative effect
     * on transfer speeds, causing extra latency and network
     * communication for each part.
     *
     * @param minimumUploadPartSize
     *            The minimum part size for upload parts.
     */
    public void setMinimumUploadPartSize(long minimumUploadPartSize) {
        this.minimumUploadPartSize = minimumUploadPartSize;
    }

    /**
     * Returns the size threshold in bytes for when to use multipart uploads.
     * Uploads over this size will automatically use a multipart upload
     * strategy, while uploads smaller than this threshold will use a single
     * connection to upload the whole object.
     * <p>
     * Multipart uploads are easier to recover from and potentially faster
     * than single part uploads, especially when the upload parts can be
     * uploaded in parallel as with files. Due to additional network
     * communication, small uploads should use a single
     * connection for the upload.
     *
     * @return The size threshold in bytes for when to use multipart uploads.
     */
    public long getMultipartUploadThreshold() {
        return multipartUploadThreshold;
    }

    /**
     * Sets the size threshold in bytes for when to use multipart uploads.
     * Uploads over this size will automatically use a multipart upload
     * strategy, while uploads smaller than this threshold will use a single
     * connection to upload the whole object.
     * <p>
     * Multipart uploads are easier to recover from and potentially faster
     * than single part uploads, especially when the upload parts can be
     * uploaded in parallel as with files. Due to additional network
     * communication, small uploads should use a single
     * connection for the upload.
     *
     * @param multipartUploadThreshold
     *            The size threshold in bytes for when to use multipart
     *            uploads.
     */
    public void setMultipartUploadThreshold(long multipartUploadThreshold) {
        this.multipartUploadThreshold = multipartUploadThreshold;
    }

    /**
     * Returns the minimum size in bytes of each part in a multi-part copy
     * request. Decreasing this size will result in increase in the number of
     * copy part requests to the server.
     *
     * @return The minimum size in bytes for each part in a multi-part copy
     *         request.
     */
    public long getMultipartCopyPartSize() {
        return multipartCopyPartSize;
    }

    /**
     * Sets the minimum part size in bytes for each part in a multi-part copy
     * request. Decreasing this size will result in increase in the number of
     * copy part requests to the server.
     *
     * @param multipartCopyPartSize
     *            The minimum size in bytes for each part in a multi part copy
     *            request.
     */
    public void setMultipartCopyPartSize(long multipartCopyPartSize) {
        this.multipartCopyPartSize = multipartCopyPartSize;
    }

    /**
     * Returns the maximum threshold size of an Amazon S3 object after which the
     * copy operation is carried out using multi-part request.
     *
     * @return The size threshold of an Amazon S3 object for when to use a
     *         multi-part copy
     */
    public long getMultipartCopyThreshold() {
        return multipartCopyThreshold;
    }

    /**
     * Sets the size threshold in bytes for when to use multi-part copy
     * requests. Copy requests for objects over this size will automatically use
     * a multi-part copy strategy, while copy requests for objects smaller than
     * this threshold will use a single connection to copy the whole object.
     *
     * @param multipartCopyThreshold
     *            The size threshold in bytes for when to use multi part copy.
     */
    public void setMultipartCopyThreshold(long multipartCopyThreshold) {
        this.multipartCopyThreshold = multipartCopyThreshold;
    }

    /**
     * Sets the size threshold in bytes for when to use multipart uploads.
     * Uploads over this size will automatically use a multipart upload
     * strategy, while uploads smaller than this threshold will use a single
     * connection to upload the whole object.
     * <p>
     * Multipart uploads are easier to recover from and potentially faster
     * than single part uploads, especially when the upload parts can be
     * uploaded in parallel as with files. Due to additional network
     * communication, small uploads should use a single
     * connection for the upload.
     *
     * This reversed the backward incompatibility with Hadoop 2.7 and S3A filesystem
     * introduced in AWS SDK v1.7.6 by this pull request:
     * https://github.com/aws/aws-sdk-java/pull/201
     *
     * See details (on error message, and fix targeted for Hadoop 2.8) here:
     * - https://issues.apache.org/jira/browse/HADOOP-12420
     * - https://issues.apache.org/jira/browse/HADOOP-12496
     * - https://issues.apache.org/jira/browse/HADOOP-12269
     * Once Hadoop 2.8 (which uses aws-sdk 1.10.6 or later) is used commonly, this may be removed
     *
     * @param multipartUploadThreshold
     *            The size threshold in bytes for when to use multipart
     *            uploads.
     * @deprecated replaced by {@link #setMultipartUploadThreshold(long)}
     */
    @Deprecated
    public void setMultipartUploadThreshold(int multipartUploadThreshold) {
        setMultipartUploadThreshold((long) multipartUploadThreshold);
    }

    /**
     * Returns if the parallel downloads are disabled or not. By default, the value is set to false.
     *
     * <p>
     * TransferManager automatically detects and downloads a multipart object
     * in parallel. Setting this option to true will disable parallel downloads.
     * </p>
     * <p>
     * During parallel downloads, each part is downloaded to a temporary file, gets merged
     * into the final destination file and will be deleted. These temporary files uses disk space temporarily.
     * Disable parallel downloads if your system do not have enough space to store these files during download.
     * </p>
     * <p>
     * Disabling parallel downloads might reduce performance for large files.
     * </p>
     *
     * @return true if parallel downloads are disabled, otherwise false.
     */
    public boolean isDisableParallelDownloads() {
        return disableParallelDownloads;
    }

    /**
     * Sets the option to disable parallel downloads. By default, the value is set to false.
     *
     * <p>
     * TransferManager automatically detects and downloads a multipart object
     * in parallel. Setting this option to true will disable parallel downloads.
     * </p>
     * <p>
     * During parallel downloads, each part is downloaded to a temporary file, gets merged
     * into the final destination file and will be deleted. These temporary files uses disk space temporarily.
     * Disable parallel downloads if your system do not have enough space to store these files during download.
     * </p>
     * <p>
     * Disabling parallel downloads might reduce performance for large files.
     * </p>
     *
     * @param disableParallelDownloads boolean value to disable parallel downloads.
     */
    public void setDisableParallelDownloads(boolean disableParallelDownloads) {
        this.disableParallelDownloads = disableParallelDownloads;
    }
}