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]