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

nanda 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 f1b59f16ad HDDS-12139. Refactor TestSnapshotChainRepair. (#7752)
f1b59f16ad is described below

commit f1b59f16ad64d8cd7fdf06470d2078be6467dd33
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Jan 28 07:23:15 2025 +0100

    HDDS-12139. Refactor TestSnapshotChainRepair. (#7752)
---
 .../ozone/repair/om/TestSnapshotChainRepair.java   | 246 ++++++++-------------
 1 file changed, 87 insertions(+), 159 deletions(-)

diff --git 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/repair/om/TestSnapshotChainRepair.java
 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/repair/om/TestSnapshotChainRepair.java
index ba96742c23..e09b07707d 100644
--- 
a/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/repair/om/TestSnapshotChainRepair.java
+++ 
b/hadoop-ozone/tools/src/test/java/org/apache/hadoop/ozone/repair/om/TestSnapshotChainRepair.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.ozone.repair.om;
 
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.hadoop.hdds.utils.IOUtils;
 import org.apache.hadoop.hdds.utils.db.StringCodec;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
@@ -25,7 +26,6 @@
 import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
 import org.apache.hadoop.ozone.repair.OzoneRepair;
 import org.apache.ozone.test.GenericTestUtils;
-import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -34,6 +34,7 @@
 import org.mockito.MockedStatic;
 import org.rocksdb.ColumnFamilyHandle;
 import org.rocksdb.RocksDB;
+import org.rocksdb.RocksDBException;
 import org.rocksdb.RocksIterator;
 import org.rocksdb.ColumnFamilyDescriptor;
 
@@ -47,13 +48,13 @@
 
 import static org.apache.ozone.test.IntLambda.withTextFromSystemIn;
 import static org.apache.hadoop.ozone.OzoneConsts.SNAPSHOT_INFO_TABLE;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
-import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -62,12 +63,14 @@
  */
 public class TestSnapshotChainRepair {
 
+  private static final String VOLUME_NAME = "vol1";
+  private static final String BUCKET_NAME = "bucket1";
+  private static final String DB_PATH = "testDBPath";
+
   private ManagedRocksDB managedRocksDB;
   private RocksDB rocksDB;
   private ColumnFamilyHandle columnFamilyHandle;
 
-  private static final String DB_PATH = "testDBPath";
-
   private MockedStatic<ManagedRocksDB> mockedDB;
   private MockedStatic<RocksDBUtils> mockedUtils;
 
@@ -86,18 +89,11 @@ public void setup() throws Exception {
 
   @AfterEach
   public void tearDown() {
-    IOUtils.closeQuietly(out, err);
-
-    if (mockedDB != null) {
-      mockedDB.close();
-    }
-    if (mockedUtils != null) {
-      mockedUtils.close();
-    }
+    IOUtils.closeQuietly(out, err, mockedDB, mockedUtils);
   }
 
   private void setupMockDB(SnapshotInfo snapshotInfo,
-      List<SnapshotInfo> iteratorSnapshots) throws Exception {
+      SnapshotInfo... snapshots) throws Exception {
 
     managedRocksDB = mock(ManagedRocksDB.class);
     rocksDB = mock(RocksDB.class);
@@ -134,28 +130,22 @@ private void setupMockDB(SnapshotInfo snapshotInfo,
     when(rocksDB.newIterator(columnFamilyHandle)).thenReturn(rocksIterator);
 
     // Setup iterator behavior based on provided snapshots
-    if (iteratorSnapshots.isEmpty()) {
+    if (snapshots.length == 0) {
       when(rocksIterator.isValid()).thenReturn(false);
     } else {
-      Boolean[] remainingValidResponses = new 
Boolean[iteratorSnapshots.size()];
-      for (int i = 0; i < iteratorSnapshots.size() - 1; i++) {
-        remainingValidResponses[i] = true;
-      }
-      remainingValidResponses[iteratorSnapshots.size() - 1] = false;
+      Boolean[] remainingValidResponses = new Boolean[snapshots.length + 1];
+      Arrays.fill(remainingValidResponses, true);
+      remainingValidResponses[remainingValidResponses.length - 1] = false;
 
       when(rocksIterator.isValid())
           .thenReturn(true, remainingValidResponses);
 
       ArrayList<byte[]> valueResponses = new ArrayList<>();
-      for (SnapshotInfo snap : iteratorSnapshots) {
-        try {
-          valueResponses.add(SnapshotInfo.getCodec().toPersistedFormat(snap));
-        } catch (IOException e) {
-          Assertions.fail("Failed to serialize snapshot info");
-        }
+      for (SnapshotInfo snap : snapshots) {
+        valueResponses.add(SnapshotInfo.getCodec().toPersistedFormat(snap));
       }
-      byte[] firstValue = valueResponses.get(0);
-      byte[][] remainingValueResponses = valueResponses.subList(1, 
valueResponses.size()).toArray(new byte[0][]);
+      byte[] firstValue = 
SnapshotInfo.getCodec().toPersistedFormat(snapshotInfo);
+      byte[][] remainingValueResponses = valueResponses.toArray(new byte[0][]);
       when(rocksIterator.value())
           .thenReturn(firstValue, remainingValueResponses);
     }
@@ -164,213 +154,151 @@ private void setupMockDB(SnapshotInfo snapshotInfo,
   @ParameterizedTest
   @ValueSource(booleans = {true, false})
   public void testSuccessfulRepair(boolean dryRun) throws Exception {
-    String volumeName = "vol1";
-    String bucketName = "bucket1";
-    String snapshotName = "snap1";
-    String globalPrevSnapshotName = "global-prev-snap1";
-    String pathPrevSnapshotName = "path-prev-snap1";
-
-    UUID snapshotId = UUID.randomUUID();
-    UUID globalPrevSnapshotId = UUID.randomUUID();
-    UUID pathPrevSnapshotId = UUID.randomUUID();
-
-    SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName, 
bucketName, snapshotName, snapshotId, 0);
-    SnapshotInfo globalPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName, globalPrevSnapshotName,
-        globalPrevSnapshotId, 0);
-    SnapshotInfo pathPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName, pathPrevSnapshotName,
-        pathPrevSnapshotId, 0);
-
-    List<SnapshotInfo> iteratorSnapshots = Arrays.asList(
-        snapshotInfo, globalPrevSnapshot, pathPrevSnapshot);
+    SnapshotInfo snapshotInfo = newSnapshot();
+    SnapshotInfo globalPrevSnapshot = newSnapshot();
+    SnapshotInfo pathPrevSnapshot = newSnapshot();
 
     List<String> argsList = new ArrayList<>(Arrays.asList(
         "om", "snapshot", "chain",
-        volumeName + "/" + bucketName,
-        snapshotName,
+        VOLUME_NAME + "/" + BUCKET_NAME,
+        snapshotInfo.getName(),
         "--db", DB_PATH,
-        "--global-previous", globalPrevSnapshotId.toString(),
-        "--path-previous", pathPrevSnapshotId.toString()));
+        "--global-previous", globalPrevSnapshot.getSnapshotId().toString(),
+        "--path-previous", pathPrevSnapshot.getSnapshotId().toString()));
 
     if (dryRun) {
       argsList.add("--dry-run");
     }
 
-    setupMockDB(snapshotInfo, iteratorSnapshots);
+    setupMockDB(snapshotInfo, globalPrevSnapshot, pathPrevSnapshot);
 
     CommandLine cli = new OzoneRepair().getCmd();
     withTextFromSystemIn("y")
         .execute(() -> cli.execute(argsList.toArray(new String[0])));
 
-    String output = out.getOutput();
-    assertTrue(output.contains("Updating SnapshotInfo to"));
+    assertThat(out.getOutput()).contains("Updating SnapshotInfo to");
 
-    if (dryRun) {
-      // Verify DB update was NOT called in dry run mode
-      verify(rocksDB, never()).put(
-          eq(columnFamilyHandle),
-          eq(StringCodec.get().toPersistedFormat(snapshotInfo.getTableKey())),
-          eq(SnapshotInfo.getCodec().toPersistedFormat(snapshotInfo)));
-    } else {
-      // Verify DB update was called with correct parameters
-      verify(rocksDB).put(
-          eq(columnFamilyHandle),
-          eq(StringCodec.get().toPersistedFormat(snapshotInfo.getTableKey())),
-          eq(SnapshotInfo.getCodec().toPersistedFormat(snapshotInfo)));
-      assertTrue(output.contains("Snapshot Info is updated"));
-    }
+    verifyDbWrite(snapshotInfo, !dryRun);
   }
 
   @Test
   public void testGlobalPreviousMatchesSnapshotId() throws Exception {
-    String volumeName = "vol1";
-    String bucketName = "bucket1";
-    String snapshotName = "snap1";
-
-    UUID snapshotId = UUID.randomUUID();
-    // Use same ID for global previous to trigger error
-    UUID globalPrevSnapshotId = snapshotId;
-    UUID pathPrevSnapshotId = UUID.randomUUID();
-
-    SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        snapshotName, snapshotId, 0);
-    SnapshotInfo pathPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        "path-prev", pathPrevSnapshotId, 0);
-
-    List<SnapshotInfo> iteratorSnapshots = Arrays.asList(
-        snapshotInfo, pathPrevSnapshot);
+    SnapshotInfo snapshotInfo = newSnapshot();
+    SnapshotInfo pathPrevSnapshot = newSnapshot();
 
     String[] args = new String[] {
         "om", "snapshot", "chain",
-        volumeName + "/" + bucketName,
-        snapshotName,
+        VOLUME_NAME + "/" + BUCKET_NAME,
+        snapshotInfo.getName(),
         "--db", DB_PATH,
-        "--global-previous", globalPrevSnapshotId.toString(),
-        "--path-previous", pathPrevSnapshotId.toString(),
+        // Use same ID for global previous to trigger error
+        "--global-previous", snapshotInfo.getSnapshotId().toString(),
+        "--path-previous", pathPrevSnapshot.getSnapshotId().toString(),
     };
 
-    setupMockDB(snapshotInfo, iteratorSnapshots);
+    setupMockDB(snapshotInfo, pathPrevSnapshot);
 
     CommandLine cli = new OzoneRepair().getCmd();
     withTextFromSystemIn("y")
         .execute(() -> cli.execute(args));
 
-    String errorOutput = err.getOutput();
-    assertTrue(errorOutput.contains("globalPreviousSnapshotId: '" + 
globalPrevSnapshotId +
-        "' is equal to given snapshot's ID"));
+    assertThat(err.getOutput()).contains("globalPreviousSnapshotId: '" + 
snapshotInfo.getSnapshotId() +
+        "' is equal to given snapshot's ID");
+    verifyDbWrite(snapshotInfo, false);
   }
 
   @Test
   public void testPathPreviousMatchesSnapshotId() throws Exception {
-    String volumeName = "vol1";
-    String bucketName = "bucket1";
-    String snapshotName = "snap1";
-
-    UUID snapshotId = UUID.randomUUID();
-    UUID globalPrevSnapshotId = UUID.randomUUID();
-    // Use same ID for path previous to trigger error
-    UUID pathPrevSnapshotId = snapshotId;
-
-    SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        snapshotName, snapshotId, 0);
-    SnapshotInfo globalPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        "global-prev", globalPrevSnapshotId, 0);
-
-    List<SnapshotInfo> iteratorSnapshots = Arrays.asList(
-        snapshotInfo, globalPrevSnapshot);
+    SnapshotInfo snapshotInfo = newSnapshot();
+    SnapshotInfo globalPrevSnapshot = newSnapshot();
 
     String[] args = new String[] {
         "om", "snapshot", "chain",
-        volumeName + "/" + bucketName,
-        snapshotName,
+        VOLUME_NAME + "/" + BUCKET_NAME,
+        snapshotInfo.getName(),
         "--db", DB_PATH,
-        "--global-previous", globalPrevSnapshotId.toString(),
-        "--path-previous", pathPrevSnapshotId.toString(),
+        "--global-previous", globalPrevSnapshot.getSnapshotId().toString(),
+        // Use same ID for path previous to trigger error
+        "--path-previous", snapshotInfo.getSnapshotId().toString(),
     };
 
-    setupMockDB(snapshotInfo, iteratorSnapshots);
+    setupMockDB(snapshotInfo, globalPrevSnapshot);
 
     CommandLine cli = new OzoneRepair().getCmd();
     withTextFromSystemIn("y")
         .execute(() -> cli.execute(args));
 
-    String errorOutput = err.getOutput();
-    assertTrue(errorOutput.contains("pathPreviousSnapshotId: '" + 
pathPrevSnapshotId +
-        "' is equal to given snapshot's ID"));
+    assertThat(err.getOutput()).contains("pathPreviousSnapshotId: '" + 
snapshotInfo.getSnapshotId() +
+        "' is equal to given snapshot's ID");
+    verifyDbWrite(snapshotInfo, false);
   }
 
   @Test
   public void testGlobalPreviousDoesNotExist() throws Exception {
-    String volumeName = "vol1";
-    String bucketName = "bucket1";
-    String snapshotName = "snap1";
-
-    UUID snapshotId = UUID.randomUUID();
-    UUID globalPrevSnapshotId = UUID.randomUUID();
-    UUID pathPrevSnapshotId = UUID.randomUUID();
+    String nonexistent = UUID.randomUUID().toString();
 
-    SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        snapshotName, snapshotId, 0);
-    SnapshotInfo pathPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        "path-prev", pathPrevSnapshotId, 0);
-
-    List<SnapshotInfo> iteratorSnapshots = Arrays.asList(
-        snapshotInfo, pathPrevSnapshot);
+    SnapshotInfo snapshotInfo = newSnapshot();
+    SnapshotInfo pathPrevSnapshot = newSnapshot();
 
     String[] args = new String[] {
         "om", "snapshot", "chain",
-        volumeName + "/" + bucketName,
-        snapshotName,
+        VOLUME_NAME + "/" + BUCKET_NAME,
+        snapshotInfo.getName(),
         "--db", DB_PATH,
-        "--global-previous", globalPrevSnapshotId.toString(),
-        "--path-previous", pathPrevSnapshotId.toString(),
+        "--global-previous", nonexistent,
+        "--path-previous", pathPrevSnapshot.getSnapshotId().toString(),
     };
 
