This is an automated email from the ASF dual-hosted git repository.

sammichen pushed a commit to branch HDDS-8342
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-8342 by this push:
     new 99ebb223793 HDDS-12790. Mark a delete operation is performed by 
Lifecycle Service (#9403)
99ebb223793 is described below

commit 99ebb223793e6613609ffa1a49f7bdcca8292f8f
Author: XiChen <[email protected]>
AuthorDate: Thu Dec 4 15:15:25 2025 +0800

    HDDS-12790. Mark a delete operation is performed by Lifecycle Service 
(#9403)
---
 .../java/org/apache/hadoop/ozone/OzoneConsts.java  |  1 +
 .../AbstractRootedOzoneFileSystemTestWithFSO.java  |  3 +-
 .../hadoop/fs/ozone/TestRootedDDSWithFSO.java      |  9 ++-
 .../org/apache/hadoop/ozone/om/TestOmMetrics.java  | 14 ++--
 .../src/main/proto/OmClientProtocol.proto          |  7 ++
 .../java/org/apache/hadoop/ozone/om/OMMetrics.java | 57 +++++++++++++++
 .../hadoop/ozone/om/TrashOzoneFileSystem.java      |  1 +
 .../key/OMDirectoriesPurgeRequestWithFSO.java      |  2 +
 .../ozone/om/request/key/OMKeysDeleteRequest.java  | 43 ++++++++---
 .../ozone/om/service/KeyLifecycleService.java      |  6 +-
 .../om/request/key/TestOMKeysDeleteRequest.java    | 84 +++++++++++++++++++---
 .../key/TestOMKeysDeleteRequestWithFSO.java        | 47 ++++++++----
 12 files changed, 232 insertions(+), 42 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
index d03cc2a22fe..d9d24b5904d 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
@@ -303,6 +303,7 @@ private OzoneConsts() {
   public static final String TENANT = "tenant";
   public static final String USER_PREFIX = "userPrefix";
   public static final String REWRITE_GENERATION = "rewriteGeneration";
+  public static final String DELETED_KEY_SOURCE_TYPE = "deletedKeySourceType";
 
   // For multi-tenancy
   public static final String TENANT_ID_USERNAME_DELIMITER = "$";
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTestWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTestWithFSO.java
index 787d3fde3b5..ecb8947ae14 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTestWithFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTestWithFSO.java
@@ -140,6 +140,7 @@ void testDeleteVolumeAndBucket() throws IOException {
     Path volumePath1 = new Path(OZONE_URI_DELIMITER + volumeStr1);
     String bucketStr2 = "bucket3";
     Path bucketPath2 = new Path(volumePath1, bucketStr2);
+    int totalFilesCount = 6;
 
     for (int i = 1; i <= 5; i++) {
       String dirStr1 = "dir1" + i;
@@ -177,7 +178,7 @@ void testDeleteVolumeAndBucket() throws IOException {
     assertTrue(getFs().delete(bucketPath2, true));
     assertTrue(getFs().delete(volumePath1, false));
     long deletes = getOMMetrics().getNumKeyDeletes();
-    assertEquals(prevDeletes + 1, deletes);
+    assertEquals(prevDeletes + totalFilesCount, deletes);
   }
 
   /**
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedDDSWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedDDSWithFSO.java
index 1806e2be9dd..20575d91453 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedDDSWithFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedDDSWithFSO.java
@@ -82,7 +82,8 @@ public class TestRootedDDSWithFSO {
   @BeforeAll
   public static void init() throws Exception {
     OzoneConfiguration conf = new OzoneConfiguration();
-    conf.setInt(OMConfigKeys.OZONE_DIR_DELETING_SERVICE_INTERVAL, 1);
+    conf.setStrings(OMConfigKeys.OZONE_DIR_DELETING_SERVICE_INTERVAL, "5s");
+    conf.setInt(OMConfigKeys.OZONE_THREAD_NUMBER_DIR_DELETION, 1);
     conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 100,
         TimeUnit.MILLISECONDS);
     conf.setBoolean(OZONE_ACL_ENABLED, true);
@@ -190,8 +191,12 @@ public void testDeleteVolumeAndBucket() throws Exception {
     long prevDeletes = omMetrics.getNumKeyDeletes();
     assertTrue(fs.delete(bucketPath, true));
     assertTrue(fs.delete(volumePath, false));
+    GenericTestUtils.waitFor(() -> {
+      long keyCount = omMetrics.getNumKeys();
+      return keyCount == 0;
+    }, 1000, 30000);
     long deletes = omMetrics.getNumKeyDeletes();
-    assertEquals(prevDeletes + 1, deletes);
+    assertEquals(prevDeletes + totalDirCount + totalFilesCount, deletes);
 
     // After Delete
     checkPath(volumePath);
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java
index cdcd38c6648..f75b779d372 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmMetrics.java
@@ -476,6 +476,7 @@ public void testDirectoryOps(BucketLayout bucketLayout) 
throws Exception {
     long initialNumCreateDirectory = getLongCounter("NumCreateDirectory", 
omMetrics);
     long initialNumKeyDeletes = getLongCounter("NumKeyDeletes", omMetrics);
     long initialNumKeyRenames = getLongCounter("NumKeyRenames", omMetrics);
+    long numKeysDeleted = 0;
 
     // How long to wait for directory deleting service to clean up the files 
before aborting the test.
     final int timeoutMillis =
@@ -530,6 +531,7 @@ public void testDirectoryOps(BucketLayout bucketLayout) 
throws Exception {
     assertEquals(initialNumKeyRenames + expectedRenames, 
getLongCounter("NumKeyRenames", omMetrics));
 
     // Delete metric should be decremented by directory deleting service in 
the background.
+    long numKeysBeforeDeletion = getLongCounter("NumKeys", omMetrics);
     fs.delete(dirPath.getParent(), true);
     GenericTestUtils.waitFor(() -> {
       long keyCount = getLongCounter("NumKeys", getMetrics("OMMetrics"));
@@ -539,8 +541,8 @@ public void testDirectoryOps(BucketLayout bucketLayout) 
throws Exception {
     assertEquals(initialNumKeys, getLongCounter("NumKeys", omMetrics));
     // This is the number of times the create directory command was given, not 
the current number of directories.
     assertEquals(initialNumCreateDirectory + 1, 
getLongCounter("NumCreateDirectory", omMetrics));
-    // Directory delete counts as key delete. One command was given so the 
metric is incremented once.
-    assertEquals(initialNumKeyDeletes + 1, getLongCounter("NumKeyDeletes", 
omMetrics));
+    numKeysDeleted += numKeysBeforeDeletion - getLongCounter("NumKeys", 
omMetrics);
+    assertEquals(initialNumKeyDeletes + numKeysDeleted, 
getLongCounter("NumKeyDeletes", omMetrics));
     assertEquals(initialNumKeyRenames + expectedRenames, 
getLongCounter("NumKeyRenames", omMetrics));
 
     // Re-create the same tree as before, but this time delete the bucket 
recursively.
@@ -548,7 +550,9 @@ public void testDirectoryOps(BucketLayout bucketLayout) 
throws Exception {
     fs.mkdirs(dirPath);
     ContractTestUtils.touch(fs, new Path(dirPath, "file1"));
     ContractTestUtils.touch(fs, new Path(dirPath.getParent(), "file2"));
-    assertEquals(initialNumKeys, getLongCounter("NumKeys", omMetrics));
+    omMetrics = getMetrics("OMMetrics");
+    assertEquals(initialNumKeys + 4, getLongCounter("NumKeys", omMetrics));
+    numKeysBeforeDeletion = getLongCounter("NumKeys", omMetrics);
     fs.delete(bucketPath, true);
     GenericTestUtils.waitFor(() -> {
       long keyCount = getLongCounter("NumKeys", getMetrics("OMMetrics"));
@@ -557,8 +561,8 @@ public void testDirectoryOps(BucketLayout bucketLayout) 
throws Exception {
     omMetrics = getMetrics("OMMetrics");
     assertEquals(initialNumKeys, getLongCounter("NumKeys", omMetrics));
     assertEquals(initialNumCreateDirectory + 2, 
getLongCounter("NumCreateDirectory", omMetrics));
-    // One more keys delete request is given as part of the bucket delete to 
do a batch delete of its keys.
-    assertEquals(initialNumKeyDeletes + 2, getLongCounter("NumKeyDeletes", 
omMetrics));
+    numKeysDeleted += numKeysBeforeDeletion - getLongCounter("NumKeys", 
omMetrics);
+    assertEquals(initialNumKeyDeletes + numKeysDeleted, 
getLongCounter("NumKeyDeletes", omMetrics));
     assertEquals(initialNumKeyRenames + expectedRenames, 
getLongCounter("NumKeyRenames", omMetrics));
   }
 
diff --git 
a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto 
b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
index ba35dab8470..137e44be877 100644
--- a/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
+++ b/hadoop-ozone/interface-client/src/main/proto/OmClientProtocol.proto
@@ -1365,6 +1365,13 @@ message DeleteKeyRequest {
 
 message DeleteKeysRequest {
     optional DeleteKeyArgs deleteKeys = 1;
+    optional RequestSource sourceType = 2 [default = USER];
+}
+
+enum RequestSource {
+  USER = 1;
+  LIFECYCLE = 2;
+  TRASH = 3;
 }
 
 message DeleteKeyArgs {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
index 89c306fe25a..114d48c5790 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java
@@ -58,6 +58,8 @@ public class OMMetrics implements OmMetadataReaderMetrics {
   private @Metric MutableCounterLong numKeyLookup;
   private @Metric MutableCounterLong numKeyRenames;
   private @Metric MutableCounterLong numKeyDeletes;
+  private @Metric MutableCounterLong numKeyLifecycleDeletes;
+  private @Metric MutableCounterLong numKeyTrashDeletes;
   private @Metric MutableCounterLong numBucketLists;
   private @Metric MutableCounterLong numKeyLists;
   private @Metric MutableCounterLong numVolumeLists;
@@ -120,6 +122,8 @@ public class OMMetrics implements OmMetadataReaderMetrics {
   private @Metric MutableCounterLong numKeyLookupFails;
   private @Metric MutableCounterLong numKeyRenameFails;
   private @Metric MutableCounterLong numKeyDeleteFails;
+  private @Metric MutableCounterLong numKeyLifecycleDeleteFails;
+  private @Metric MutableCounterLong numKeyTrashDeleteFails;
   private @Metric MutableCounterLong numBucketListFails;
   private @Metric MutableCounterLong numKeyListFails;
   private @Metric MutableCounterLong numVolumeListFails;
@@ -219,6 +223,7 @@ public class OMMetrics implements OmMetadataReaderMetrics {
   private @Metric MutableCounterLong numTrashRenames;
   private @Metric MutableCounterLong numTrashDeletes;
   private @Metric MutableCounterLong numTrashListStatus;
+  private @Metric MutableCounterLong numTrashListKeys;
   private @Metric MutableCounterLong numTrashGetFileStatus;
   private @Metric MutableCounterLong numTrashGetTrashRoots;
   private @Metric MutableCounterLong numTrashExists;
@@ -799,11 +804,42 @@ public void incNumKeyDeleteFails() {
     numKeyDeleteFails.incr();
   }
 
+  public void incNumKeyDeleteFails(int count) {
+    numKeyDeleteFails.incr(count);
+  }
+
+  public void incNumKeyLifecycleDeleteFails(int count) {
+    numKeyLifecycleDeleteFails.incr(count);
+  }
+
+  public void incNumKeyTrashDeleteFails(int count) {
+    numKeyTrashDeleteFails.incr(count);
+  }
+
   public void incNumKeyDeletes() {
     numKeyOps.incr();
     numKeyDeletes.incr();
   }
 
+  public void incNumKeyDeletesInternal() {
+    numKeyDeletes.incr();
+  }
+
+  public void incNumKeyDeletes(int count) {
+    numKeyOps.incr();
+    numKeyDeletes.incr(count);
+  }
+
+  public void incNumKeyLifecycleDeletes(int count) {
+    numKeyOps.incr();
+    numKeyLifecycleDeletes.incr(count);
+  }
+
+  public void incNumKeyTrashDeletes(int count) {
+    numKeyOps.incr();
+    numKeyTrashDeletes.incr(count);
+  }
+
   public void incNumKeyCommits() {
     numKeyOps.incr();
     numKeyCommits.incr();
@@ -1103,11 +1139,32 @@ public long getNumKeyDeletes() {
     return numKeyDeletes.value();
   }
 
+  @VisibleForTesting
+  public long getNumKeyLifecycleDeletes() {
+    return numKeyLifecycleDeletes.value();
+  }
+
+  @VisibleForTesting
+  public long getNumKeyTrashDeletes() {
+    return numKeyTrashDeletes.value();
+  }
+
   @VisibleForTesting
   public long getNumKeyDeletesFails() {
     return numKeyDeleteFails.value();
   }
 
+  @VisibleForTesting
+  public long getNumKeyLifecycleDeleteFails() {
+    return numKeyLifecycleDeleteFails.value();
+  }
+
+  @VisibleForTesting
+  public long getNumKeyTrashDeleteFails() {
+    return numKeyTrashDeleteFails.value();
+  }
+
+
   @VisibleForTesting
   public long getNumBucketListFails() {
     return numBucketListFails.value();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/TrashOzoneFileSystem.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/TrashOzoneFileSystem.java
index 723b977111f..8332b6083b0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/TrashOzoneFileSystem.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/TrashOzoneFileSystem.java
@@ -587,6 +587,7 @@ boolean processKeyPath(List<String> keyPathList) {
       OzoneManagerProtocolProtos.DeleteKeysRequest deleteKeysRequest =
           OzoneManagerProtocolProtos.DeleteKeysRequest.newBuilder()
               .setDeleteKeys(deleteKeyArgs)
+              .setSourceType(OzoneManagerProtocolProtos.RequestSource.TRASH)
               .build();
       OzoneManagerProtocolProtos.OMRequest omRequest =
           null;
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
index f1d52b443a6..eade8e3960f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
@@ -112,6 +112,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
             lockSet.add(volBucketPair);
           }
           omMetrics.decNumKeys();
+          omMetrics.incNumKeyDeletesInternal();
           numSubDirMoved++;
           OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager,
               volumeName, bucketName);
@@ -155,6 +156,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
           }
 
           omMetrics.decNumKeys();
+          omMetrics.incNumKeyDeletesInternal();
           numSubFilesMoved++;
           OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager,
               volumeName, bucketName);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
index fbb14e56400..7a18646bee9 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
@@ -21,6 +21,7 @@
 import static org.apache.hadoop.ozone.OzoneConsts.DATA_SIZE;
 import static org.apache.hadoop.ozone.OzoneConsts.DELETED_HSYNC_KEY;
 import static org.apache.hadoop.ozone.OzoneConsts.DELETED_KEYS_LIST;
+import static org.apache.hadoop.ozone.OzoneConsts.DELETED_KEY_SOURCE_TYPE;
 import static org.apache.hadoop.ozone.OzoneConsts.KEY;
 import static org.apache.hadoop.ozone.OzoneConsts.REPLICATION_CONFIG;
 import static org.apache.hadoop.ozone.OzoneConsts.UNDELETED_KEYS_LIST;
@@ -70,6 +71,7 @@
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteKeysResponse;
 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.RequestSource;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type;
 import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
 import org.apache.hadoop.ozone.security.acl.OzoneObj;
@@ -100,6 +102,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
         OmResponseUtil.getOMResponseBuilder(getOmRequest());
 
     List<String> deleteKeys = new ArrayList<>(deleteKeyArgs.getKeysList());
+    RequestSource sourceType = deleteKeyRequest.getSourceType();
     List<OmKeyInfo> deleteKeysInfo = new ArrayList<>();
 
     Exception exception = null;
@@ -108,7 +111,6 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
     Map<String, ErrorInfo> keyToError = new HashMap<>();
 
     OMMetrics omMetrics = ozoneManager.getMetrics();
-    omMetrics.incNumKeyDeletes();
     OMPerformanceMetrics perfMetrics = ozoneManager.getPerfMetrics();
     String volumeName = deleteKeyArgs.getVolumeName();
     String bucketName = deleteKeyArgs.getBucketName();
@@ -263,24 +265,48 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
       }
     }
 
-    addDeletedKeys(auditMap, deleteKeysInfo, unDeletedKeys.getKeysList());
+    addDeletedKeys(auditMap, deleteKeysInfo, unDeletedKeys.getKeysList(), 
sourceType);
 
     markForAudit(auditLogger,
         buildAuditMessage(DELETE_KEYS, auditMap, exception, userInfo));
 
     switch (result) {
     case SUCCESS:
+      switch (sourceType) {
+      case LIFECYCLE:
+        omMetrics.incNumKeyLifecycleDeletes(deleteKeys.size());
+        
omMetrics.incNumKeyLifecycleDeleteFails(unDeletedKeys.getKeysList().size());
+        break;
+      case TRASH:
+        omMetrics.incNumKeyTrashDeletes(deleteKeys.size());
+        
omMetrics.incNumKeyTrashDeleteFails(unDeletedKeys.getKeysList().size());
+        break;
+      default:
+        break;
+      }
+      omMetrics.incNumKeyDeletes(deleteKeys.size());
+      omMetrics.incNumKeyDeleteFails(unDeletedKeys.getKeysList().size());
       omMetrics.decNumKeys(deleteKeys.size());
       if (LOG.isDebugEnabled()) {
-        LOG.debug("Keys delete success. Volume:{}, Bucket:{}, Keys:{}",
-            volumeName, bucketName, auditMap.get(DELETED_KEYS_LIST));
+        LOG.debug("Keys delete success. Volume:{}, Bucket:{}, Keys:{}, 
sourceType:{}",
+            volumeName, bucketName, auditMap.get(DELETED_KEYS_LIST), 
sourceType);
       }
       break;
     case FAILURE:
-      omMetrics.incNumKeyDeleteFails();
+      switch (sourceType) {
+      case LIFECYCLE:
+        
omMetrics.incNumKeyLifecycleDeleteFails(unDeletedKeys.getKeysList().size());
+        break;
+      case TRASH:
+        
omMetrics.incNumKeyTrashDeleteFails(unDeletedKeys.getKeysList().size());
+        break;
+      default:
+        break;
+      }
+      omMetrics.incNumKeyDeleteFails(unDeletedKeys.getKeysList().size());
       if (LOG.isDebugEnabled()) {
-        LOG.debug("Keys delete failed. Volume:{}, Bucket:{}, DeletedKeys:{}, "
-                + "UnDeletedKeys:{}", volumeName, bucketName,
+        LOG.debug("Keys delete failed. Volume:{}, Bucket:{}, sourceType:{}, 
DeletedKeys:{}, " +
+                "UnDeletedKeys:{}", volumeName, bucketName, sourceType,
             auditMap.get(DELETED_KEYS_LIST), auditMap.get(UNDELETED_KEYS_LIST),
             exception);
       }
@@ -374,7 +400,7 @@ protected OmKeyInfo getOmKeyInfo(
    * Add key info to audit map for DeleteKeys request.
    */
   protected static void addDeletedKeys(Map<String, String> auditMap,
-      List<OmKeyInfo> deletedKeyInfos, List<String> unDeletedKeys) {
+      List<OmKeyInfo> deletedKeyInfos, List<String> unDeletedKeys, 
RequestSource sourceType) {
     StringBuilder keys = new StringBuilder();
     for (int i = 0; i < deletedKeyInfos.size(); i++) {
       OmKeyInfo key = deletedKeyInfos.get(i);
@@ -387,6 +413,7 @@ protected static void addDeletedKeys(Map<String, String> 
auditMap,
     }
     auditMap.put(DELETED_KEYS_LIST, keys.toString());
     auditMap.put(UNDELETED_KEYS_LIST, String.join(",", unDeletedKeys));
+    auditMap.put(DELETED_KEY_SOURCE_TYPE, String.valueOf(sourceType));
   }
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
index 680ba2bdbb0..6b87cd124b5 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyLifecycleService.java
@@ -87,6 +87,7 @@
 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.RenameKeyRequest;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RequestSource;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.util.Time;
 import org.apache.ratis.protocol.ClientId;
@@ -812,7 +813,10 @@ private void sendDeleteKeysRequestAndClearList(String 
volume, String bucket,
           builder.addAllUpdateIDs(keysList.updateIDSubList(startIndex, 
endIndex));
 
           DeleteKeyArgs deleteKeyArgs = builder.build();
-          DeleteKeysRequest deleteKeysRequest = 
DeleteKeysRequest.newBuilder().setDeleteKeys(deleteKeyArgs).build();
+          DeleteKeysRequest deleteKeysRequest = DeleteKeysRequest.newBuilder()
+                  .setDeleteKeys(deleteKeyArgs)
+                  .setSourceType(RequestSource.LIFECYCLE)
+                  .build();
           LOG.debug("request size {} for {} keys", 
deleteKeysRequest.getSerializedSize(), keyCount);
 
           if (deleteKeysRequest.getSerializedSize() < ratisByteLimit) {
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequest.java
index 6ef33230b07..08ed47d05d4 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequest.java
@@ -25,7 +25,10 @@
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 import org.apache.hadoop.hdds.client.RatisReplicationConfig;
@@ -36,7 +39,10 @@
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteKeyError;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteKeysRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RequestSource;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 /**
  * Class tests OMKeysDeleteRequest.
@@ -48,18 +54,31 @@ public class TestOMKeysDeleteRequest extends 
TestOMKeyRequest {
   private OMRequest omRequest;
   private static final int KEY_COUNT = 10;
 
-  @Test
-  public void testKeysDeleteRequest() throws Exception {
+  public static Collection<Object[]> requestSourceType() {
+    return Arrays.asList(
+        new Object[]{RequestSource.USER},
+        new Object[]{RequestSource.LIFECYCLE},
+        new Object[]{RequestSource.TRASH});
+  }
 
-    createPreRequisites();
+  @ParameterizedTest
+  @MethodSource("requestSourceType")
+  public void testKeysDeleteRequest(RequestSource sourceType) throws Exception 
{
+
+    createPreRequisites(sourceType);
 
     OMKeysDeleteRequest omKeysDeleteRequest =
         new OMKeysDeleteRequest(omRequest, getBucketLayout());
-    checkDeleteKeysResponse(omKeysDeleteRequest);
+    checkDeleteKeysResponse(omKeysDeleteRequest, sourceType);
   }
 
   protected void checkDeleteKeysResponse(
       OMKeysDeleteRequest omKeysDeleteRequest) throws java.io.IOException {
+    checkDeleteKeysResponse(omKeysDeleteRequest, RequestSource.USER);
+  }
+
+  protected void checkDeleteKeysResponse(
+      OMKeysDeleteRequest omKeysDeleteRequest, RequestSource sourceType) 
throws java.io.IOException {
     OMClientResponse omClientResponse =
         omKeysDeleteRequest.validateAndUpdateCache(ozoneManager, 100L);
 
@@ -83,27 +102,43 @@ protected void checkDeleteKeysResponse(
           .get(omMetadataManager.getOzoneKey(volumeName, bucketName,
               deleteKey)));
     }
+    switch (sourceType) {
+    case USER:
+      assertEquals(deleteKeyList.size(), 
ozoneManager.getMetrics().getNumKeyDeletes());
+      break;
+    case LIFECYCLE:
+      assertEquals(deleteKeyList.size(), 
ozoneManager.getMetrics().getNumKeyLifecycleDeletes());
+      break;
+    case TRASH:
+      assertEquals(deleteKeyList.size(), 
ozoneManager.getMetrics().getNumKeyTrashDeletes());
+      break;
+    default:
+      break;
+    }
   }
 
-  @Test
-  public void testKeysDeleteRequestFail() throws Exception {
+  @ParameterizedTest
+  @MethodSource("requestSourceType")
+  public void testKeysDeleteRequestFail(RequestSource sourceType) throws 
Exception {
 
-    createPreRequisites();
+    createPreRequisites(sourceType);
 
     // Add a key which not exist, which causes batch delete to fail.
 
     omRequest = omRequest.toBuilder()
             .setDeleteKeysRequest(DeleteKeysRequest.newBuilder()
+                .setSourceType(sourceType)
                 .setDeleteKeys(DeleteKeyArgs.newBuilder()
                 .setBucketName(bucketName).setVolumeName(volumeName)
                     .addAllKeys(deleteKeyList).addKeys("dummy"))).build();
 
     OMKeysDeleteRequest omKeysDeleteRequest =
         new OMKeysDeleteRequest(omRequest, getBucketLayout());
-    checkDeleteKeysResponseForFailure(omKeysDeleteRequest, 
Status.PARTIAL_DELETE);
+    checkDeleteKeysResponseForFailure(omKeysDeleteRequest, 
Status.PARTIAL_DELETE, sourceType);
   }
 
-  @Test
+  @ParameterizedTest
+  @MethodSource("requestSourceType")
   public void testUpdateIDCountNoMatchKeyCount() throws Exception {
 
     createPreRequisites();
@@ -142,7 +177,13 @@ public void testUpdateIDCountMatchKeyCount() throws 
Exception {
   }
 
   protected void checkDeleteKeysResponseForFailure(
-      OMKeysDeleteRequest omKeysDeleteRequest, Status failureStatus) throws 
java.io.IOException {
+      OMKeysDeleteRequest omKeysDeleteRequest, Status failureStatus) throws 
IOException {
+    checkDeleteKeysResponseForFailure(omKeysDeleteRequest, failureStatus, 
RequestSource.USER);
+  }
+
+  protected void checkDeleteKeysResponseForFailure(
+      OMKeysDeleteRequest omKeysDeleteRequest, Status failureStatus, 
RequestSource sourceType)
+      throws java.io.IOException {
     OMClientResponse omClientResponse =
         omKeysDeleteRequest.validateAndUpdateCache(ozoneManager, 100L);
 
@@ -168,10 +209,28 @@ protected void checkDeleteKeysResponseForFailure(
           .getErrorsList();
       assertEquals(1, keyErrors.size());
       assertEquals("dummy", unDeletedKeys.getKeys(0));
+      switch (sourceType) {
+      case USER:
+        assertEquals(1, ozoneManager.getMetrics().getNumKeyDeletesFails());
+        break;
+      case LIFECYCLE:
+        assertEquals(1, 
ozoneManager.getMetrics().getNumKeyLifecycleDeleteFails());
+        break;
+      case TRASH:
+        assertEquals(1, ozoneManager.getMetrics().getNumKeyTrashDeleteFails());
+        break;
+      default:
+        break;
+      }
+
     }
   }
 
   protected void createPreRequisites() throws Exception {
+    createPreRequisites(RequestSource.USER);
+  }
+
+  protected void createPreRequisites(RequestSource sourceType) throws 
Exception {
 
     deleteKeyList = new ArrayList<>();
     // Add volume, bucket and key entries to OM DB.
@@ -198,7 +257,10 @@ protected void createPreRequisites() throws Exception {
         OMRequest.newBuilder().setClientId(UUID.randomUUID().toString())
             .setCmdType(DeleteKeys)
             .setDeleteKeysRequest(DeleteKeysRequest.newBuilder()
-                .setDeleteKeys(deleteKeyArgs).build()).build();
+                .setDeleteKeys(deleteKeyArgs)
+                .setSourceType(sourceType)
+                .build()
+            ).build();
   }
 
   public List<String> getDeleteKeyList() {
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequestWithFSO.java
index 92a3f9b26bb..071ef81513a 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeysDeleteRequestWithFSO.java
@@ -32,7 +32,10 @@
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteKeyArgs;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeleteKeysRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
+import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RequestSource;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 /**
  * Class tests OMKeysDeleteRequestWithFSO.
@@ -42,31 +45,38 @@ public class TestOMKeysDeleteRequestWithFSO extends 
TestOMKeysDeleteRequest {
   private static final int KEY_COUNT = 3;
 
   @Override
-  @Test
-  public void testKeysDeleteRequest() throws Exception {
+  @ParameterizedTest
+  @MethodSource("requestSourceType")
+  public void testKeysDeleteRequest(RequestSource sourceType) throws Exception 
{
 
-    createPreRequisites();
+    createPreRequisites(sourceType);
     OmKeysDeleteRequestWithFSO omKeysDeleteRequest =
         new OmKeysDeleteRequestWithFSO(getOmRequest(),
             getBucketLayout());
-    checkDeleteKeysResponse(omKeysDeleteRequest);
+    checkDeleteKeysResponse(omKeysDeleteRequest, sourceType);
 
   }
 
   @Override
-  @Test
-  public void testKeysDeleteRequestFail() throws Exception {
-    createPreRequisites();
+  @ParameterizedTest
+  @MethodSource("requestSourceType")
+  public void testKeysDeleteRequestFail(RequestSource sourceType) throws 
Exception {
+    createPreRequisites(sourceType);
     setOmRequest(getOmRequest().toBuilder().setDeleteKeysRequest(
-        
OzoneManagerProtocolProtos.DeleteKeysRequest.newBuilder().setDeleteKeys(
-            OzoneManagerProtocolProtos.DeleteKeyArgs.newBuilder()
-                .setBucketName(bucketName).setVolumeName(volumeName)
-                .addAllKeys(getDeleteKeyList()).addKeys("dummy"))).build());
+        OzoneManagerProtocolProtos.DeleteKeysRequest.newBuilder()
+            .setSourceType(sourceType)
+            .setDeleteKeys(OzoneManagerProtocolProtos.DeleteKeyArgs
+                .newBuilder()
+                .setBucketName(bucketName)
+                .setVolumeName(volumeName)
+                .addAllKeys(getDeleteKeyList())
+                .addKeys("dummy")))
+        .build());
 
     OmKeysDeleteRequestWithFSO omKeysDeleteRequest =
         new OmKeysDeleteRequestWithFSO(getOmRequest(),
             getBucketLayout());
-    checkDeleteKeysResponseForFailure(omKeysDeleteRequest, 
Status.PARTIAL_DELETE);
+    checkDeleteKeysResponseForFailure(omKeysDeleteRequest, 
Status.PARTIAL_DELETE, sourceType);
   }
 
   @Test
@@ -92,6 +102,11 @@ public void testUpdateIDCountMatchKeyCount() throws 
Exception {
 
   @Override
   protected void createPreRequisites() throws Exception {
+    createPreRequisites(RequestSource.USER);
+  }
+
+  @Override
+  protected void createPreRequisites(RequestSource sourceType) throws 
Exception {
     setDeleteKeyList(new ArrayList<>());
     // Add volume, bucket and key entries to OM DB.
     OMRequestTestUtils
@@ -130,8 +145,12 @@ protected void createPreRequisites() throws Exception {
     setOmRequest(OzoneManagerProtocolProtos.OMRequest.newBuilder()
         .setClientId(UUID.randomUUID().toString()).setCmdType(DeleteKeys)
         .setDeleteKeysRequest(
-            OzoneManagerProtocolProtos.DeleteKeysRequest.newBuilder()
-                .setDeleteKeys(deleteKeyArgs).build()).build());
+            OzoneManagerProtocolProtos.DeleteKeysRequest
+                .newBuilder()
+                .setSourceType(sourceType)
+                .setDeleteKeys(deleteKeyArgs)
+                .build())
+        .build());
   }
 
   @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to