blob: 593d9d36de2c19a6c2853104da0d2619af097d41 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 org.apache.flink.fs.s3.common.writer;
import org.apache.flink.annotation.Internal;
import com.amazonaws.services.s3.model.CompleteMultipartUploadResult;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PartETag;
import com.amazonaws.services.s3.model.PutObjectResult;
import com.amazonaws.services.s3.model.UploadPartResult;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* An interface that abstracts away the Multi-Part Upload (MPU) functionality offered by S3,
* from the specific implementation of the file system. This is needed so that we can
* accommodate both Hadoop S3 and Presto.
*
* <p>Multipart uploads are convenient for large object. These will be uploaded in
* multiple parts and the mutli-part upload is the equivalent of a transaction, where
* the upload with all its parts will be either committed or discarded.
*/
@Internal
public interface S3AccessHelper {
/**
* Initializes a Multi-Part Upload.
*
* @param key the key whose value we want to upload in parts.
* @return The id of the initiated Multi-Part Upload which will be used during the uploading of the parts.
* @throws IOException
*/
String startMultiPartUpload(String key) throws IOException;
/**
* Uploads a part and associates it with the MPU with the provided {@code uploadId}.
*
* @param key the key this MPU is associated with.
* @param uploadId the id of the MPU.
* @param partNumber the number of the part being uploaded (has to be in [1 ... 10000]).
* @param inputFile the (local) file holding the part to be uploaded.
* @param length the length of the part.
* @return The {@link UploadPartResult result} of the attempt to upload the part.
* @throws IOException
*/
UploadPartResult uploadPart(String key, String uploadId, int partNumber, File inputFile, long length) throws IOException;
/**
* Uploads an object to S3. Contrary to the {@link #uploadPart(String, String, int, File, long)} method,
* this object is not going to be associated to any MPU and, as such, it is not subject to the garbage collection
* policies specified for your S3 bucket.
*
* @param key the key used to identify this part.
* @param inputFile the (local) file holding the data to be uploaded.
* @return The {@link PutObjectResult result} of the attempt to stage the incomplete part.
* @throws IOException
*/
PutObjectResult putObject(String key, File inputFile) throws IOException;
/**
* Finalizes a Multi-Part Upload.
*
* @param key the key identifying the object we finished uploading.
* @param uploadId the id of the MPU.
* @param partETags the list of {@link PartETag ETags} associated with this MPU.
* @param length the size of the uploaded object.
* @param errorCount a counter that will be used to count any failed attempts to commit the MPU.
* @return The {@link CompleteMultipartUploadResult result} of the attempt to finalize the MPU.
* @throws IOException
*/
CompleteMultipartUploadResult commitMultiPartUpload(String key, String uploadId, List<PartETag> partETags, long length, AtomicInteger errorCount) throws IOException;
/**
* Deletes the object associated with the provided key.
*
* @param key The key to be deleted.
* @return {@code true} if the resources were successfully freed, {@code false} otherwise
* (e.g. the file to be deleted was not there).
* @throws IOException
*/
boolean deleteObject(String key) throws IOException;
/**
* Gets the object associated with the provided {@code key} from S3 and
* puts it in the provided {@code targetLocation}.
*
* @param key the key of the object to fetch.
* @param targetLocation the file to read the object to.
* @return The number of bytes read.
* @throws IOException
*/
long getObject(String key, File targetLocation) throws IOException;
/**
* Fetches the metadata associated with a given key on S3.
*
* @param key the key.
* @return The associated {@link ObjectMetadata}.
* @throws IOException
*/
ObjectMetadata getObjectMetadata(String key) throws IOException;
}