-    setupMockDB(snapshotInfo, iteratorSnapshots);
+    setupMockDB(snapshotInfo, pathPrevSnapshot);
 
     CommandLine cli = new OzoneRepair().getCmd();
     withTextFromSystemIn("y")
         .execute(() -> cli.execute(args));
 
-    String errorOutput = err.getOutput();
-    assertTrue(errorOutput.contains("globalPreviousSnapshotId: '" + 
globalPrevSnapshotId +
-        "' does not exist in snapshotInfoTable"));
+    assertThat(err.getOutput()).contains("globalPreviousSnapshotId: '" + 
nonexistent +
+        "' does not exist in snapshotInfoTable");
+    verifyDbWrite(snapshotInfo, false);
   }
 
   @Test
   public void testPathPreviousDoesNotExist() throws Exception {
-    String volumeName = "vol1";
-    String bucketName = "bucket1";
-    String snapshotName = "snap1";
-
-    UUID snapshotId = UUID.randomUUID();
-    UUID globalPrevSnapshotId = UUID.randomUUID();
-    UUID pathPrevSnapshotId = UUID.randomUUID();
+    String nonexistent = UUID.randomUUID().toString();
 
-    SnapshotInfo snapshotInfo = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        snapshotName, snapshotId, 0);
-    SnapshotInfo globalPrevSnapshot = SnapshotInfo.newInstance(volumeName, 
bucketName,
-        "global-prev", globalPrevSnapshotId, 0);
-
-    List<SnapshotInfo> iteratorSnapshots = Arrays.asList(
-        snapshotInfo, globalPrevSnapshot);
+    SnapshotInfo snapshotInfo = newSnapshot();
+    SnapshotInfo globalPrevSnapshot = newSnapshot();
 
     String[] args = new String[] {
         "om", "snapshot", "chain",
-        volumeName + "/" + bucketName,
-        snapshotName,
+        VOLUME_NAME + "/" + BUCKET_NAME,
+        snapshotInfo.getName(),
         "--db", DB_PATH,
-        "--global-previous", globalPrevSnapshotId.toString(),
-        "--path-previous", pathPrevSnapshotId.toString(),
+        "--global-previous", globalPrevSnapshot.getSnapshotId().toString(),
+        "--path-previous", nonexistent,
     };
 
