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

swamirishi 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 527d30a2f09 HDDS-13760. Track last purge transactionInfo in memory to 
track inflight purge request in KDS and DDS (#9116)
527d30a2f09 is described below

commit 527d30a2f0959994724ffc9d804292051f42e03c
Author: Swaminathan Balachandran <[email protected]>
AuthorDate: Wed Oct 8 05:36:53 2025 -0400

    HDDS-13760. Track last purge transactionInfo in memory to track inflight 
purge request in KDS and DDS (#9116)
---
 .../hadoop/ozone/om/DeletingServiceMetrics.java    | 24 ++++++++++++++++++++++
 .../org/apache/hadoop/ozone/om/KeyManagerImpl.java | 15 +++-----------
 .../key/OMDirectoriesPurgeRequestWithFSO.java      |  7 ++++++-
 .../ozone/om/request/key/OMKeyPurgeRequest.java    |  7 ++++++-
 .../om/service/AbstractKeyDeletingService.java     | 15 ++++++++++++++
 .../ozone/om/service/DirectoryDeletingService.java |  2 ++
 .../ozone/om/service/KeyDeletingService.java       |  2 ++
 7 files changed, 58 insertions(+), 14 deletions(-)

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
index 09f097bd5a6..ec4a110a4f9 100644
--- 
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
@@ -20,6 +20,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import java.time.Instant;
 import java.util.concurrent.TimeUnit;
+import org.apache.hadoop.hdds.utils.TransactionInfo;
 import org.apache.hadoop.metrics2.annotation.Metric;
 import org.apache.hadoop.metrics2.annotation.Metrics;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
@@ -109,6 +110,17 @@ public final class DeletingServiceMetrics {
   @Metric("Snapshot: No. of not reclaimable keys the last run")
   private MutableGaugeLong snapKeysNotReclaimableLast;
 
+  /**
+   * Metric to track the term ID of the last key that was purged from the
+   * Active Object Store (AOS). This term ID represents the state of the
+   * most recent successful purge operation in the AOS. This value would be 
used ensure that a background
+   * KeyDeletingService/DirectoryDeletingService doesn't start the next run 
until the previous run has been flushed.
+   */
+  @Metric("Last Purge Key termIndex on Active Object Store")
+  private MutableGaugeLong lastAOSPurgeTermId;
+  @Metric("Last Purge Key transactionId on Active Object Store")
+  private MutableGaugeLong lastAOSPurgeTransactionId;
+
   private DeletingServiceMetrics() {
     this.registry = new MetricsRegistry(METRICS_SOURCE_NAME);
   }
@@ -287,6 +299,18 @@ public long getSnapKeysNotReclaimableLast() {
     return snapKeysNotReclaimableLast.value();
   }
 
+  public synchronized TransactionInfo getLastAOSTransactionInfo() {
+    return TransactionInfo.valueOf(lastAOSPurgeTermId.value(), 
lastAOSPurgeTransactionId.value());
+  }
+
+  public synchronized void setLastAOSTransactionInfo(TransactionInfo 
transactionInfo) {
+    TransactionInfo previousTransactionInfo = getLastAOSTransactionInfo();
+    if (transactionInfo.compareTo(previousTransactionInfo) > 0) {
+      this.lastAOSPurgeTermId.set(transactionInfo.getTerm());
+      
this.lastAOSPurgeTransactionId.set(transactionInfo.getTransactionIndex());
+    }
+  }
+
   @VisibleForTesting
   public void resetDirectoryMetrics() {
     numDirsPurged.set(0);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
index d48e15cf66d..8c50232355c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
@@ -2209,20 +2209,12 @@ private <T extends WithParentObjectId> DeleteKeysResult 
gatherSubPathsWithIterat
     String seekFileInDB = metadataManager.getOzonePathKey(volumeId, bucketId,
         parentInfo.getObjectID(), "");
     long consumedSize = 0;
-    boolean processedSubPaths = false;
     try (TableIterator<String, ? extends KeyValue<String, T>> iterator = 
table.iterator(seekFileInDB)) {
       while (iterator.hasNext() && remainingBufLimit > 0) {
         KeyValue<String, T> entry = iterator.next();
-        T withParentObjectId = entry.getValue();
         final long objectSerializedSize = entry.getValueByteSize();
-        if 
(!OMFileRequest.isImmediateChild(withParentObjectId.getParentObjectID(),
-            parentInfo.getObjectID())) {
-          processedSubPaths = true;
-          break;
-        }
-        if (!table.isExist(entry.getKey())) {
-          continue;
-        }
+        // No need to check the table again as the value in cache and iterator 
would be same when directory
+        // deleting service runs.
         if (remainingBufLimit - objectSerializedSize < 0) {
           break;
         }
@@ -2233,8 +2225,7 @@ private <T extends WithParentObjectId> DeleteKeysResult 
gatherSubPathsWithIterat
           consumedSize += objectSerializedSize;
         }
       }
-      processedSubPaths = processedSubPaths || (!iterator.hasNext());
-      return new DeleteKeysResult(keyInfos, consumedSize, processedSubPaths);
+      return new DeleteKeysResult(keyInfos, consumedSize, !iterator.hasNext());
     }
   }
 
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 4724410803e..a0d64234343 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
@@ -204,11 +204,16 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
       deletingServiceMetrics.incrNumDirPurged(numDirsDeleted);
 
       Map<String, String> auditParams = new LinkedHashMap<>();
+      TransactionInfo transactionInfo = 
TransactionInfo.valueOf(context.getTermIndex());
       if (fromSnapshotInfo != null) {
-        
fromSnapshotInfo.setLastTransactionInfo(TransactionInfo.valueOf(context.getTermIndex()).toByteString());
+        
fromSnapshotInfo.setLastTransactionInfo(transactionInfo.toByteString());
         omMetadataManager.getSnapshotInfoTable().addCacheEntry(new 
CacheKey<>(fromSnapshotInfo.getTableKey()),
             CacheValue.get(context.getIndex(), fromSnapshotInfo));
         auditParams.put(AUDIT_PARAM_SNAPSHOT_ID, 
fromSnapshotInfo.getSnapshotId().toString());
+      } else {
+        // Update the deletingServiceMetrics with the transaction index to 
indicate the
+        // last purge transaction when running for AOS
+        deletingServiceMetrics.setLastAOSTransactionInfo(transactionInfo);
       }
 
       auditParams.put(AUDIT_PARAM_DIRS_DELETED, 
String.valueOf(numDirsDeleted));
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 66973b294c1..b649c1ef6ca 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
@@ -127,11 +127,16 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
     // services.
     try {
       Map<String, String> auditParams = new LinkedHashMap<>();
+      TransactionInfo transactionInfo = 
TransactionInfo.valueOf(context.getTermIndex());
       if (fromSnapshotInfo != null) {
-        
fromSnapshotInfo.setLastTransactionInfo(TransactionInfo.valueOf(context.getTermIndex()).toByteString());
+        
fromSnapshotInfo.setLastTransactionInfo(transactionInfo.toByteString());
         omMetadataManager.getSnapshotInfoTable().addCacheEntry(new 
CacheKey<>(fromSnapshotInfo.getTableKey()),
             CacheValue.get(context.getIndex(), fromSnapshotInfo));
         auditParams.put(AUDIT_PARAM_SNAPSHOT_ID, 
fromSnapshotInfo.getSnapshotId().toString());
+      } else {
+        // Update the deletingServiceMetrics with the transaction index to 
indicate the
+        // last purge transaction when running for AOS
+        deletingServiceMetrics.setLastAOSTransactionInfo(transactionInfo);
       }
       auditParams.put(AUDIT_PARAM_KEYS_DELETED, 
String.valueOf(numKeysDeleted));
       auditParams.put(AUDIT_PARAM_RENAMED_KEYS_PURGED, 
String.valueOf(renamedKeysToBePurged.size()));
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 3ee50ffd04f..5650ab7734e 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
@@ -19,12 +19,14 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.protobuf.ServiceException;
+import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.hadoop.hdds.utils.BackgroundService;
+import org.apache.hadoop.hdds.utils.TransactionInfo;
 import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
 import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
 import org.apache.hadoop.ozone.om.OMPerformanceMetrics;
@@ -77,6 +79,19 @@ final boolean shouldRun() {
     return !suspended.get() && getOzoneManager().isLeaderReady();
   }
 
+  boolean isPreviousPurgeTransactionFlushed() throws IOException {
+    TransactionInfo lastAOSTransactionId = metrics.getLastAOSTransactionInfo();
+    TransactionInfo flushedTransactionId = TransactionInfo.readTransactionInfo(
+        getOzoneManager().getMetadataManager());
+    if (flushedTransactionId != null && 
lastAOSTransactionId.compareTo(flushedTransactionId) > 0) {
+      LOG.info("Skipping AOS processing since changes to deleted space of AOS 
have not been flushed to disk " +
+              "last Purge Transaction: {}, Flushed Disk Transaction: {}", 
lastAOSTransactionId,
+          flushedTransactionId);
+      return false;
+    }
+    return true;
+  }
+
   /**
    * Suspend the service.
    */
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
index 7abf1406d96..001e686455f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
@@ -714,6 +714,8 @@ public BackgroundTaskResult call() {
                   snapInfo);
               return BackgroundTaskResult.EmptyTaskResult.newResult();
             }
+          } else if (!isPreviousPurgeTransactionFlushed()) {
+            return BackgroundTaskResult.EmptyTaskResult.newResult();
           }
           try (UncheckedAutoCloseableSupplier<OmSnapshot> omSnapshot = 
snapInfo == null ? null :
               omSnapshotManager.getActiveSnapshot(snapInfo.getVolumeName(), 
snapInfo.getBucketName(),
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 a81f4674cfd..d7dba697b71 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
@@ -566,6 +566,8 @@ public BackgroundTaskResult call() {
                   " iteration.", snapInfo);
               return EmptyTaskResult.newResult();
             }
+          } else if (!isPreviousPurgeTransactionFlushed()) {
+            return EmptyTaskResult.newResult();
           }
           try (UncheckedAutoCloseableSupplier<OmSnapshot> omSnapshot = 
snapInfo == null ? null :
               omSnapshotManager.getActiveSnapshot(snapInfo.getVolumeName(), 
snapInfo.getBucketName(),


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

Reply via email to