in hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java [92:270]
public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, ExecutionContext context) {
final long trxnLogIndex = context.getIndex();
DeleteKeysRequest deleteKeyRequest = getOmRequest().getDeleteKeysRequest();
OzoneManagerProtocolProtos.DeleteKeyArgs deleteKeyArgs =
deleteKeyRequest.getDeleteKeys();
List<String> deleteKeys = new ArrayList<>(deleteKeyArgs.getKeysList());
List<OmKeyInfo> deleteKeysInfo = new ArrayList<>();
Exception exception = null;
OMClientResponse omClientResponse = null;
Result result = null;
Map<String, ErrorInfo> keyToError = new HashMap<>();
OMMetrics omMetrics = ozoneManager.getMetrics();
omMetrics.incNumKeyDeletes();
OMPerformanceMetrics perfMetrics = ozoneManager.getPerfMetrics();
String volumeName = deleteKeyArgs.getVolumeName();
String bucketName = deleteKeyArgs.getBucketName();
Map<String, String> auditMap = new LinkedHashMap<>();
auditMap.put(VOLUME, volumeName);
auditMap.put(BUCKET, bucketName);
List<OmKeyInfo> omKeyInfoList = new ArrayList<>();
// dirList is applicable for FSO implementation
List<OmKeyInfo> dirList = new ArrayList<>();
AuditLogger auditLogger = ozoneManager.getAuditLogger();
OzoneManagerProtocolProtos.UserInfo userInfo = getOmRequest().getUserInfo();
OMResponse.Builder omResponse =
OmResponseUtil.getOMResponseBuilder(getOmRequest());
OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager();
boolean acquiredLock = false;
int indexFailed = 0;
int length = deleteKeys.size();
OzoneManagerProtocolProtos.DeleteKeyArgs.Builder unDeletedKeys =
OzoneManagerProtocolProtos.DeleteKeyArgs.newBuilder()
.setVolumeName(volumeName).setBucketName(bucketName);
boolean deleteStatus = true;
long startNanos = Time.monotonicNowNanos();
try {
long startNanosDeleteKeysResolveBucketLatency = Time.monotonicNowNanos();
ResolvedBucket bucket = ozoneManager.resolveBucketLink(Pair.of(volumeName, bucketName), this);
perfMetrics.setDeleteKeysResolveBucketLatencyNs(
Time.monotonicNowNanos() - startNanosDeleteKeysResolveBucketLatency);
bucket.audit(auditMap);
volumeName = bucket.realVolume();
bucketName = bucket.realBucket();
mergeOmLockDetails(omMetadataManager.getLock()
.acquireWriteLock(BUCKET_LOCK, volumeName, bucketName));
acquiredLock = getOmLockDetails().isLockAcquired();
// Validate bucket and volume exists or not.
validateBucketAndVolume(omMetadataManager, volumeName, bucketName);
String volumeOwner = getVolumeOwner(omMetadataManager, volumeName);
for (indexFailed = 0; indexFailed < length; indexFailed++) {
String keyName = deleteKeyArgs.getKeys(indexFailed);
String objectKey =
omMetadataManager.getOzoneKey(volumeName, bucketName, keyName);
OmKeyInfo omKeyInfo = getOmKeyInfo(ozoneManager, omMetadataManager,
volumeName, bucketName, keyName);
if (omKeyInfo == null) {
deleteStatus = false;
LOG.error("Received a request to delete a Key does not exist {}",
objectKey);
deleteKeys.remove(keyName);
unDeletedKeys.addKeys(keyName);
keyToError.put(keyName, new ErrorInfo(OMException.ResultCodes.KEY_NOT_FOUND.name(), "Key does not exist"));
continue;
}
try {
// check Acl
long startNanosDeleteKeysAclCheckLatency = Time.monotonicNowNanos();
checkKeyAcls(ozoneManager, volumeName, bucketName, keyName,
IAccessAuthorizer.ACLType.DELETE, OzoneObj.ResourceType.KEY,
volumeOwner);
perfMetrics.setDeleteKeysAclCheckLatencyNs(Time.monotonicNowNanos() - startNanosDeleteKeysAclCheckLatency);
OzoneFileStatus fileStatus = getOzoneKeyStatus(
ozoneManager, omMetadataManager, volumeName, bucketName, keyName);
addKeyToAppropriateList(omKeyInfoList, omKeyInfo, dirList,
fileStatus);
deleteKeysInfo.add(omKeyInfo);
} catch (Exception ex) {
deleteStatus = false;
LOG.error("Acl check failed for Key: {}", objectKey, ex);
deleteKeys.remove(keyName);
unDeletedKeys.addKeys(keyName);
keyToError.put(keyName, new ErrorInfo(OMException.ResultCodes.ACCESS_DENIED.name(), "ACL check failed"));
}
}
long quotaReleased = 0;
OmBucketInfo omBucketInfo =
getBucketInfo(omMetadataManager, volumeName, bucketName);
Map<String, OmKeyInfo> openKeyInfoMap = new HashMap<>();
// Mark all keys which can be deleted, in cache as deleted.
quotaReleased =
markKeysAsDeletedInCache(ozoneManager, trxnLogIndex, omKeyInfoList,
dirList, omMetadataManager, quotaReleased, openKeyInfoMap);
omBucketInfo.incrUsedBytes(-quotaReleased);
omBucketInfo.incrUsedNamespace(-1L * omKeyInfoList.size());
final long volumeId = omMetadataManager.getVolumeId(volumeName);
omClientResponse =
getOmClientResponse(ozoneManager, omKeyInfoList, dirList, omResponse,
unDeletedKeys, keyToError, deleteStatus, omBucketInfo, volumeId, openKeyInfoMap);
result = Result.SUCCESS;
long endNanosDeleteKeySuccessLatencyNs = Time.monotonicNowNanos();
perfMetrics.setDeleteKeySuccessLatencyNs(endNanosDeleteKeySuccessLatencyNs - startNanos);
} catch (IOException | InvalidPathException ex) {
result = Result.FAILURE;
exception = ex;
createErrorOMResponse(omResponse, exception);
// reset deleteKeys as request failed.
deleteKeys = new ArrayList<>();
deleteKeysInfo.clear();
// Add all keys which are failed due to any other exception .
for (int i = indexFailed; i < length; i++) {
unDeletedKeys.addKeys(deleteKeyArgs.getKeys(i));
keyToError.put(deleteKeyArgs.getKeys(i), new ErrorInfo(OMException.ResultCodes.INTERNAL_ERROR.name(),
ex.getMessage()));
}
omResponse.setDeleteKeysResponse(
DeleteKeysResponse.newBuilder().setStatus(false)
.setUnDeletedKeys(unDeletedKeys).build()).build();
omClientResponse =
new OMKeysDeleteResponse(omResponse.build(), getBucketLayout());
long endNanosDeleteKeyFailureLatencyNs = Time.monotonicNowNanos();
perfMetrics.setDeleteKeyFailureLatencyNs(endNanosDeleteKeyFailureLatencyNs - startNanos);
} finally {
if (acquiredLock) {
mergeOmLockDetails(omMetadataManager.getLock()
.releaseWriteLock(BUCKET_LOCK, volumeName, bucketName));
}
if (omClientResponse != null) {
omClientResponse.setOmLockDetails(getOmLockDetails());
}
}
addDeletedKeys(auditMap, deleteKeysInfo, unDeletedKeys.getKeysList());
markForAudit(auditLogger,
buildAuditMessage(DELETE_KEYS, auditMap, exception, userInfo));
switch (result) {
case SUCCESS:
omMetrics.decNumKeys(deleteKeys.size());
if (LOG.isDebugEnabled()) {
LOG.debug("Keys delete success. Volume:{}, Bucket:{}, Keys:{}",
volumeName, bucketName, auditMap.get(DELETED_KEYS_LIST));
}
break;
case FAILURE:
omMetrics.incNumKeyDeleteFails();
if (LOG.isDebugEnabled()) {
LOG.debug("Keys delete failed. Volume:{}, Bucket:{}, DeletedKeys:{}, "
+ "UnDeletedKeys:{}", volumeName, bucketName,
auditMap.get(DELETED_KEYS_LIST), auditMap.get(UNDELETED_KEYS_LIST),
exception);
}
break;
default:
LOG.error("Unrecognized Result for OMKeysDeleteRequest: {}",
deleteKeyRequest);
}
return omClientResponse;
}