-    setupMockDB(snapshotInfo, iteratorSnapshots);
+    setupMockDB(snapshotInfo, globalPrevSnapshot);
 
     CommandLine cli = new OzoneRepair().getCmd();
     withTextFromSystemIn("y")
         .execute(() -> cli.execute(args));
 
-    String errorOutput = err.getOutput();
-    assertTrue(errorOutput.contains("pathPreviousSnapshotId: '" + 
pathPrevSnapshotId +
-        "' does not exist in snapshotInfoTable"));
+    assertThat(err.getOutput()).contains("pathPreviousSnapshotId: '" + 
nonexistent +
+        "' does not exist in snapshotInfoTable");
+    verifyDbWrite(snapshotInfo, false);
+  }
+
+  private static SnapshotInfo newSnapshot() {
+    String name = RandomStringUtils.insecure().nextAlphanumeric(10);
+    return SnapshotInfo.newInstance(VOLUME_NAME, BUCKET_NAME, name, 
UUID.randomUUID(), 0);
+  }
+
+  private void verifyDbWrite(SnapshotInfo snapshotInfo, boolean 
updateExpected) throws RocksDBException, IOException {
+    verify(rocksDB, times(updateExpected ? 1 : 0)).put(
+        eq(columnFamilyHandle),
+        eq(StringCodec.get().toPersistedFormat(snapshotInfo.getTableKey())),
+        eq(SnapshotInfo.getCodec().toPersistedFormat(snapshotInfo)));
+    if (updateExpected) {
+      assertThat(out.get()).contains("Snapshot Info is updated");
+    }
   }
 }


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

Reply via email to