Tejaskriya commented on code in PR #6751:
URL: https://github.com/apache/ozone/pull/6751#discussion_r1630050450
##########
hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java:
##########
@@ -445,47 +447,49 @@ public MultiDeleteResponse
multiDelete(@PathParam("bucket") String bucketName,
OzoneBucket bucket = getBucket(bucketName);
MultiDeleteResponse result = new MultiDeleteResponse();
+ Map<String, ErrorInfo> undeletedKeyResultMap;
+ List<String> deleteKeys = new ArrayList<>();
+
if (request.getObjects() != null) {
for (DeleteObject keyToDelete : request.getObjects()) {
- long startNanos = Time.monotonicNowNanos();
- try {
- bucket.deleteKey(keyToDelete.getKey());
- getMetrics().updateDeleteKeySuccessStats(startNanos);
-
- if (!request.isQuiet()) {
- result.addDeleted(new DeletedObject(keyToDelete.getKey()));
- }
- } catch (OMException ex) {
- if (isAccessDenied(ex)) {
- getMetrics().updateDeleteKeyFailureStats(startNanos);
- result.addError(
- new Error(keyToDelete.getKey(), "PermissionDenied",
- ex.getMessage()));
- } else if (ex.getResult() != ResultCodes.KEY_NOT_FOUND) {
- getMetrics().updateDeleteKeyFailureStats(startNanos);
- result.addError(
- new Error(keyToDelete.getKey(), "InternalError",
- ex.getMessage()));
- } else {
+ deleteKeys.add(keyToDelete.getKey());
+ }
+ long startNanos = Time.monotonicNowNanos();
+ try {
+ undeletedKeyResultMap = bucket.deleteKeys(deleteKeys, true);
+ for (DeleteObject d : request.getObjects()) {
+ if (!(undeletedKeyResultMap.containsKey(d.getKey())) ||
+
undeletedKeyResultMap.get(d.getKey()).getCode().equals(ResultCodes.KEY_NOT_FOUND.name()))
{
+ // if the key is not found, it is assumed to be successfully
deleted
+ deleteKeys.remove(d.getKey());
if (!request.isQuiet()) {
- result.addDeleted(new DeletedObject(keyToDelete.getKey()));
+ result.addDeleted(new DeletedObject(d.getKey()));
}
- getMetrics().updateDeleteKeySuccessStats(startNanos);
+ } else if (undeletedKeyResultMap.containsKey(d.getKey()) &&
+
!undeletedKeyResultMap.get(d.getKey()).getCode().equals(ResultCodes.KEY_NOT_FOUND.name()))
{
+ // All errors other than KEY_NOT_FOUND are returned
+ ErrorInfo error = undeletedKeyResultMap.get(d.getKey());
+ result.addError(new Error(d.getKey(), error.getCode(),
error.getMessage()));
}
Review Comment:
Thanks for the suggestions! I have simplified the checks.
> If you accept the suggestion to avoid filling deleteKeys initially, then
call deleteKeys.add() in the else block instead of deleteKeys.remove() in the
if block.
Regarding this suggestion, as I have mentioned above, we need to construct
the string list of keys to make the bucket.deleteKeys() call. I am not sure if
there is a way to do this without adding all the keys to the list. Please feel
free to give any suggestions!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]