diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java index f35b1e01959a..38b623ea903b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java @@ -17,176 +17,97 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; - -import java.io.IOException; import java.util.Collections; import java.util.Map; -import java.util.Objects; -import org.apache.hadoop.hdds.utils.db.cache.CacheKey; -import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.audit.AuditAction; import org.apache.hadoop.ozone.audit.OMAction; -import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OMMetrics; -import org.apache.hadoop.ozone.om.OzoneManager; -import org.apache.hadoop.ozone.om.exceptions.OMException; -import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; -import org.apache.hadoop.ozone.om.request.OMClientRequestUtils; -import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; -import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.tagging.S3DeleteObjectTaggingResponse; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteObjectTaggingRequest; +import org.apache.hadoop.ozone.om.response.s3.tagging.S3DeleteObjectTaggingResponseWithFSO; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteObjectTaggingResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; -import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Handles delete object tagging request. */ -public class S3DeleteObjectTaggingRequest extends OMKeyRequest { - - private static final Logger LOG = - LoggerFactory.getLogger(S3DeleteObjectTaggingRequest.class); +public class S3DeleteObjectTaggingRequest extends S3ObjectTaggingRequest { public S3DeleteObjectTaggingRequest(OMRequest omRequest, BucketLayout bucketLayout) { super(omRequest, bucketLayout); } @Override - public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { - DeleteObjectTaggingRequest deleteObjectTaggingRequest = - super.preExecute(ozoneManager).getDeleteObjectTaggingRequest(); - Objects.requireNonNull(deleteObjectTaggingRequest, "deleteObjectTaggingRequest == null"); - - KeyArgs keyArgs = deleteObjectTaggingRequest.getKeyArgs(); - - String keyPath = keyArgs.getKeyName(); - keyPath = validateAndNormalizeKey(ozoneManager.getEnableFileSystemPaths(), - keyPath, getBucketLayout()); - - KeyArgs.Builder newKeyArgs = - keyArgs.toBuilder() - .setKeyName(keyPath); - - KeyArgs resolvedArgs = resolveBucketAndCheckKeyAcls(newKeyArgs.build(), - ozoneManager, ACLType.WRITE); - return getOmRequest().toBuilder() - .setUserInfo(getUserInfo()) - .setDeleteObjectTaggingRequest( - deleteObjectTaggingRequest.toBuilder().setKeyArgs(resolvedArgs)) - .build(); + protected KeyArgs getTaggingKeyArgs(OMRequest request) { + return request.getDeleteObjectTaggingRequest().getKeyArgs(); + } + + @Override + protected OMRequest.Builder setResolvedKeyArgs( + OMRequest.Builder builder, KeyArgs resolvedArgs) { + return builder.setDeleteObjectTaggingRequest( + getOmRequest().getDeleteObjectTaggingRequest().toBuilder() + .setKeyArgs(resolvedArgs)); + } + + @Override + protected Map getUpdatedTags(KeyArgs keyArgs) { + return Collections.emptyMap(); + } + + @Override + protected OMResponse.Builder setTaggingResponse(OMResponse.Builder builder) { + return builder.setDeleteObjectTaggingResponse( + DeleteObjectTaggingResponse.newBuilder()); + } + + @Override + protected OMClientResponse createSuccessResponse( + OMResponse response, OmKeyInfo omKeyInfo) { + return new S3DeleteObjectTaggingResponse(response, omKeyInfo); + } + + @Override + protected OMClientResponse createErrorResponse( + OMResponse response, BucketLayout bucketLayout) { + return new S3DeleteObjectTaggingResponse(response, bucketLayout); + } + + @Override + protected OMClientResponse createFSOSuccessResponse( + OMResponse response, OmKeyInfo omKeyInfo, + long volumeId, long bucketId) { + return new S3DeleteObjectTaggingResponseWithFSO( + response, omKeyInfo, volumeId, bucketId); + } + + @Override + protected OMClientResponse createFSOErrorResponse( + OMResponse response, BucketLayout bucketLayout) { + return new S3DeleteObjectTaggingResponseWithFSO(response, bucketLayout); + } + + @Override + protected void incrementMetrics(OMMetrics metrics) { + metrics.incNumDeleteObjectTagging(); + } + + @Override + protected void incrementFailMetrics(OMMetrics metrics) { + metrics.incNumDeleteObjectTaggingFails(); + } + + @Override + protected AuditAction getAuditAction() { + return OMAction.DELETE_OBJECT_TAGGING; } @Override - public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) { - final long trxnLogIndex = context.getIndex(); - - DeleteObjectTaggingRequest deleteObjectTaggingRequest = getOmRequest().getDeleteObjectTaggingRequest(); - - KeyArgs keyArgs = deleteObjectTaggingRequest.getKeyArgs(); - String volumeName = keyArgs.getVolumeName(); - String bucketName = keyArgs.getBucketName(); - String keyName = keyArgs.getKeyName(); - - OMMetrics omMetrics = ozoneManager.getMetrics(); - omMetrics.incNumDeleteObjectTagging(); - - Map auditMap = buildKeyArgsAuditMap(keyArgs); - - OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder( - getOmRequest()); - - OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); - boolean acquiredLock = false; - OMClientResponse omClientResponse = null; - IOException exception = null; - Result result = null; - try { - mergeOmLockDetails( - omMetadataManager.getLock() - .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName) - ); - acquiredLock = getOmLockDetails().isLockAcquired(); - - validateBucketAndVolume(omMetadataManager, volumeName, bucketName); - - String dbOzoneKey = - omMetadataManager.getOzoneKey(volumeName, bucketName, keyName); - - OmKeyInfo omKeyInfo = - omMetadataManager.getKeyTable(getBucketLayout()).get(dbOzoneKey); - if (omKeyInfo == null) { - throw new OMException("Key not found", KEY_NOT_FOUND); - } - - // Clear / delete the tags - // Set the UpdateID to the current transactionLogIndex - omKeyInfo = omKeyInfo.toBuilder() - .setTags(Collections.emptyMap()) - .setUpdateID(trxnLogIndex) - .build(); - - // Note: Key modification time is not changed because S3 last modified - // time only changes when there are changes in the object content - - // Update table cache - omMetadataManager.getKeyTable(getBucketLayout()).addCacheEntry( - new CacheKey<>(dbOzoneKey), - CacheValue.get(trxnLogIndex, omKeyInfo) - ); - - omClientResponse = new S3DeleteObjectTaggingResponse( - omResponse.setDeleteObjectTaggingResponse(DeleteObjectTaggingResponse.newBuilder()).build(), - omKeyInfo - ); - - result = Result.SUCCESS; - } catch (IOException ex) { - result = Result.FAILURE; - exception = ex; - omClientResponse = new S3DeleteObjectTaggingResponse( - createErrorOMResponse(omResponse, exception), - getBucketLayout() - ); - } finally { - if (acquiredLock) { - mergeOmLockDetails(omMetadataManager.getLock() - .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); - } - if (omClientResponse != null) { - omClientResponse.setOmLockDetails(getOmLockDetails()); - } - } - - markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( - OMAction.DELETE_OBJECT_TAGGING, auditMap, exception, getOmRequest().getUserInfo() - )); - - switch (result) { - case SUCCESS: - LOG.debug("Delete object tagging success. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName); - break; - case FAILURE: - omMetrics.incNumDeleteObjectTaggingFails(); - if (OMClientRequestUtils.shouldLogClientRequestFailure(exception)) { - LOG.error("Delete object tagging failed. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName, exception); - } - break; - default: - LOG.error("Unrecognized Result for S3DeleteObjectTaggingRequest: {}", - deleteObjectTaggingRequest); - } - - return omClientResponse; + protected String getOperationName() { + return "Delete object tagging"; } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java index 5b62aaa596eb..6636d13e0dfa 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java @@ -17,42 +17,17 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; - -import java.io.IOException; -import java.util.Collections; -import java.util.Map; -import org.apache.hadoop.hdds.utils.db.cache.CacheKey; -import org.apache.hadoop.hdds.utils.db.cache.CacheValue; -import org.apache.hadoop.ozone.om.OMMetadataManager; -import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OzoneManager; -import org.apache.hadoop.ozone.om.exceptions.OMException; -import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes; import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext; import org.apache.hadoop.ozone.om.helpers.BucketLayout; -import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; -import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils; -import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus; -import org.apache.hadoop.ozone.om.request.file.OMFileRequest; -import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; import org.apache.hadoop.ozone.om.response.OMClientResponse; -import org.apache.hadoop.ozone.om.response.s3.tagging.S3DeleteObjectTaggingResponseWithFSO; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteObjectTaggingRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteObjectTaggingResponse; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Handles delete object tagging request for FSO bucket. */ -public class S3DeleteObjectTaggingRequestWithFSO extends S3DeleteObjectTaggingRequest { - - private static final Logger LOG = - LoggerFactory.getLogger(S3DeleteObjectTaggingRequestWithFSO.class); +public class S3DeleteObjectTaggingRequestWithFSO + extends S3DeleteObjectTaggingRequest { public S3DeleteObjectTaggingRequestWithFSO(OMRequest omRequest, BucketLayout bucketLayout) { @@ -60,114 +35,8 @@ public S3DeleteObjectTaggingRequestWithFSO(OMRequest omRequest, } @Override - public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) { - final long trxnLogIndex = context.getIndex(); - - DeleteObjectTaggingRequest deleteObjectTaggingRequest = getOmRequest().getDeleteObjectTaggingRequest(); - - KeyArgs keyArgs = deleteObjectTaggingRequest.getKeyArgs(); - String volumeName = keyArgs.getVolumeName(); - String bucketName = keyArgs.getBucketName(); - String keyName = keyArgs.getKeyName(); - - OMMetrics omMetrics = ozoneManager.getMetrics(); - omMetrics.incNumDeleteObjectTagging(); - - Map auditMap = buildKeyArgsAuditMap(keyArgs); - - OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder( - getOmRequest()); - - OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); - boolean acquiredLock = false; - OMClientResponse omClientResponse = null; - IOException exception = null; - Result result = null; - try { - mergeOmLockDetails( - omMetadataManager.getLock() - .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName) - ); - acquiredLock = getOmLockDetails().isLockAcquired(); - - validateBucketAndVolume(omMetadataManager, volumeName, bucketName); - - OzoneFileStatus keyStatus = OMFileRequest.getOMKeyInfoIfExists( - omMetadataManager, volumeName, bucketName, keyName, 0, - ozoneManager.getDefaultReplicationConfig()); - - if (keyStatus == null) { - throw new OMException("Key not found. Key: " + keyName, ResultCodes.KEY_NOT_FOUND); - } - - boolean isDirectory = keyStatus.isDirectory(); - - if (isDirectory) { - throw new OMException("DeleteObjectTagging is not currently supported for FSO directory", - ResultCodes.NOT_SUPPORTED_OPERATION); - } - - OmKeyInfo omKeyInfo = keyStatus.getKeyInfo(); - // Reverting back the full path to key name - // Eg: a/b/c/d/e/file1 -> file1 - omKeyInfo.setKeyName(OzoneFSUtils.getFileName(keyName)); - final long volumeId = omMetadataManager.getVolumeId(volumeName); - final long bucketId = omMetadataManager.getBucketId(volumeName, bucketName); - final String dbKey = omMetadataManager.getOzonePathKey(volumeId, bucketId, - omKeyInfo.getParentObjectID(), omKeyInfo.getFileName()); - - omKeyInfo = omKeyInfo.toBuilder() - .setTags(Collections.emptyMap()) - .setUpdateID(trxnLogIndex) - .build(); - - // Note: Key modification time is not changed because S3 last modified - // time only changes when there are changes in the object content - - // Update table cache for file table. No need to check directory table since - // DeleteObjectTagging rejects operations on FSO directory - omMetadataManager.getKeyTable(getBucketLayout()) - .addCacheEntry(new CacheKey<>(dbKey), - CacheValue.get(trxnLogIndex, omKeyInfo)); - - omClientResponse = new S3DeleteObjectTaggingResponseWithFSO( - omResponse.setDeleteObjectTaggingResponse(DeleteObjectTaggingResponse.newBuilder()).build(), - omKeyInfo, volumeId, bucketId - ); - - result = Result.SUCCESS; - } catch (IOException ex) { - result = Result.FAILURE; - exception = ex; - omClientResponse = new S3DeleteObjectTaggingResponseWithFSO( - createErrorOMResponse(omResponse, exception), - getBucketLayout() - ); - } finally { - if (acquiredLock) { - mergeOmLockDetails(omMetadataManager.getLock() - .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); - } - if (omClientResponse != null) { - omClientResponse.setOmLockDetails(getOmLockDetails()); - } - } - - switch (result) { - case SUCCESS: - LOG.debug("Delete object tagging success. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName); - break; - case FAILURE: - omMetrics.incNumDeleteObjectTaggingFails(); - LOG.error("Delete object tagging failed. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName, exception); - break; - default: - LOG.error("Unrecognized Result for S3DeleteObjectTaggingRequest: {}", - deleteObjectTaggingRequest); - } - - return omClientResponse; + public OMClientResponse validateAndUpdateCache( + OzoneManager ozoneManager, ExecutionContext context) { + return validateAndUpdateCacheFSO(ozoneManager, context); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3ObjectTaggingRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3ObjectTaggingRequest.java new file mode 100644 index 000000000000..776e15166f34 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3ObjectTaggingRequest.java @@ -0,0 +1,326 @@ +/* + * 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.hadoop.ozone.om.request.s3.tagging; + +import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; + +import java.io.IOException; +import java.util.Map; +import java.util.Objects; +import org.apache.hadoop.hdds.utils.db.cache.CacheKey; +import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.audit.AuditAction; +import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes; +import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; +import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; +import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils; +import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus; +import org.apache.hadoop.ozone.om.request.OMClientRequestUtils; +import org.apache.hadoop.ozone.om.request.file.OMFileRequest; +import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; +import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; +import org.apache.hadoop.ozone.om.response.OMClientResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; +import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Abstract base for S3 object tagging requests (put/delete). + * Consolidates the shared preExecute, validateAndUpdateCache (OBS), + * and validateAndUpdateCacheFSO flows. + */ +public abstract class S3ObjectTaggingRequest extends OMKeyRequest { + + private static final Logger LOG = + LoggerFactory.getLogger(S3ObjectTaggingRequest.class); + + protected S3ObjectTaggingRequest(OMRequest omRequest, BucketLayout bucketLayout) { + super(omRequest, bucketLayout); + } + + // ------------------------------------------------------------------ + // Abstract hooks — each concrete subclass supplies these + // ------------------------------------------------------------------ + + /** Extract {@link KeyArgs} from the operation-specific proto request. */ + protected abstract KeyArgs getTaggingKeyArgs(OMRequest request); + + /** Put the resolved {@link KeyArgs} back into the request builder. */ + protected abstract OMRequest.Builder setResolvedKeyArgs( + OMRequest.Builder builder, KeyArgs resolvedArgs); + + /** Return the new tag map (non-empty for put, empty for delete). */ + protected abstract Map getUpdatedTags(KeyArgs keyArgs); + + /** Set the operation-specific response field on the OMResponse builder. */ + protected abstract OMResponse.Builder setTaggingResponse(OMResponse.Builder builder); + + /** Build a success response for OBS layout. */ + protected abstract OMClientResponse createSuccessResponse(OMResponse response, OmKeyInfo omKeyInfo); + + /** Build an error response for OBS layout. */ + protected abstract OMClientResponse createErrorResponse(OMResponse response, BucketLayout bucketLayout); + + /** Build a success response for FSO layout. */ + protected abstract OMClientResponse createFSOSuccessResponse( + OMResponse response, OmKeyInfo omKeyInfo, long volumeId, long bucketId); + + /** Build an error response for FSO layout. */ + protected abstract OMClientResponse createFSOErrorResponse(OMResponse response, BucketLayout bucketLayout); + + /** Increment the operation counter (e.g. incNumPutObjectTagging). */ + protected abstract void incrementMetrics(OMMetrics metrics); + + /** Increment the failure counter (e.g. incNumPutObjectTaggingFails). */ + protected abstract void incrementFailMetrics(OMMetrics metrics); + + /** Return the audit action for this operation. */ + protected abstract AuditAction getAuditAction(); + + /** Human-readable name used in log messages. */ + protected abstract String getOperationName(); + + // ------------------------------------------------------------------ + // Common preExecute + // ------------------------------------------------------------------ + + @Override + public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { + OMRequest preExecRequest = super.preExecute(ozoneManager); + KeyArgs keyArgs = getTaggingKeyArgs(preExecRequest); + Objects.requireNonNull(keyArgs, "tagging keyArgs == null"); + + String keyPath = keyArgs.getKeyName(); + keyPath = validateAndNormalizeKey( + ozoneManager.getEnableFileSystemPaths(), keyPath, getBucketLayout()); + + KeyArgs.Builder newKeyArgs = keyArgs.toBuilder().setKeyName(keyPath); + + KeyArgs resolvedArgs = resolveBucketAndCheckKeyAcls( + newKeyArgs.build(), ozoneManager, ACLType.WRITE); + + return setResolvedKeyArgs( + getOmRequest().toBuilder().setUserInfo(getUserInfo()), resolvedArgs) + .build(); + } + + // ------------------------------------------------------------------ + // Common OBS validateAndUpdateCache + // ------------------------------------------------------------------ + + @Override + public OMClientResponse validateAndUpdateCache( + OzoneManager ozoneManager, ExecutionContext context) { + final long trxnLogIndex = context.getIndex(); + + KeyArgs keyArgs = getTaggingKeyArgs(getOmRequest()); + String volumeName = keyArgs.getVolumeName(); + String bucketName = keyArgs.getBucketName(); + String keyName = keyArgs.getKeyName(); + + OMMetrics omMetrics = ozoneManager.getMetrics(); + incrementMetrics(omMetrics); + + Map auditMap = buildKeyArgsAuditMap(keyArgs); + OMResponse.Builder omResponse = + OmResponseUtil.getOMResponseBuilder(getOmRequest()); + + OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); + boolean acquiredLock = false; + OMClientResponse omClientResponse = null; + IOException exception = null; + Result result = null; + try { + mergeOmLockDetails(omMetadataManager.getLock() + .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName)); + acquiredLock = getOmLockDetails().isLockAcquired(); + + validateBucketAndVolume(omMetadataManager, volumeName, bucketName); + + String dbOzoneKey = + omMetadataManager.getOzoneKey(volumeName, bucketName, keyName); + + OmKeyInfo omKeyInfo = + omMetadataManager.getKeyTable(getBucketLayout()).get(dbOzoneKey); + if (omKeyInfo == null) { + throw new OMException("Key not found", KEY_NOT_FOUND); + } + + omKeyInfo = omKeyInfo.toBuilder() + .setTags(getUpdatedTags(keyArgs)) + .setUpdateID(trxnLogIndex) + .build(); + + omMetadataManager.getKeyTable(getBucketLayout()).addCacheEntry( + new CacheKey<>(dbOzoneKey), + CacheValue.get(trxnLogIndex, omKeyInfo)); + + omClientResponse = createSuccessResponse( + setTaggingResponse(omResponse).build(), omKeyInfo); + result = Result.SUCCESS; + } catch (IOException ex) { + result = Result.FAILURE; + exception = ex; + omClientResponse = createErrorResponse( + createErrorOMResponse(omResponse, exception), getBucketLayout()); + } finally { + if (acquiredLock) { + mergeOmLockDetails(omMetadataManager.getLock() + .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); + } + if (omClientResponse != null) { + omClientResponse.setOmLockDetails(getOmLockDetails()); + } + } + + markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( + getAuditAction(), auditMap, exception, + getOmRequest().getUserInfo())); + + logResult(result, volumeName, bucketName, keyName, omMetrics, exception, + true); + + return omClientResponse; + } + + // ------------------------------------------------------------------ + // Common FSO validateAndUpdateCache (called by FSO subclasses) + // ------------------------------------------------------------------ + + protected OMClientResponse validateAndUpdateCacheFSO( + OzoneManager ozoneManager, ExecutionContext context) { + final long trxnLogIndex = context.getIndex(); + + KeyArgs keyArgs = getTaggingKeyArgs(getOmRequest()); + String volumeName = keyArgs.getVolumeName(); + String bucketName = keyArgs.getBucketName(); + String keyName = keyArgs.getKeyName(); + + OMMetrics omMetrics = ozoneManager.getMetrics(); + incrementMetrics(omMetrics); + + Map auditMap = buildKeyArgsAuditMap(keyArgs); + OMResponse.Builder omResponse = + OmResponseUtil.getOMResponseBuilder(getOmRequest()); + + OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); + boolean acquiredLock = false; + OMClientResponse omClientResponse = null; + IOException exception = null; + Result result = null; + try { + mergeOmLockDetails(omMetadataManager.getLock() + .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName)); + acquiredLock = getOmLockDetails().isLockAcquired(); + + validateBucketAndVolume(omMetadataManager, volumeName, bucketName); + + OzoneFileStatus keyStatus = OMFileRequest.getOMKeyInfoIfExists( + omMetadataManager, volumeName, bucketName, keyName, 0, + ozoneManager.getDefaultReplicationConfig()); + + if (keyStatus == null) { + throw new OMException( + "Key not found. Key: " + keyName, ResultCodes.KEY_NOT_FOUND); + } + + if (keyStatus.isDirectory()) { + throw new OMException( + getOperationName() + + " is not currently supported for FSO directory", + ResultCodes.NOT_SUPPORTED_OPERATION); + } + + OmKeyInfo omKeyInfo = keyStatus.getKeyInfo(); + omKeyInfo.setKeyName(OzoneFSUtils.getFileName(keyName)); + final long volumeId = omMetadataManager.getVolumeId(volumeName); + final long bucketId = + omMetadataManager.getBucketId(volumeName, bucketName); + final String dbKey = omMetadataManager.getOzonePathKey( + volumeId, bucketId, + omKeyInfo.getParentObjectID(), omKeyInfo.getFileName()); + + omKeyInfo = omKeyInfo.toBuilder() + .setTags(getUpdatedTags(keyArgs)) + .setUpdateID(trxnLogIndex) + .build(); + + omMetadataManager.getKeyTable(getBucketLayout()) + .addCacheEntry(new CacheKey<>(dbKey), + CacheValue.get(trxnLogIndex, omKeyInfo)); + + omClientResponse = createFSOSuccessResponse( + setTaggingResponse(omResponse).build(), + omKeyInfo, volumeId, bucketId); + result = Result.SUCCESS; + } catch (IOException ex) { + result = Result.FAILURE; + exception = ex; + omClientResponse = createFSOErrorResponse( + createErrorOMResponse(omResponse, exception), getBucketLayout()); + } finally { + if (acquiredLock) { + mergeOmLockDetails(omMetadataManager.getLock() + .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); + } + if (omClientResponse != null) { + omClientResponse.setOmLockDetails(getOmLockDetails()); + } + } + + logResult(result, volumeName, bucketName, keyName, omMetrics, exception, + false); + + return omClientResponse; + } + + // ------------------------------------------------------------------ + // Shared logging + // ------------------------------------------------------------------ + + private void logResult(Result result, String volumeName, String bucketName, + String keyName, OMMetrics omMetrics, IOException exception, + boolean checkShouldLog) { + switch (result) { + case SUCCESS: + LOG.debug("{} success. Volume:{}, Bucket:{}, Key:{}.", + getOperationName(), volumeName, bucketName, keyName); + break; + case FAILURE: + incrementFailMetrics(omMetrics); + if (!checkShouldLog + || OMClientRequestUtils.shouldLogClientRequestFailure(exception)) { + LOG.error("{} failed. Volume:{}, Bucket:{}, Key:{}.", + getOperationName(), volumeName, bucketName, keyName, exception); + } + break; + default: + LOG.error("Unrecognized Result for {}: {}", + getClass().getSimpleName(), getOmRequest()); + } + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java index cc8064eee017..62c3f16e6c98 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java @@ -17,174 +17,97 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; - -import java.io.IOException; import java.util.Map; -import java.util.Objects; -import org.apache.hadoop.hdds.utils.db.cache.CacheKey; -import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.audit.AuditAction; import org.apache.hadoop.ozone.audit.OMAction; -import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OMMetrics; -import org.apache.hadoop.ozone.om.OzoneManager; -import org.apache.hadoop.ozone.om.exceptions.OMException; -import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext; import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.KeyValueUtil; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; -import org.apache.hadoop.ozone.om.request.OMClientRequestUtils; -import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; -import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.tagging.S3PutObjectTaggingResponse; +import org.apache.hadoop.ozone.om.response.s3.tagging.S3PutObjectTaggingResponseWithFSO; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PutObjectTaggingRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PutObjectTaggingResponse; -import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Handles put object tagging request. */ -public class S3PutObjectTaggingRequest extends OMKeyRequest { - - private static final Logger LOG = - LoggerFactory.getLogger(S3PutObjectTaggingRequest.class); +public class S3PutObjectTaggingRequest extends S3ObjectTaggingRequest { public S3PutObjectTaggingRequest(OMRequest omRequest, BucketLayout bucketLayout) { super(omRequest, bucketLayout); } @Override - public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { - PutObjectTaggingRequest putObjectTaggingRequest = - super.preExecute(ozoneManager).getPutObjectTaggingRequest(); - Objects.requireNonNull(putObjectTaggingRequest, "putObjectTaggingRequest == null"); - - KeyArgs keyArgs = putObjectTaggingRequest.getKeyArgs(); - - String keyPath = keyArgs.getKeyName(); - keyPath = validateAndNormalizeKey(ozoneManager.getEnableFileSystemPaths(), - keyPath, getBucketLayout()); - - KeyArgs.Builder newKeyArgs = - keyArgs.toBuilder() - .setKeyName(keyPath); - - KeyArgs resolvedArgs = resolveBucketAndCheckKeyAcls(newKeyArgs.build(), - ozoneManager, ACLType.WRITE); - return getOmRequest().toBuilder() - .setUserInfo(getUserInfo()) - .setPutObjectTaggingRequest( - putObjectTaggingRequest.toBuilder().setKeyArgs(resolvedArgs)) - .build(); + protected KeyArgs getTaggingKeyArgs(OMRequest request) { + return request.getPutObjectTaggingRequest().getKeyArgs(); + } + + @Override + protected OMRequest.Builder setResolvedKeyArgs( + OMRequest.Builder builder, KeyArgs resolvedArgs) { + return builder.setPutObjectTaggingRequest( + getOmRequest().getPutObjectTaggingRequest().toBuilder() + .setKeyArgs(resolvedArgs)); + } + + @Override + protected Map getUpdatedTags(KeyArgs keyArgs) { + return KeyValueUtil.getFromProtobuf(keyArgs.getTagsList()); + } + + @Override + protected OMResponse.Builder setTaggingResponse(OMResponse.Builder builder) { + return builder.setPutObjectTaggingResponse( + PutObjectTaggingResponse.newBuilder()); + } + + @Override + protected OMClientResponse createSuccessResponse( + OMResponse response, OmKeyInfo omKeyInfo) { + return new S3PutObjectTaggingResponse(response, omKeyInfo); + } + + @Override + protected OMClientResponse createErrorResponse( + OMResponse response, BucketLayout bucketLayout) { + return new S3PutObjectTaggingResponse(response, bucketLayout); + } + + @Override + protected OMClientResponse createFSOSuccessResponse( + OMResponse response, OmKeyInfo omKeyInfo, + long volumeId, long bucketId) { + return new S3PutObjectTaggingResponseWithFSO( + response, omKeyInfo, volumeId, bucketId); + } + + @Override + protected OMClientResponse createFSOErrorResponse( + OMResponse response, BucketLayout bucketLayout) { + return new S3PutObjectTaggingResponseWithFSO(response, bucketLayout); + } + + @Override + protected void incrementMetrics(OMMetrics metrics) { + metrics.incNumPutObjectTagging(); + } + + @Override + protected void incrementFailMetrics(OMMetrics metrics) { + metrics.incNumPutObjectTaggingFails(); + } + + @Override + protected AuditAction getAuditAction() { + return OMAction.PUT_OBJECT_TAGGING; } @Override - public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) { - final long trxnLogIndex = context.getIndex(); - - PutObjectTaggingRequest putObjectTaggingRequest = getOmRequest().getPutObjectTaggingRequest(); - - KeyArgs keyArgs = putObjectTaggingRequest.getKeyArgs(); - String volumeName = keyArgs.getVolumeName(); - String bucketName = keyArgs.getBucketName(); - String keyName = keyArgs.getKeyName(); - - OMMetrics omMetrics = ozoneManager.getMetrics(); - omMetrics.incNumPutObjectTagging(); - - Map auditMap = buildKeyArgsAuditMap(keyArgs); - - OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder( - getOmRequest()); - - OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); - boolean acquiredLock = false; - OMClientResponse omClientResponse = null; - IOException exception = null; - Result result = null; - try { - mergeOmLockDetails( - omMetadataManager.getLock() - .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName) - ); - acquiredLock = getOmLockDetails().isLockAcquired(); - - validateBucketAndVolume(omMetadataManager, volumeName, bucketName); - - String dbOzoneKey = - omMetadataManager.getOzoneKey(volumeName, bucketName, keyName); - - OmKeyInfo omKeyInfo = - omMetadataManager.getKeyTable(getBucketLayout()).get(dbOzoneKey); - if (omKeyInfo == null) { - throw new OMException("Key not found", KEY_NOT_FOUND); - } - - omKeyInfo = omKeyInfo.toBuilder() - .setTags(KeyValueUtil.getFromProtobuf(keyArgs.getTagsList())) - .setUpdateID(trxnLogIndex) - .build(); - - // Note: Key modification time is not changed because S3 last modified - // time only changes when there are changes in the object content - - // Update table cache - omMetadataManager.getKeyTable(getBucketLayout()).addCacheEntry( - new CacheKey<>(dbOzoneKey), - CacheValue.get(trxnLogIndex, omKeyInfo) - ); - - omClientResponse = new S3PutObjectTaggingResponse( - omResponse.setPutObjectTaggingResponse(PutObjectTaggingResponse.newBuilder()).build(), - omKeyInfo - ); - - result = Result.SUCCESS; - } catch (IOException ex) { - result = Result.FAILURE; - exception = ex; - omClientResponse = new S3PutObjectTaggingResponse( - createErrorOMResponse(omResponse, exception), - getBucketLayout() - ); - } finally { - if (acquiredLock) { - mergeOmLockDetails(omMetadataManager.getLock() - .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); - } - if (omClientResponse != null) { - omClientResponse.setOmLockDetails(getOmLockDetails()); - } - } - - markForAudit(ozoneManager.getAuditLogger(), buildAuditMessage( - OMAction.PUT_OBJECT_TAGGING, auditMap, exception, getOmRequest().getUserInfo() - )); - - switch (result) { - case SUCCESS: - LOG.debug("Put object tagging success. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName); - break; - case FAILURE: - omMetrics.incNumPutObjectTaggingFails(); - if (OMClientRequestUtils.shouldLogClientRequestFailure(exception)) { - LOG.error("Put object tagging failed. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName, exception); - } - break; - default: - LOG.error("Unrecognized Result for S3PutObjectTaggingRequest: {}", - putObjectTaggingRequest); - } - - return omClientResponse; + protected String getOperationName() { + return "Put object tagging"; } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java index a771bf2b24ae..c26c6b49e634 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java @@ -17,42 +17,17 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; - -import java.io.IOException; -import java.util.Map; -import org.apache.hadoop.hdds.utils.db.cache.CacheKey; -import org.apache.hadoop.hdds.utils.db.cache.CacheValue; -import org.apache.hadoop.ozone.om.OMMetadataManager; -import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OzoneManager; -import org.apache.hadoop.ozone.om.exceptions.OMException; -import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes; import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext; import org.apache.hadoop.ozone.om.helpers.BucketLayout; -import org.apache.hadoop.ozone.om.helpers.KeyValueUtil; -import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; -import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils; -import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus; -import org.apache.hadoop.ozone.om.request.file.OMFileRequest; -import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; import org.apache.hadoop.ozone.om.response.OMClientResponse; -import org.apache.hadoop.ozone.om.response.s3.tagging.S3PutObjectTaggingResponseWithFSO; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PutObjectTaggingRequest; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PutObjectTaggingResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Handles put object tagging request for FSO bucket. */ -public class S3PutObjectTaggingRequestWithFSO extends S3PutObjectTaggingRequest { - - private static final Logger LOG = - LoggerFactory.getLogger(S3PutObjectTaggingRequestWithFSO.class); +public class S3PutObjectTaggingRequestWithFSO + extends S3PutObjectTaggingRequest { public S3PutObjectTaggingRequestWithFSO(OMRequest omRequest, BucketLayout bucketLayout) { @@ -60,114 +35,8 @@ public S3PutObjectTaggingRequestWithFSO(OMRequest omRequest, } @Override - public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) { - final long trxnLogIndex = context.getIndex(); - - PutObjectTaggingRequest putObjectTaggingRequest = getOmRequest().getPutObjectTaggingRequest(); - - KeyArgs keyArgs = putObjectTaggingRequest.getKeyArgs(); - String volumeName = keyArgs.getVolumeName(); - String bucketName = keyArgs.getBucketName(); - String keyName = keyArgs.getKeyName(); - - OMMetrics omMetrics = ozoneManager.getMetrics(); - omMetrics.incNumPutObjectTagging(); - - Map auditMap = buildKeyArgsAuditMap(keyArgs); - - OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder( - getOmRequest()); - - OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); - boolean acquiredLock = false; - OMClientResponse omClientResponse = null; - IOException exception = null; - Result result = null; - try { - mergeOmLockDetails( - omMetadataManager.getLock() - .acquireWriteLock(BUCKET_LOCK, volumeName, bucketName) - ); - acquiredLock = getOmLockDetails().isLockAcquired(); - - validateBucketAndVolume(omMetadataManager, volumeName, bucketName); - - OzoneFileStatus keyStatus = OMFileRequest.getOMKeyInfoIfExists( - omMetadataManager, volumeName, bucketName, keyName, 0, - ozoneManager.getDefaultReplicationConfig()); - - if (keyStatus == null) { - throw new OMException("Key not found. Key: " + keyName, ResultCodes.KEY_NOT_FOUND); - } - - boolean isDirectory = keyStatus.isDirectory(); - - if (isDirectory) { - throw new OMException("PutObjectTagging is not currently supported for FSO directory", - ResultCodes.NOT_SUPPORTED_OPERATION); - } - - OmKeyInfo omKeyInfo = keyStatus.getKeyInfo(); - // Reverting back the full path to key name - // Eg: a/b/c/d/e/file1 -> file1 - omKeyInfo.setKeyName(OzoneFSUtils.getFileName(keyName)); - final long volumeId = omMetadataManager.getVolumeId(volumeName); - final long bucketId = omMetadataManager.getBucketId(volumeName, bucketName); - final String dbKey = omMetadataManager.getOzonePathKey(volumeId, bucketId, - omKeyInfo.getParentObjectID(), omKeyInfo.getFileName()); - - omKeyInfo = omKeyInfo.toBuilder() - .setTags(KeyValueUtil.getFromProtobuf(keyArgs.getTagsList())) - .setUpdateID(trxnLogIndex) - .build(); - - // Note: Key modification time is not changed because S3 last modified - // time only changes when there are changes in the object content - - // Update table cache for file table. No need to check directory table since - // PutObjectTagging rejects operations on FSO directory - omMetadataManager.getKeyTable(getBucketLayout()) - .addCacheEntry(new CacheKey<>(dbKey), - CacheValue.get(trxnLogIndex, omKeyInfo)); - - omClientResponse = new S3PutObjectTaggingResponseWithFSO( - omResponse.setPutObjectTaggingResponse(PutObjectTaggingResponse.newBuilder()).build(), - omKeyInfo, volumeId, bucketId - ); - - result = Result.SUCCESS; - } catch (IOException ex) { - result = Result.FAILURE; - exception = ex; - omClientResponse = new S3PutObjectTaggingResponseWithFSO( - createErrorOMResponse(omResponse, exception), - getBucketLayout() - ); - } finally { - if (acquiredLock) { - mergeOmLockDetails(omMetadataManager.getLock() - .releaseWriteLock(BUCKET_LOCK, volumeName, bucketName)); - } - if (omClientResponse != null) { - omClientResponse.setOmLockDetails(getOmLockDetails()); - } - } - - switch (result) { - case SUCCESS: - LOG.debug("Put object tagging success. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName); - break; - case FAILURE: - omMetrics.incNumPutObjectTaggingFails(); - LOG.error("Put object tagging failed. Volume:{}, Bucket:{}, Key:{}.", volumeName, - bucketName, keyName, exception); - break; - default: - LOG.error("Unrecognized Result for S3PutObjectTaggingRequest: {}", - putObjectTaggingRequest); - } - - return omClientResponse; + public OMClientResponse validateAndUpdateCache( + OzoneManager ozoneManager, ExecutionContext context) { + return validateAndUpdateCacheFSO(ozoneManager, context); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java index 77858c0a50b5..c62371b5f8ae 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java @@ -37,7 +37,6 @@ import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; -import org.apache.hadoop.ozone.om.OMMetadataManager; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmMetadataManagerImpl; import org.apache.hadoop.ozone.om.OzoneManager; @@ -49,6 +48,7 @@ import org.apache.hadoop.ozone.om.helpers.QuotaUtil; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.request.OMClientRequest; +import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.snapshot.OMSnapshotCreateResponse; @@ -173,7 +173,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut snapshotInfo.setLastTransactionInfo(txnBytes); // Snapshot referenced size should be bucket's used bytes OmBucketInfo omBucketInfo = - getBucketInfo(omMetadataManager, volumeName, bucketName); + OMKeyRequest.getBucketInfo(omMetadataManager, volumeName, bucketName); snapshotInfo.setReferencedReplicatedSize(omBucketInfo.getUsedBytes()); // Snapshot referenced size in this case is an *estimate* inferred from @@ -314,19 +314,6 @@ private void removeSnapshotInfoFromSnapshotChainManager( } } - /** - * Same as OMKeyRequest#getBucketInfo. - */ - protected OmBucketInfo getBucketInfo(OMMetadataManager omMetadataManager, - String volume, String bucket) { - String bucketKey = omMetadataManager.getBucketKey(volume, bucket); - - CacheValue value = omMetadataManager.getBucketTable() - .getCacheValue(new CacheKey<>(bucketKey)); - - return value != null ? value.getCacheValue() : null; - } - /** * Estimate the sum of data sizes of all keys in the bucket by dividing * bucket used size (w/ replication) by the replication factor of the bucket.