This is an automated email from the ASF dual-hosted git repository.
sumitagrawal pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new a1324b66a7 HDDS-11511. Introduce metrics in deletion services of OM
(#7377)
a1324b66a7 is described below
commit a1324b66a74e5fffdda7353d1d4ea752e0f69677
Author: Tejaskriya <[email protected]>
AuthorDate: Wed Jan 8 17:23:00 2025 +0530
HDDS-11511. Introduce metrics in deletion services of OM (#7377)
---
.../ozone/TestDirectoryDeletingServiceWithFSO.java | 75 ++++++++++
.../hadoop/ozone/om/DeletingServiceMetrics.java | 163 +++++++++++++++++++++
.../org/apache/hadoop/ozone/om/OzoneManager.java | 6 +
.../key/OMDirectoriesPurgeRequestWithFSO.java | 13 ++
.../ozone/om/request/key/OMKeyPurgeRequest.java | 8 +-
.../om/service/AbstractKeyDeletingService.java | 7 +-
.../ozone/om/service/KeyDeletingService.java | 5 +
.../ozone/om/request/key/TestOMKeyRequest.java | 4 +
8 files changed, 279 insertions(+), 2 deletions(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java
index 049db78cf6..6cced07848 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestDirectoryDeletingServiceWithFSO.java
@@ -42,6 +42,7 @@ import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
import org.apache.hadoop.ozone.client.OzoneVolume;
import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OmSnapshotManager;
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -109,6 +110,7 @@ public class TestDirectoryDeletingServiceWithFSO {
private static String volumeName;
private static String bucketName;
private static OzoneClient client;
+ private static DeletingServiceMetrics metrics;
@BeforeAll
public static void init() throws Exception {
@@ -140,6 +142,7 @@ public class TestDirectoryDeletingServiceWithFSO {
conf.setInt(OZONE_FS_ITERATE_BATCH_SIZE, 5);
fs = FileSystem.get(conf);
+ metrics = cluster.getOzoneManager().getDeletionMetrics();
}
@AfterAll
@@ -185,6 +188,7 @@ public class TestDirectoryDeletingServiceWithFSO {
assertSubPathsCount(dirDeletingService::getMovedDirsCount, 0);
assertSubPathsCount(dirDeletingService::getMovedFilesCount, 0);
+ metrics.resetDirectoryMetrics();
// Delete the appRoot, empty dir
fs.delete(appRoot, true);
@@ -197,6 +201,8 @@ public class TestDirectoryDeletingServiceWithFSO {
assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 1);
assertSubPathsCount(dirDeletingService::getMovedDirsCount, 0);
assertSubPathsCount(dirDeletingService::getMovedFilesCount, 0);
+ assertEquals(1, metrics.getNumDirsPurged());
+ assertEquals(1, metrics.getNumDirsSentForPurge());
try (TableIterator<?, ? extends Table.KeyValue<?, OmDirectoryInfo>>
iterator = dirTable.iterator()) {
@@ -255,6 +261,7 @@ public class TestDirectoryDeletingServiceWithFSO {
long preRunCount = dirDeletingService.getRunCount().get();
+ metrics.resetDirectoryMetrics();
// Delete the appRoot
fs.delete(appRoot, true);
@@ -270,6 +277,14 @@ public class TestDirectoryDeletingServiceWithFSO {
assertSubPathsCount(dirDeletingService::getMovedDirsCount, 18);
assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 19);
+ assertEquals(15, metrics.getNumSubFilesSentForPurge());
+ assertEquals(15, metrics.getNumSubFilesMovedToDeletedTable());
+ assertEquals(19, metrics.getNumDirsPurged());
+ assertEquals(19, metrics.getNumDirsSentForPurge());
+ assertEquals(18, metrics.getNumSubDirsMovedToDeletedDirTable());
+ assertEquals(18, metrics.getNumSubDirsSentForPurge());
+
+
long elapsedRunCount = dirDeletingService.getRunCount().get() -
preRunCount;
assertThat(dirDeletingService.getRunCount().get()).isGreaterThan(1);
// Ensure dir deleting speed, here provide a backup value for safe CI
@@ -308,6 +323,7 @@ public class TestDirectoryDeletingServiceWithFSO {
assertSubPathsCount(dirDeletingService::getMovedDirsCount, 0);
assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 0);
+ metrics.resetDirectoryMetrics();
// Delete the rootDir, which should delete all keys.
fs.delete(root, true);
@@ -321,7 +337,66 @@ public class TestDirectoryDeletingServiceWithFSO {
assertSubPathsCount(dirDeletingService::getMovedFilesCount, 3);
assertSubPathsCount(dirDeletingService::getMovedDirsCount, 2);
assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 5);
+ assertEquals(5, metrics.getNumDirsSentForPurge());
+ assertEquals(5, metrics.getNumDirsPurged());
+ assertEquals(4, metrics.getNumSubDirsMovedToDeletedDirTable());
+ assertEquals(4, metrics.getNumSubDirsSentForPurge());
+ assertEquals(3, metrics.getNumSubFilesSentForPurge());
+ assertEquals(3, metrics.getNumSubFilesMovedToDeletedTable());
+
+ assertThat(dirDeletingService.getRunCount().get()).isGreaterThan(1);
+ }
+
+ /**
+ * Test to check the following scenario:
+ * A subdir gets marked for move in DirectoryDeletingService and
+ * marked for delete in
AbstractKeyDeletingService#optimizeDirDeletesAndSubmitRequest.
+ */
+ @Test
+ public void testDeleteWithLessDirsButMultipleLevels() throws Exception {
+ Path root = new Path("/rootDir");
+ Path appRoot = new Path(root, "appRoot");
+ Path parent = new Path(appRoot, "parentDir");
+ fs.mkdirs(parent);
+ Path child = new Path(parent, "childFile");
+ ContractTestUtils.touch(fs, child);
+
+ Table<String, OmKeyInfo> deletedDirTable =
+ cluster.getOzoneManager().getMetadataManager().getDeletedDirTable();
+ Table<String, OmKeyInfo> keyTable =
+
cluster.getOzoneManager().getMetadataManager().getKeyTable(getFSOBucketLayout());
+ Table<String, OmDirectoryInfo> dirTable =
cluster.getOzoneManager().getMetadataManager().getDirectoryTable();
+
+ DirectoryDeletingService dirDeletingService =
+ (DirectoryDeletingService)
cluster.getOzoneManager().getKeyManager().getDirDeletingService();
+
+ // Before delete
+ assertTableRowCount(deletedDirTable, 0);
+ assertTableRowCount(dirTable, 3);
+ assertTableRowCount(keyTable, 1);
+
+ assertSubPathsCount(dirDeletingService::getMovedFilesCount, 0);
+ assertSubPathsCount(dirDeletingService::getMovedDirsCount, 0);
+ assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 0);
+
+ metrics.resetDirectoryMetrics();
+ fs.delete(appRoot, true);
+
+ // After delete
+ checkPath(appRoot);
+ assertTableRowCount(deletedDirTable, 0);
+ assertTableRowCount(keyTable, 0);
+ assertTableRowCount(dirTable, 1);
+ assertSubPathsCount(dirDeletingService::getMovedFilesCount, 1);
+ assertSubPathsCount(dirDeletingService::getDeletedDirsCount, 2);
+ assertSubPathsCount(dirDeletingService::getMovedDirsCount, 0);
+ assertEquals(2, metrics.getNumDirsSentForPurge());
+ assertEquals(2, metrics.getNumDirsPurged());
+ assertEquals(1, metrics.getNumSubDirsMovedToDeletedDirTable());
+ assertEquals(1, metrics.getNumSubDirsSentForPurge());
+ assertEquals(1, metrics.getNumSubFilesSentForPurge());
+ assertEquals(1, metrics.getNumSubFilesMovedToDeletedTable());
assertThat(dirDeletingService.getRunCount().get()).isGreaterThan(1);
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/DeletingServiceMetrics.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/DeletingServiceMetrics.java
new file mode 100644
index 0000000000..5597ff0a6a
--- /dev/null
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/DeletingServiceMetrics.java
@@ -0,0 +1,163 @@
+/**
+ * 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;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.hadoop.metrics2.annotation.Metric;
+import org.apache.hadoop.metrics2.annotation.Metrics;
+import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
+import org.apache.hadoop.metrics2.lib.MetricsRegistry;
+import org.apache.hadoop.metrics2.lib.MutableGaugeLong;
+import org.apache.hadoop.ozone.OzoneConsts;
+
+/**
+ * Class contains metrics related to the OM Deletion services.
+ */
+@Metrics(about = "Deletion Service Metrics", context = OzoneConsts.OZONE)
+public final class DeletingServiceMetrics {
+
+ public static final String METRICS_SOURCE_NAME =
+ DeletingServiceMetrics.class.getSimpleName();
+ private MetricsRegistry registry;
+
+ private DeletingServiceMetrics() {
+ this.registry = new MetricsRegistry(METRICS_SOURCE_NAME);
+ }
+
+ /**
+ * Creates and returns DeletingServiceMetrics instance.
+ *
+ * @return DeletingServiceMetrics
+ */
+ public static DeletingServiceMetrics create() {
+ return DefaultMetricsSystem.instance().register(METRICS_SOURCE_NAME,
+ "Metrics tracking the progress of deletion of directories and keys in
the OM",
+ new DeletingServiceMetrics());
+ }
+ /**
+ * Unregister the metrics instance.
+ */
+ public static void unregister() {
+ DefaultMetricsSystem.instance().unregisterSource(METRICS_SOURCE_NAME);
+ }
+
+
+ /*
+ * Total directory deletion metrics across all iterations of
DirectoryDeletingService since last restart.
+ */
+ @Metric("Total no. of deleted directories sent for purge")
+ private MutableGaugeLong numDirsSentForPurge;
+ @Metric("Total no. of sub-directories sent for purge")
+ private MutableGaugeLong numSubDirsSentForPurge;
+ @Metric("Total no. of sub-files sent for purge")
+ private MutableGaugeLong numSubFilesSentForPurge;
+
+ public void incrNumDirsSentForPurge(long dirDel) {
+ numDirsSentForPurge.incr(dirDel);
+ }
+
+ public void incrNumSubDirsSentForPurge(long delta) {
+ numSubDirsSentForPurge.incr(delta);
+ }
+
+ public void incrNumSubFilesSentForPurge(long delta) {
+ numSubFilesSentForPurge.incr(delta);
+ }
+
+ public void incrementDirectoryDeletionTotalMetrics(long dirDel, long
dirMove, long filesMove) {
+ incrNumDirsSentForPurge(dirDel);
+ incrNumSubDirsSentForPurge(dirMove);
+ incrNumSubFilesSentForPurge(filesMove);
+ }
+
+ public long getNumDirsSentForPurge() {
+ return numDirsSentForPurge.value();
+ }
+ public long getNumSubDirsSentForPurge() {
+ return numSubDirsSentForPurge.value();
+ }
+ public long getNumSubFilesSentForPurge() {
+ return numSubFilesSentForPurge.value();
+ }
+
+ /*
+ * Total key deletion metrics across all iterations of KeyDeletingService
since last restart.
+ */
+ @Metric("Total no. of keys processed")
+ private MutableGaugeLong numKeysProcessed;
+ @Metric("Total no. of deleted keys sent for purge")
+ private MutableGaugeLong numKeysSentForPurge;
+
+ public void incrNumKeysProcessed(long keysProcessed) {
+ this.numKeysProcessed.incr(keysProcessed);
+ }
+
+ public void incrNumKeysSentForPurge(long keysPurge) {
+ this.numKeysSentForPurge.incr(keysPurge);
+ }
+
+ /*
+ * Directory purge request metrics.
+ */
+ @Metric("Total no. of directories purged")
+ private MutableGaugeLong numDirsPurged;
+ @Metric("Total no. of subFiles moved to deletedTable")
+ private MutableGaugeLong numSubFilesMovedToDeletedTable;
+ @Metric("Total no. of subDirectories moved to deletedDirTable")
+ private MutableGaugeLong numSubDirsMovedToDeletedDirTable;
+
+ public void incrNumDirPurged(long dirPurged) {
+ this.numDirsPurged.incr(dirPurged);
+ }
+ public void incrNumSubFilesMoved(long subKeys) {
+ this.numSubFilesMovedToDeletedTable.incr(subKeys);
+ }
+ public void incrNumSubDirectoriesMoved(long subDirectories) {
+ this.numSubDirsMovedToDeletedDirTable.incr(subDirectories);
+ }
+ public long getNumDirsPurged() {
+ return numDirsPurged.value();
+ }
+ public long getNumSubFilesMovedToDeletedTable() {
+ return numSubFilesMovedToDeletedTable.value();
+ }
+ public long getNumSubDirsMovedToDeletedDirTable() {
+ return numSubDirsMovedToDeletedDirTable.value();
+ }
+
+ /*
+ * Key purge request metrics.
+ */
+ @Metric("Total no. of keys purged")
+ private MutableGaugeLong numKeysPurged;
+
+ public void incrNumKeysPurged(long keysPurged) {
+ this.numKeysPurged.incr(keysPurged);
+ }
+
+ @VisibleForTesting
+ public void resetDirectoryMetrics() {
+ numDirsPurged.set(0);
+ numSubFilesMovedToDeletedTable.set(0);
+ numSubDirsMovedToDeletedDirTable.set(0);
+ numDirsSentForPurge.set(0);
+ numSubDirsSentForPurge.set(0);
+ numSubFilesSentForPurge.set(0);
+ }
+
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index d26546e47e..f1d31d130c 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -402,6 +402,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
private OMHAMetrics omhaMetrics;
private final ProtocolMessageMetrics<ProtocolMessageEnum>
omClientProtocolMetrics;
+ private final DeletingServiceMetrics omDeletionMetrics;
private OzoneManagerHttpServer httpServer;
private final OMStorage omStorage;
private ObjectName omInfoBeanName;
@@ -684,6 +685,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
metrics = OMMetrics.create();
perfMetrics = OMPerformanceMetrics.register();
+ omDeletionMetrics = DeletingServiceMetrics.create();
// Get admin list
omStarterUser = UserGroupInformation.getCurrentUser().getShortUserName();
omAdmins = OzoneAdmins.getOzoneAdmins(omStarterUser, conf);
@@ -1652,6 +1654,9 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
public OMPerformanceMetrics getPerfMetrics() {
return perfMetrics;
}
+ public DeletingServiceMetrics getDeletionMetrics() {
+ return omDeletionMetrics;
+ }
/**
* Start service.
@@ -2317,6 +2322,7 @@ public final class OzoneManager extends
ServiceRuntimeInfoImpl
if (omRatisSnapshotProvider != null) {
omRatisSnapshotProvider.close();
}
+ DeletingServiceMetrics.unregister();
OMPerformanceMetrics.unregister();
RatisDropwizardExports.clear(ratisMetricsMap, ratisReporterList);
scmClient.close();
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 b24253e6f6..4758b8cb78 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
@@ -33,7 +33,9 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
+
import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -75,6 +77,7 @@ public class OMDirectoriesPurgeRequestWithFSO extends
OMKeyRequest {
OmMetadataManagerImpl omMetadataManager = (OmMetadataManagerImpl)
ozoneManager.getMetadataManager();
Map<String, OmKeyInfo> openKeyInfoMap = new HashMap<>();
OMMetrics omMetrics = ozoneManager.getMetrics();
+ DeletingServiceMetrics deletingServiceMetrics =
ozoneManager.getDeletionMetrics();
OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder(
getOmRequest());
final SnapshotInfo fromSnapshotInfo;
@@ -98,6 +101,7 @@ public class OMDirectoriesPurgeRequestWithFSO extends
OMKeyRequest {
return new
OMDirectoriesPurgeResponseWithFSO(createErrorOMResponse(omResponse, e));
}
try {
+ int numSubDirMoved = 0, numSubFilesMoved = 0, numDirsDeleted = 0;
for (OzoneManagerProtocolProtos.PurgePathRequest path : purgeRequests) {
for (OzoneManagerProtocolProtos.KeyInfo key :
path.getMarkDeletedSubDirsList()) {
@@ -111,6 +115,7 @@ public class OMDirectoriesPurgeRequestWithFSO extends
OMKeyRequest {
lockSet.add(volBucketPair);
}
omMetrics.decNumKeys();
+ numSubDirMoved++;
OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager,
volumeName, bucketName);
// bucketInfo can be null in case of delete volume or bucket
@@ -153,6 +158,7 @@ public class OMDirectoriesPurgeRequestWithFSO extends
OMKeyRequest {
}
omMetrics.decNumKeys();
+ numSubFilesMoved++;
OmBucketInfo omBucketInfo = getBucketInfo(omMetadataManager,
volumeName, bucketName);
// bucketInfo can be null in case of delete volume or bucket
@@ -168,7 +174,14 @@ public class OMDirectoriesPurgeRequestWithFSO extends
OMKeyRequest {
volBucketInfoMap.putIfAbsent(volBucketPair, omBucketInfo);
}
}
+ if (path.hasDeletedDir()) {
+ numDirsDeleted++;
+ }
}
+ deletingServiceMetrics.incrNumSubDirectoriesMoved(numSubDirMoved);
+ deletingServiceMetrics.incrNumSubFilesMoved(numSubFilesMoved);
+ deletingServiceMetrics.incrNumDirPurged(numDirsDeleted);
+
if (fromSnapshotInfo != null) {
fromSnapshotInfo.setLastTransactionInfo(TransactionInfo.valueOf(context.getTermIndex()).toByteString());
omMetadataManager.getSnapshotInfoTable().addCacheEntry(new
CacheKey<>(fromSnapshotInfo.getTableKey()),
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
index 5d0af563bb..b77381b674 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyPurgeRequest.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils;
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -93,9 +94,14 @@ public class OMKeyPurgeRequest extends OMKeyRequest {
List<String> keysToBePurgedList = new ArrayList<>();
+ int numKeysDeleted = 0;
for (DeletedKeys bucketWithDeleteKeys : bucketDeletedKeysList) {
- keysToBePurgedList.addAll(bucketWithDeleteKeys.getKeysList());
+ List<String> keysList = bucketWithDeleteKeys.getKeysList();
+ keysToBePurgedList.addAll(keysList);
+ numKeysDeleted = numKeysDeleted + keysList.size();
}
+ DeletingServiceMetrics deletingServiceMetrics =
ozoneManager.getDeletionMetrics();
+ deletingServiceMetrics.incrNumKeysPurged(numKeysDeleted);
if (keysToBePurgedList.isEmpty()) {
return new OMKeyPurgeResponse(createErrorOMResponse(omResponse,
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
index e60180938f..a3d7ccb661 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.ozone.ClientVersion;
import org.apache.hadoop.ozone.common.BlockGroup;
import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.ozone.common.DeleteBlockGroupResult;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -72,6 +73,7 @@ public abstract class AbstractKeyDeletingService extends
BackgroundService
implements BootstrapStateHandler {
private final OzoneManager ozoneManager;
+ private final DeletingServiceMetrics metrics;
private final ScmBlockLocationProtocol scmClient;
private final ClientId clientId = ClientId.randomId();
private final AtomicLong deletedDirsCount;
@@ -92,6 +94,7 @@ public abstract class AbstractKeyDeletingService extends
BackgroundService
this.movedDirsCount = new AtomicLong(0);
this.movedFilesCount = new AtomicLong(0);
this.runCount = new AtomicLong(0);
+ this.metrics = ozoneManager.getDeletionMetrics();
}
protected int processKeyDeletes(List<BlockGroup> keyBlocksList,
@@ -450,8 +453,9 @@ public abstract class AbstractKeyDeletingService extends
BackgroundService
}
if (dirNum != 0 || subDirNum != 0 || subFileNum != 0) {
+ long subdirMoved = subDirNum - subdirDelNum;
deletedDirsCount.addAndGet(dirNum + subdirDelNum);
- movedDirsCount.addAndGet(subDirNum - subdirDelNum);
+ movedDirsCount.addAndGet(subdirMoved);
movedFilesCount.addAndGet(subFileNum);
long timeTakenInIteration = Time.monotonicNow() - startTime;
LOG.info("Number of dirs deleted: {}, Number of sub-dir " +
@@ -461,6 +465,7 @@ public abstract class AbstractKeyDeletingService extends
BackgroundService
" totalRunCount: {}",
dirNum, subdirDelNum, subFileNum, (subDirNum - subdirDelNum), limit,
timeTakenInIteration, rnCnt);
+ metrics.incrementDirectoryDeletionTotalMetrics(dirNum + subdirDelNum,
subDirNum, subFileNum);
}
return remainNum;
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
index 9a4f74eba5..797b2b9bf9 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
@@ -39,6 +39,7 @@ import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.TableIterator;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.common.BlockGroup;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.OmSnapshot;
@@ -98,6 +99,7 @@ public class KeyDeletingService extends
AbstractKeyDeletingService {
private AtomicBoolean isRunningOnAOS;
private final boolean deepCleanSnapshots;
private final SnapshotChainManager snapshotChainManager;
+ private DeletingServiceMetrics metrics;
public KeyDeletingService(OzoneManager ozoneManager,
ScmBlockLocationProtocol scmClient,
@@ -121,6 +123,7 @@ public class KeyDeletingService extends
AbstractKeyDeletingService {
this.isRunningOnAOS = new AtomicBoolean(false);
this.deepCleanSnapshots = deepCleanSnapshots;
this.snapshotChainManager =
((OmMetadataManagerImpl)manager.getMetadataManager()).getSnapshotChainManager();
+ this.metrics = ozoneManager.getDeletionMetrics();
}
/**
@@ -222,6 +225,8 @@ public class KeyDeletingService extends
AbstractKeyDeletingService {
getOzoneManager().getKeyManager(),
pendingKeysDeletion.getKeysToModify(), null,
expectedPreviousSnapshotId);
deletedKeyCount.addAndGet(delCount);
+ metrics.incrNumKeysProcessed(keyBlocksList.size());
+ metrics.incrNumKeysSentForPurge(delCount);
}
} catch (IOException e) {
LOG.error("Error while running delete keys background task. Will " +
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
index c18e1ee7c3..547cdbe895 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
@@ -33,6 +33,7 @@ import
org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import org.apache.hadoop.ozone.OzoneConfigKeys;
+import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
import org.apache.hadoop.ozone.om.IOmMetadataReader;
import org.apache.hadoop.ozone.om.OMPerformanceMetrics;
import org.apache.hadoop.ozone.om.OmMetadataReader;
@@ -119,6 +120,7 @@ public class TestOMKeyRequest {
protected ScmBlockLocationProtocol scmBlockLocationProtocol;
protected StorageContainerLocationProtocol scmContainerLocationProtocol;
protected OMPerformanceMetrics metrics;
+ protected DeletingServiceMetrics delMetrics;
protected static final long CONTAINER_ID = 1000L;
protected static final long LOCAL_ID = 100L;
@@ -139,6 +141,7 @@ public class TestOMKeyRequest {
ozoneManager = mock(OzoneManager.class);
omMetrics = OMMetrics.create();
metrics = OMPerformanceMetrics.register();
+ delMetrics = DeletingServiceMetrics.create();
OzoneConfiguration ozoneConfiguration = getOzoneConfiguration();
ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS,
folder.toAbsolutePath().toString());
@@ -150,6 +153,7 @@ public class TestOMKeyRequest {
ozoneManager);
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
when(ozoneManager.getPerfMetrics()).thenReturn(metrics);
+ when(ozoneManager.getDeletionMetrics()).thenReturn(delMetrics);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration);
OMLayoutVersionManager lvm = mock(OMLayoutVersionManager.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]