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 ad108c86b1 HDDS-11997. Duplicate snapshot purge request causes NPE 
(#7627)
ad108c86b1 is described below

commit ad108c86b11606d49f8ea9b739e40340a2117fe2
Author: Swaminathan Balachandran <47532440+swamiri...@users.noreply.github.com>
AuthorDate: Mon Dec 30 10:22:32 2024 -0800

    HDDS-11997. Duplicate snapshot purge request causes NPE (#7627)
---
 .../request/snapshot/OMSnapshotPurgeRequest.java   |  4 ++-
 .../response/snapshot/OMSnapshotPurgeResponse.java |  6 ++++
 .../TestOMSnapshotPurgeRequestAndResponse.java     | 37 ++++++++++++++++++++++
 3 files changed, 46 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotPurgeRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotPurgeRequest.java
index 38c51d4de5..62fbb39417 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotPurgeRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotPurgeRequest.java
@@ -227,7 +227,9 @@ public class OMSnapshotPurgeRequest extends OMClientRequest 
{
 
     if (snapshotInfo == null) {
       snapshotInfo = 
omMetadataManager.getSnapshotInfoTable().get(snapshotTableKey);
-      updatedSnapshotInfos.put(snapshotTableKey, snapshotInfo);
+      if (snapshotInfo != null) {
+        updatedSnapshotInfos.put(snapshotTableKey, snapshotInfo);
+      }
     }
     return snapshotInfo;
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
index 81a020653f..826293366b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java
@@ -18,6 +18,7 @@
  */
 package org.apache.hadoop.ozone.om.response.snapshot;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.hdds.utils.db.BatchOperation;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -138,4 +139,9 @@ public class OMSnapshotPurgeResponse extends 
OMClientResponse {
       }
     }
   }
+
+  @VisibleForTesting
+  public Map<String, SnapshotInfo> getUpdatedSnapInfos() {
+    return updatedSnapInfos;
+  }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
index 1c44decdfd..8c1f38c01c 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotPurgeRequestAndResponse.java
@@ -56,6 +56,7 @@ import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.anyString;
@@ -186,6 +187,42 @@ public class TestOMSnapshotPurgeRequestAndResponse extends 
TestSnapshotRequestAn
     assertEquals(initialSnapshotPurgeFailCount, 
getOmMetrics().getNumSnapshotPurgeFails());
   }
 
+  @Test
+  public void testDuplicateSnapshotPurge() throws Exception {
+    List<String> snapshotDbKeysToPurge = createSnapshots(1);
+    assertFalse(getOmMetadataManager().getSnapshotInfoTable().isEmpty());
+    OMRequest snapshotPurgeRequest = createPurgeKeysRequest(
+        snapshotDbKeysToPurge);
+
+    OMSnapshotPurgeRequest omSnapshotPurgeRequest = 
preExecute(snapshotPurgeRequest);
+
+    OMSnapshotPurgeResponse omSnapshotPurgeResponse = (OMSnapshotPurgeResponse)
+        omSnapshotPurgeRequest.validateAndUpdateCache(getOzoneManager(), 200L);
+
+    try (BatchOperation batchOperation = 
getOmMetadataManager().getStore().initBatchOperation()) {
+      omSnapshotPurgeResponse.checkAndUpdateDB(getOmMetadataManager(), 
batchOperation);
+      getOmMetadataManager().getStore().commitBatchOperation(batchOperation);
+    }
+
+    // Check if the entries are deleted.
+    assertTrue(getOmMetadataManager().getSnapshotInfoTable().isEmpty());
+
+    OMSnapshotPurgeResponse omSnapshotPurgeResponse1 = 
(OMSnapshotPurgeResponse)
+        omSnapshotPurgeRequest.validateAndUpdateCache(getOzoneManager(), 201L);
+
+    for (Map.Entry<String, SnapshotInfo> purgedSnapshot : 
omSnapshotPurgeResponse1.getUpdatedSnapInfos().entrySet()) {
+      assertNotNull(purgedSnapshot.getValue());
+    }
+    for (String snapshotTableKey: snapshotDbKeysToPurge) {
+      
assertNull(getOmMetadataManager().getSnapshotInfoTable().get(snapshotTableKey));
+    }
+
+    try (BatchOperation batchOperation = 
getOmMetadataManager().getStore().initBatchOperation()) {
+      omSnapshotPurgeResponse1.checkAndUpdateDB(getOmMetadataManager(), 
batchOperation);
+      getOmMetadataManager().getStore().commitBatchOperation(batchOperation);
+    }
+  }
+
   /**
    * This test is mainly to validate metrics and error code.
    */


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@ozone.apache.org
For additional commands, e-mail: commits-h...@ozone.apache.org

Reply via email to