blob: b6beaafa20a8597f06ce21ffe14b3de0cef58f60 [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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.hadoop.ozone.om.request.s3.multipart;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo;
import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
import org.apache.hadoop.ozone.om.response.s3.multipart.S3MultipartUploadCompleteResponse;
import org.apache.hadoop.ozone.om.response.s3.multipart.S3MultipartUploadCompleteResponseWithFSO;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE;
import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS;
import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.getParentId;
/**
* Handle Multipart upload complete request.
*/
public class S3MultipartUploadCompleteRequestWithFSO
extends S3MultipartUploadCompleteRequest {
private static final Logger LOG =
LoggerFactory.getLogger(S3MultipartUploadCompleteRequestWithFSO.class);
public S3MultipartUploadCompleteRequestWithFSO(OMRequest omRequest,
BucketLayout bucketLayout) {
super(omRequest, bucketLayout);
}
@Override
protected void checkDirectoryAlreadyExists(OzoneManager ozoneManager,
OmBucketInfo omBucketInfo, String keyName,
OMMetadataManager omMetadataManager) throws IOException {
Path keyPath = Paths.get(keyName);
OMFileRequest.OMPathInfoWithFSO pathInfoFSO =
OMFileRequest.verifyDirectoryKeysInPath(omMetadataManager,
omBucketInfo.getVolumeName(), omBucketInfo.getBucketName(),
keyName, keyPath);
// Check for directory exists with same name, if it exists throw error.
if (pathInfoFSO.getDirectoryResult() == DIRECTORY_EXISTS) {
throw new OMException("Can not Complete MPU for file: " + keyName +
" as there is already directory in the given path",
NOT_A_FILE);
}
}
@Override
protected OmKeyInfo getOmKeyInfoFromKeyTable(String dbOzoneFileKey,
String keyName, OMMetadataManager omMetadataManager) throws IOException {
return OMFileRequest.getOmKeyInfoFromFileTable(false,
omMetadataManager, dbOzoneFileKey, keyName);
}
@Override
protected OmKeyInfo getOmKeyInfoFromOpenKeyTable(String dbMultipartKey,
String keyName, OMMetadataManager omMetadataManager) throws IOException {
return OMFileRequest.getOmKeyInfoFromFileTable(true,
omMetadataManager, dbMultipartKey, keyName);
}
@Override
protected void addKeyTableCacheEntry(OMMetadataManager omMetadataManager,
String ozoneKey, OmKeyInfo omKeyInfo, long transactionLogIndex)
throws IOException {
// Add key entry to file table.
OMFileRequest.addFileTableCacheEntry(omMetadataManager, ozoneKey, omKeyInfo,
omKeyInfo.getFileName(), transactionLogIndex);
}
@Override
protected void updatePrefixFSOInfo(OmKeyInfo dbOpenKeyInfo,
OmKeyInfo.Builder builder) {
// updates parentID and fileName
builder.setParentObjectID(dbOpenKeyInfo.getParentObjectID());
builder.setFileName(dbOpenKeyInfo.getFileName());
}
@Override
protected String getDBOzoneKey(OMMetadataManager omMetadataManager,
String volumeName, String bucketName, String keyName)throws IOException {
long parentId =
getParentId(omMetadataManager, volumeName, bucketName, keyName);
String fileName = keyName;
Path filePath = Paths.get(keyName).getFileName();
if (filePath != null) {
fileName = filePath.toString();
}
final long volumeId = omMetadataManager.getVolumeId(volumeName);
final long bucketId = omMetadataManager.getBucketId(volumeName,
bucketName);
return omMetadataManager.getOzonePathKey(volumeId, bucketId,
parentId, fileName);
}
@Override
protected String getDBMultipartOpenKey(String volumeName, String bucketName,
String keyName, String uploadID, OMMetadataManager omMetadataManager)
throws IOException {
long parentId =
getParentId(omMetadataManager, volumeName, bucketName, keyName);
String fileName = keyName;
Path filePath = Paths.get(keyName).getFileName();
if (filePath != null) {
fileName = filePath.toString();
}
final long volumeId = omMetadataManager.getVolumeId(volumeName);
final long bucketId = omMetadataManager.getBucketId(volumeName,
bucketName);
return omMetadataManager.getMultipartKey(volumeId, bucketId,
parentId, fileName, uploadID);
}
@Override
protected S3MultipartUploadCompleteResponse getOmClientResponse(
OzoneManagerProtocolProtos.OMResponse.Builder omResponse,
IOException exception) {
return new S3MultipartUploadCompleteResponseWithFSO(
createErrorOMResponse(omResponse, exception), getBucketLayout());
}
@Override
protected OMClientResponse getOmClientResponse(String multipartKey,
OzoneManagerProtocolProtos.OMResponse.Builder omResponse,
String dbMultipartOpenKey, OmKeyInfo omKeyInfo,
List<OmKeyInfo> unUsedParts, OmBucketInfo omBucketInfo,
RepeatedOmKeyInfo oldKeyVersionsToDelete, long volumeId) {
return new S3MultipartUploadCompleteResponseWithFSO(omResponse.build(),
multipartKey, dbMultipartOpenKey, omKeyInfo, unUsedParts,
getBucketLayout(), omBucketInfo, oldKeyVersionsToDelete, volumeId);
}
@Override
public BucketLayout getBucketLayout() {
return BucketLayout.FILE_SYSTEM_OPTIMIZED;
}
}