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

siyao 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 4578a06353 HDDS-8435. [Snapshot] Handle Directory renames for FSO 
Buckets. (#4607)
4578a06353 is described below

commit 4578a063533bc1396a218a69613a842ff0b32ec6
Author: Aswin Shakil Balasubramanian <[email protected]>
AuthorDate: Tue May 2 14:23:57 2023 -0700

    HDDS-8435. [Snapshot] Handle Directory renames for FSO Buckets. (#4607)
---
 .../apache/hadoop/ozone/om/OMMetadataManager.java  |  4 +-
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     | 30 ++++----
 .../hadoop/ozone/om/codec/OMDBDefinition.java      | 18 ++---
 .../ozone/om/response/key/OMKeyRenameResponse.java | 10 +--
 .../response/key/OMKeyRenameResponseWithFSO.java   | 29 ++++----
 .../om/response/key/OMKeysRenameResponse.java      |  8 +--
 .../snapshot/OMSnapshotCreateResponse.java         | 10 +--
 .../OMSnapshotMoveDeletedKeysResponse.java         |  2 +-
 .../ozone/om/service/SnapshotDeletingService.java  | 80 +++++++++++++++-------
 .../snapshot/TestOMSnapshotCreateRequest.java      | 70 +++++++++++++++----
 .../om/response/key/TestOMKeyRenameResponse.java   |  6 +-
 11 files changed, 169 insertions(+), 98 deletions(-)

diff --git 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
index 7eed84f753..b3ce046c88 100644
--- 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
+++ 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
@@ -370,7 +370,7 @@ public interface OMMetadataManager extends DBStoreHAManager 
{
 
   Table<String, SnapshotInfo> getSnapshotInfoTable();
 
-  Table<String, String> getSnapshotRenamedKeyTable();
+  Table<String, String> getSnapshotRenamedTable();
 
   /**
    * Gets the OM Meta table.
@@ -492,7 +492,7 @@ public interface OMMetadataManager extends DBStoreHAManager 
{
 
   /**
    * Given a volume, bucket and a objectID, return the DB key name in
-   * snapshotRenamedKeyTable.
+   * snapshotRenamedTable.
    *
    * @param volume   - volume name
    * @param bucket   - bucket name
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index 9d24b6b880..fcd3b2cde2 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -187,7 +187,8 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
    * |----------------------------------------------------------------------|
    * |  openFileTable   | /volumeId/bucketId/parentId/fileName/id -> KeyInfo|
    * |----------------------------------------------------------------------|
-   * |  deletedDirTable | /volumeId/bucketId/parentId/dirName -> KeyInfo    |
+   * |  deletedDirTable | /volumeId/bucketId/parentId/dirName/objectId ->   |
+   * |                  |                                      KeyInfo      |
    * |----------------------------------------------------------------------|
    *
    * Snapshot Tables:
@@ -196,7 +197,10 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
    * 
|-------------------------------------------------------------------------|
    * |  snapshotInfoTable    | /volume/bucket/snapshotName -> SnapshotInfo     
|
    * 
|-------------------------------------------------------------------------|
-   * |snapshotRenamedKeyTable| /volumeName/bucketName/objectID -> /v/b/origKey 
|
+   * | snapshotRenamedTable  | /volumeName/bucketName/objectID -> One of:      
|
+   * |                       |  1. /volumeId/bucketId/parentId/dirName         
|
+   * |                       |  2. /volumeId/bucketId/parentId/fileName        
|
+   * |                       |  3. /volumeName/bucketName/keyName              
|
    * 
|-------------------------------------------------------------------------|
    */
 
@@ -224,8 +228,8 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
       "principalToAccessIdsTable";
   public static final String TENANT_STATE_TABLE = "tenantStateTable";
   public static final String SNAPSHOT_INFO_TABLE = "snapshotInfoTable";
-  public static final String SNAPSHOT_RENAMED_KEY_TABLE =
-      "snapshotRenamedKeyTable";
+  public static final String SNAPSHOT_RENAMED_TABLE =
+      "snapshotRenamedTable";
 
   static final String[] ALL_TABLES = new String[] {
       USER_TABLE,
@@ -248,7 +252,7 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
       PRINCIPAL_TO_ACCESS_IDS_TABLE,
       TENANT_STATE_TABLE,
       SNAPSHOT_INFO_TABLE,
-      SNAPSHOT_RENAMED_KEY_TABLE
+      SNAPSHOT_RENAMED_TABLE
   };
 
   private DBStore store;
@@ -277,7 +281,7 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
   private Table tenantStateTable;
 
   private Table snapshotInfoTable;
-  private Table snapshotRenamedKeyTable;
+  private Table snapshotRenamedTable;
 
   private boolean isRatisEnabled;
   private boolean ignorePipelineinKey;
@@ -576,7 +580,7 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
         .addTable(PRINCIPAL_TO_ACCESS_IDS_TABLE)
         .addTable(TENANT_STATE_TABLE)
         .addTable(SNAPSHOT_INFO_TABLE)
-        .addTable(SNAPSHOT_RENAMED_KEY_TABLE)
+        .addTable(SNAPSHOT_RENAMED_TABLE)
         .addCodec(OzoneTokenIdentifier.class, new TokenIdentifierCodec())
         .addCodec(OmKeyInfo.class, new OmKeyInfoCodec(true))
         .addCodec(RepeatedOmKeyInfo.class,
@@ -697,12 +701,12 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
         String.class, SnapshotInfo.class);
     checkTableStatus(snapshotInfoTable, SNAPSHOT_INFO_TABLE, addCacheMetrics);
 
-    // volumeName/bucketName/objectID -> renamedKey (renamed key for key table)
-    snapshotRenamedKeyTable = this.store.getTable(SNAPSHOT_RENAMED_KEY_TABLE,
+    // volumeName/bucketName/objectID -> renamedKey or renamedDir
+    snapshotRenamedTable = this.store.getTable(SNAPSHOT_RENAMED_TABLE,
         String.class, String.class);
-    checkTableStatus(snapshotRenamedKeyTable, SNAPSHOT_RENAMED_KEY_TABLE,
+    checkTableStatus(snapshotRenamedTable, SNAPSHOT_RENAMED_TABLE,
         addCacheMetrics);
-    // TODO: [SNAPSHOT] Initialize table lock for snapshotRenamedKeyTable.
+    // TODO: [SNAPSHOT] Initialize table lock for snapshotRenamedTable.
   }
 
   /**
@@ -1786,8 +1790,8 @@ public class OmMetadataManagerImpl implements 
OMMetadataManager,
   }
 
   @Override
-  public Table<String, String> getSnapshotRenamedKeyTable() {
-    return snapshotRenamedKeyTable;
+  public Table<String, String> getSnapshotRenamedTable() {
+    return snapshotRenamedTable;
   }
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
index 0b5885e4bf..7a78821e9d 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/codec/OMDBDefinition.java
@@ -231,22 +231,22 @@ public class OMDBDefinition implements DBDefinition {
           new OmDBSnapshotInfoCodec());
 
   /**
-   * SnapshotRenamedKeyTable that complements the keyTable (or fileTable)
-   * entries of the immediately previous snapshot in the same snapshot
-   * scope (bucket or volume).
+   * SnapshotRenamedTable that complements the keyTable (or fileTable)
+   * and dirTable entries of the immediately previous snapshot in the
+   * same snapshot scope (bucket or volume).
    * <p>
-   * Key renames between the two subsequent snapshots are captured, this
+   * Key/Dir renames between the two subsequent snapshots are captured, this
    * information is used in {@link SnapshotDeletingService} to check if the
-   * renamedKey is present in the previous snapshot's keyTable
+   * renamedKey or renamedDir is present in the previous snapshot's keyTable
    * (or fileTable).
    */
   public static final DBColumnFamilyDefinition<String, String>
-      SNAPSHOT_RENAMED_KEY_TABLE =
+      SNAPSHOT_RENAMED_TABLE =
       new DBColumnFamilyDefinition<>(
-          OmMetadataManagerImpl.SNAPSHOT_RENAMED_KEY_TABLE,
+          OmMetadataManagerImpl.SNAPSHOT_RENAMED_TABLE,
           String.class,  // /volumeName/bucketName/objectID
           new StringCodec(),
-          String.class, // path to the key in previous snapshot's 
key(file)Table
+          String.class, // path to key in prev snapshot's key(file)/dir Table.
           new StringCodec());
 
   @Override
@@ -268,7 +268,7 @@ public class OMDBDefinition implements DBDefinition {
         FILE_TABLE, OPEN_FILE_TABLE, DELETED_DIR_TABLE, META_TABLE,
         TENANT_ACCESS_ID_TABLE,
         PRINCIPAL_TO_ACCESS_IDS_TABLE, TENANT_STATE_TABLE,
-        SNAPSHOT_INFO_TABLE, SNAPSHOT_RENAMED_KEY_TABLE};
+        SNAPSHOT_INFO_TABLE, SNAPSHOT_RENAMED_TABLE};
   }
 }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponse.java
index a890ab5c67..9a97a3ea05 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponse.java
@@ -31,12 +31,12 @@ import java.io.IOException;
 import javax.annotation.Nonnull;
 
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.KEY_TABLE;
-import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_KEY_TABLE;
+import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_TABLE;
 
 /**
  * Response for RenameKey request.
  */
-@CleanupTableInfo(cleanupTables = {KEY_TABLE, SNAPSHOT_RENAMED_KEY_TABLE})
+@CleanupTableInfo(cleanupTables = {KEY_TABLE, SNAPSHOT_RENAMED_TABLE})
 public class OMKeyRenameResponse extends OmKeyResponse {
 
   private String fromKeyName;
@@ -85,16 +85,16 @@ public class OMKeyRenameResponse extends OmKeyResponse {
             renameKeyInfo);
 
     // Check if the bucket is in snapshot scope, if yes
-    // add the key to snapshotRenamedKeyTable.
+    // add the key to snapshotRenamedTable.
     boolean isSnapshotBucket = OMClientRequestUtils.
         isSnapshotBucket(omMetadataManager, renameKeyInfo);
     String renameDbKey = omMetadataManager.getRenameKey(
         renameKeyInfo.getVolumeName(), renameKeyInfo.getBucketName(),
         renameKeyInfo.getObjectID());
-    String renamedKey = omMetadataManager.getSnapshotRenamedKeyTable()
+    String renamedKey = omMetadataManager.getSnapshotRenamedTable()
         .get(renameDbKey);
     if (isSnapshotBucket && renamedKey == null) {
-      omMetadataManager.getSnapshotRenamedKeyTable().putWithBatch(
+      omMetadataManager.getSnapshotRenamedTable().putWithBatch(
           batchOperation, renameDbKey, fromDbKey);
     }
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponseWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponseWithFSO.java
index 3e3efbd4d1..5daff92e74 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponseWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyRenameResponseWithFSO.java
@@ -34,13 +34,13 @@ import java.io.IOException;
 
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.DIRECTORY_TABLE;
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.FILE_TABLE;
-import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_KEY_TABLE;
+import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_TABLE;
 
 /**
  * Response for RenameKey request - prefix layout.
  */
 @CleanupTableInfo(cleanupTables = {FILE_TABLE, DIRECTORY_TABLE,
-    SNAPSHOT_RENAMED_KEY_TABLE})
+    SNAPSHOT_RENAMED_TABLE})
 public class OMKeyRenameResponseWithFSO extends OMKeyRenameResponse {
 
   private boolean isRenameDirectory;
@@ -91,20 +91,19 @@ public class OMKeyRenameResponseWithFSO extends 
OMKeyRenameResponse {
           .deleteWithBatch(batchOperation, getFromKeyName());
       omMetadataManager.getKeyTable(getBucketLayout())
           .putWithBatch(batchOperation, getToKeyName(), getRenameKeyInfo());
+    }
 
-      boolean isSnapshotBucket = OMClientRequestUtils.
-          isSnapshotBucket(omMetadataManager, getRenameKeyInfo());
-      String renameDbKey = omMetadataManager.getRenameKey(
-          getRenameKeyInfo().getVolumeName(),
-          getRenameKeyInfo().getBucketName(),
-          getRenameKeyInfo().getObjectID());
-
-      String renamedKey = omMetadataManager.getSnapshotRenamedKeyTable()
-          .get(renameDbKey);
-      if (isSnapshotBucket && renamedKey == null) {
-        omMetadataManager.getSnapshotRenamedKeyTable().putWithBatch(
-            batchOperation, renameDbKey, getFromKeyName());
-      }
+    boolean isSnapshotBucket = OMClientRequestUtils.
+        isSnapshotBucket(omMetadataManager, getRenameKeyInfo());
+    String renameDbKey = omMetadataManager.getRenameKey(
+        getRenameKeyInfo().getVolumeName(),
+        getRenameKeyInfo().getBucketName(),
+        getRenameKeyInfo().getObjectID());
+    String renamedKey = omMetadataManager.getSnapshotRenamedTable()
+        .get(renameDbKey);
+    if (isSnapshotBucket && renamedKey == null) {
+      omMetadataManager.getSnapshotRenamedTable().putWithBatch(
+          batchOperation, renameDbKey, getFromKeyName());
     }
 
     if (fromKeyParent != null) {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeysRenameResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeysRenameResponse.java
index 7625410bb6..f0ea2922a7 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeysRenameResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeysRenameResponse.java
@@ -32,14 +32,14 @@ import java.io.IOException;
 import java.util.Map;
 
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.KEY_TABLE;
-import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_KEY_TABLE;
+import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_TABLE;
 import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK;
 import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.PARTIAL_RENAME;
 
 /**
  * Response for RenameKeys request.
  */
-@CleanupTableInfo(cleanupTables = {KEY_TABLE, SNAPSHOT_RENAMED_KEY_TABLE})
+@CleanupTableInfo(cleanupTables = {KEY_TABLE, SNAPSHOT_RENAMED_TABLE})
 public class OMKeysRenameResponse extends OMClientResponse {
 
   private OmRenameKeys omRenameKeys;
@@ -96,10 +96,10 @@ public class OMKeysRenameResponse extends OMClientResponse {
           newKeyInfo.getVolumeName(), newKeyInfo.getBucketName(),
           newKeyInfo.getObjectID());
 
-      String renamedKey = omMetadataManager.getSnapshotRenamedKeyTable()
+      String renamedKey = omMetadataManager.getSnapshotRenamedTable()
           .get(renameDbKey);
       if (isSnapshotBucket && renamedKey == null) {
-        omMetadataManager.getSnapshotRenamedKeyTable().putWithBatch(
+        omMetadataManager.getSnapshotRenamedTable().putWithBatch(
             batchOperation, renameDbKey, fromDbKey);
       }
     }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java
index 9745e438e9..fd4c11b862 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotCreateResponse.java
@@ -33,14 +33,14 @@ import java.io.IOException;
 
 import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
 import static org.apache.hadoop.ozone.om.OmMetadataManagerImpl.DELETED_TABLE;
-import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_KEY_TABLE;
+import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_RENAMED_TABLE;
 import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.SNAPSHOT_INFO_TABLE;
 
 /**
  * Response for OMSnapshotCreateRequest.
  */
 @CleanupTableInfo(cleanupTables = {
-    DELETED_TABLE, SNAPSHOT_RENAMED_KEY_TABLE, SNAPSHOT_INFO_TABLE})
+    DELETED_TABLE, SNAPSHOT_RENAMED_TABLE, SNAPSHOT_INFO_TABLE})
 public class OMSnapshotCreateResponse extends OMClientResponse {
 
   private SnapshotInfo snapshotInfo;
@@ -82,9 +82,9 @@ public class OMSnapshotCreateResponse extends 
OMClientResponse {
         snapshotInfo);
 
     // TODO: [SNAPSHOT] Move to createOmSnapshotCheckpoint and add table lock
-    // Remove all entries from snapshotRenamedKeyTable
+    // Remove all entries from snapshotRenamedTable
     try (TableIterator<String, ? extends Table.KeyValue<String, String>>
-        iterator = omMetadataManager.getSnapshotRenamedKeyTable().iterator()) {
+        iterator = omMetadataManager.getSnapshotRenamedTable().iterator()) {
 
       String dbSnapshotBucketKey = omMetadataManager.getBucketKey(
           snapshotInfo.getVolumeName(), snapshotInfo.getBucketName())
@@ -96,7 +96,7 @@ public class OMSnapshotCreateResponse extends 
OMClientResponse {
         if (!renameDbKey.startsWith(dbSnapshotBucketKey)) {
           break;
         }
-        omMetadataManager.getSnapshotRenamedKeyTable()
+        omMetadataManager.getSnapshotRenamedTable()
             .deleteWithBatch(batchOperation, renameDbKey);
       }
     }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java
index f09e6dbd13..6c89828e3b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java
@@ -126,7 +126,7 @@ public class OMSnapshotMoveDeletedKeysResponse extends 
OMClientResponse {
     // Move renamed keys to only the next snapshot or active DB.
     if (isNextDB) {
       for (HddsProtos.KeyValue renamedKey: renamedKeysList) {
-        metadataManager.getSnapshotRenamedKeyTable()
+        metadataManager.getSnapshotRenamedTable()
             .putWithBatch(batchOp, renamedKey.getKey(), renamedKey.getValue());
       }
     }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
index 40caf08954..f859b67ec7 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
@@ -156,8 +156,8 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           Table<String, OmKeyInfo> snapshotDeletedDirTable =
               omSnapshot.getMetadataManager().getDeletedDirTable();
 
-          Table<String, String> renamedKeyTable =
-              omSnapshot.getMetadataManager().getSnapshotRenamedKeyTable();
+          Table<String, String> renamedTable =
+              omSnapshot.getMetadataManager().getSnapshotRenamedTable();
 
           long volumeId = ozoneManager.getMetadataManager()
               .getVolumeId(snapInfo.getVolumeName());
@@ -209,12 +209,13 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           // or keep it in current snapshot deleted table.
           List<SnapshotMoveKeyInfos> toReclaimList = new ArrayList<>();
           List<SnapshotMoveKeyInfos> toNextDBList = new ArrayList<>();
-          List<HddsProtos.KeyValue> renamedKeysList = new ArrayList<>();
+          // A list of renamed keys/files/dirs
+          List<HddsProtos.KeyValue> renamedList = new ArrayList<>();
           List<String> dirsToMove = new ArrayList<>();
 
           long remainNum = handleDirectoryCleanUp(snapshotDeletedDirTable,
-              previousDirTable, dbBucketKeyForDir, snapInfo, omSnapshot,
-              dirsToMove);
+              previousDirTable, renamedTable, dbBucketKeyForDir, snapInfo,
+              omSnapshot, dirsToMove, renamedList);
           int deletionCount = 0;
 
           try (TableIterator<String, ? extends Table.KeyValue<String,
@@ -250,7 +251,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
 
               for (OmKeyInfo keyInfo : repeatedOmKeyInfo.getOmKeyInfoList()) {
                 splitRepeatedOmKeyInfo(toReclaim, toNextDb, renamedKey,
-                    keyInfo, previousKeyTable, renamedKeyTable,
+                    keyInfo, previousKeyTable, renamedTable,
                     bucketInfo, volumeId);
               }
 
@@ -271,7 +272,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
               }
 
               if (renamedKey.hasKey() && renamedKey.hasValue()) {
-                renamedKeysList.add(renamedKey.build());
+                renamedList.add(renamedKey.build());
               }
               deletionCount++;
             }
@@ -290,7 +291,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           snapshotLimit--;
           // Submit Move request to OM.
           submitSnapshotMoveDeletedKeys(snapInfo, toReclaimList,
-              toNextDBList, renamedKeysList, dirsToMove);
+              toNextDBList, renamedList, dirsToMove);
         }
         submitSnapshotPurgeRequest(purgeSnapshotKeys);
       } catch (IOException e) {
@@ -325,12 +326,14 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           (isKeyTableCleanedUp || snapshotDeletedTable.isEmpty());
     }
 
+    @SuppressWarnings("checkstyle:ParameterNumber")
     private long handleDirectoryCleanUp(
         Table<String, OmKeyInfo> snapshotDeletedDirTable,
         Table<String, OmDirectoryInfo> previousDirTable,
-        String dbBucketKeyForDir,
-        SnapshotInfo snapInfo, OmSnapshot omSnapshot,
-        List<String> dirsToMove) {
+        Table<String, String> renamedTable,
+        String dbBucketKeyForDir, SnapshotInfo snapInfo,
+        OmSnapshot omSnapshot, List<String> dirsToMove,
+        List<HddsProtos.KeyValue> renamedList) {
 
       long dirNum = 0L;
       long subDirNum = 0L;
@@ -350,7 +353,8 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           Table.KeyValue<String, OmKeyInfo> deletedDir =
               deletedDirIterator.next();
 
-          if (checkDirReclaimable(deletedDir, previousDirTable)) {
+          if (checkDirReclaimable(deletedDir, previousDirTable,
+              renamedTable, renamedList)) {
             // Reclaim here
             PurgePathRequest request = prepareDeleteDirRequest(
                 remainNum, deletedDir.getValue(), deletedDir.getKey(),
@@ -406,10 +410,10 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
         SnapshotMoveKeyInfos.Builder toNextDb,
         HddsProtos.KeyValue.Builder renamedKey, OmKeyInfo keyInfo,
         Table<String, OmKeyInfo> previousKeyTable,
-        Table<String, String> renamedKeyTable,
+        Table<String, String> renamedTable,
         OmBucketInfo bucketInfo, long volumeId) throws IOException {
 
-      if (checkKeyReclaimable(previousKeyTable, renamedKeyTable,
+      if (checkKeyReclaimable(previousKeyTable, renamedTable,
           keyInfo, bucketInfo, volumeId, renamedKey)) {
         // Move to next non deleted snapshot's deleted table
         toNextDb.addKeyInfos(keyInfo.getProtobuf(
@@ -424,7 +428,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
     private void submitSnapshotMoveDeletedKeys(SnapshotInfo snapInfo,
         List<SnapshotMoveKeyInfos> toReclaimList,
         List<SnapshotMoveKeyInfos> toNextDBList,
-        List<HddsProtos.KeyValue> renamedKeysList,
+        List<HddsProtos.KeyValue> renamedList,
         List<String> dirsToMove) {
 
       SnapshotMoveDeletedKeysRequest.Builder moveDeletedKeysBuilder =
@@ -434,7 +438,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
       SnapshotMoveDeletedKeysRequest moveDeletedKeys = moveDeletedKeysBuilder
           .addAllReclaimKeys(toReclaimList)
           .addAllNextDBKeys(toNextDBList)
-          .addAllRenamedKeys(renamedKeysList)
+          .addAllRenamedKeys(renamedList)
           .addAllDeletedDirsToMove(dirsToMove)
           .build();
 
@@ -449,7 +453,9 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
 
     private boolean checkDirReclaimable(
         Table.KeyValue<String, OmKeyInfo> deletedDir,
-        Table<String, OmDirectoryInfo> previousDirTable) throws IOException {
+        Table<String, OmDirectoryInfo> previousDirTable,
+        Table<String, String> renamedTable,
+        List<HddsProtos.KeyValue> renamedList) throws IOException {
 
       if (previousDirTable == null) {
         return true;
@@ -457,10 +463,32 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
 
       String deletedDirDbKey = deletedDir.getKey();
       OmKeyInfo deletedDirInfo = deletedDir.getValue();
-      // In OMKeyDeleteResponseWithFSO OzonePathKey is converted to
-      // OzoneDeletePathKey. Changing it back to check the previous DirTable.
-      String prevDbKey = ozoneManager.getMetadataManager()
-          .getOzoneDeletePathDirKey(deletedDirDbKey);
+      String dbRenameKey = ozoneManager.getMetadataManager().getRenameKey(
+          deletedDirInfo.getVolumeName(), deletedDirInfo.getBucketName(),
+          deletedDirInfo.getObjectID());
+
+      /*
+      snapshotRenamedTable: /volumeName/bucketName/objectID ->
+          /volumeId/bucketId/parentId/dirName
+       */
+      String dbKeyBeforeRename = renamedTable.getIfExist(dbRenameKey);
+      String prevDbKey = null;
+
+      if (dbKeyBeforeRename != null) {
+        prevDbKey = dbKeyBeforeRename;
+        HddsProtos.KeyValue renamedDir = HddsProtos.KeyValue
+            .newBuilder()
+            .setKey(dbRenameKey)
+            .setValue(dbKeyBeforeRename)
+            .build();
+        renamedList.add(renamedDir);
+      } else {
+        // In OMKeyDeleteResponseWithFSO OzonePathKey is converted to
+        // OzoneDeletePathKey. Changing it back to check the previous DirTable.
+        prevDbKey = ozoneManager.getMetadataManager()
+            .getOzoneDeletePathDirKey(deletedDirDbKey);
+      }
+
       OmDirectoryInfo prevDirectoryInfo = previousDirTable.get(prevDbKey);
       if (prevDirectoryInfo == null) {
         return true;
@@ -471,7 +499,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
 
     private boolean checkKeyReclaimable(
         Table<String, OmKeyInfo> previousKeyTable,
-        Table<String, String> renamedKeyTable,
+        Table<String, String> renamedTable,
         OmKeyInfo deletedKeyInfo, OmBucketInfo bucketInfo,
         long volumeId, HddsProtos.KeyValue.Builder renamedKeyBuilder)
         throws IOException {
@@ -502,7 +530,7 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
       }
 
       /*
-       snapshotRenamedKeyTable:
+       snapshotRenamedTable:
        1) /volumeName/bucketName/objectID ->
                    /volumeId/bucketId/parentId/fileName (FSO)
        2) /volumeName/bucketName/objectID ->
@@ -512,10 +540,10 @@ public class SnapshotDeletingService extends 
AbstractKeyDeletingService {
           deletedKeyInfo.getVolumeName(), deletedKeyInfo.getBucketName(),
           deletedKeyInfo.getObjectID());
 
-      // Condition: key should not exist in snapshotRenamedKeyTable
+      // Condition: key should not exist in snapshotRenamedTable
       // of the current snapshot and keyTable of the previous snapshot.
-      // Check key exists in renamedKeyTable of the Snapshot
-      String renamedKey = renamedKeyTable.getIfExist(dbRenameKey);
+      // Check key exists in renamedTable of the Snapshot
+      String renamedKey = renamedTable.getIfExist(dbRenameKey);
 
       if (renamedKey != null) {
         renamedKeyBuilder.setKey(dbRenameKey).setValue(renamedKey);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java
index 2ef6965fd6..a67814156d 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/snapshot/TestOMSnapshotCreateRequest.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.utils.db.BatchOperation;
+import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.AuditMessage;
 
@@ -34,10 +35,12 @@ import org.apache.hadoop.ozone.om.OMMetrics;
 import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
 import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper;
 import org.apache.hadoop.ozone.om.response.key.OMKeyRenameResponse;
+import org.apache.hadoop.ozone.om.response.key.OMKeyRenameResponseWithFSO;
 import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager;
 import org.apache.ozone.test.LambdaTestUtils;
 import org.junit.After;
@@ -252,11 +255,14 @@ public class TestOMSnapshotCreateRequest {
   @Test
   public void testEmptySnapshotRenamedKeyTable() throws Exception {
     when(ozoneManager.isAdmin(any())).thenReturn(true);
+    Table<String, String> snapshotRenamedTable =
+        omMetadataManager.getSnapshotRenamedTable();
 
-    renameKey("key1", "key2");
+    renameKey("key1", "key2", 0);
+    renameDir("dir1", "dir2", 5);
     // Rename table should be empty as there is no rename happening in
     // the snapshot scope.
-    
Assert.assertTrue(omMetadataManager.getSnapshotRenamedKeyTable().isEmpty());
+    Assert.assertTrue(snapshotRenamedTable.isEmpty());
 
     // Create snapshot
     createSnapshot(snapshotName1);
@@ -266,15 +272,16 @@ public class TestOMSnapshotCreateRequest {
         omMetadataManager.getSnapshotInfoTable().get(snapKey);
     Assert.assertNotNull(snapshotInfo);
 
-    renameKey("key3", "key4");
-    // Rename table should have one entry as rename is within snapshot scope.
-    Assert.assertFalse(omMetadataManager.getSnapshotRenamedKeyTable()
-        .isEmpty());
+    renameKey("key3", "key4", 10);
+    renameDir("dir3", "dir4", 15);
 
-    // Create snapshot to clear snapshotRenamedKeyTable
-    createSnapshot(snapshotName2);
-    
Assert.assertTrue(omMetadataManager.getSnapshotRenamedKeyTable().isEmpty());
+    // Rename table should have two entries as rename is within snapshot scope.
+    Assert.assertEquals(2, omMetadataManager
+        .countRowsInTable(snapshotRenamedTable));
 
+    // Create snapshot to clear snapshotRenamedTable
+    createSnapshot(snapshotName2);
+    Assert.assertTrue(snapshotRenamedTable.isEmpty());
   }
 
   @Test
@@ -311,9 +318,10 @@ public class TestOMSnapshotCreateRequest {
         omResponse.getStatus());
   }
 
-  private void renameKey(String fromKey, String toKey) throws IOException {
-    OmKeyInfo toKeyInfo = addKey(fromKey);
-    OmKeyInfo fromKeyInfo = addKey(toKey);
+  private void renameKey(String fromKey, String toKey, long offset)
+      throws IOException {
+    OmKeyInfo toKeyInfo = addKey(toKey, offset + 1L);
+    OmKeyInfo fromKeyInfo = addKey(fromKey, offset + 2L);
 
     OMResponse omResponse = OMResponse
         .newBuilder()
@@ -326,11 +334,42 @@ public class TestOMSnapshotCreateRequest {
         new OMKeyRenameResponse(omResponse, fromKeyInfo.getKeyName(),
             toKeyInfo.getKeyName(), toKeyInfo);
 
-    
Assert.assertTrue(omMetadataManager.getSnapshotRenamedKeyTable().isEmpty());
     omKeyRenameResponse.addToDBBatch(omMetadataManager, batchOperation);
     omMetadataManager.getStore().commitBatchOperation(batchOperation);
   }
 
+  private void renameDir(String fromKey, String toKey, long offset)
+      throws Exception {
+    String fromKeyParentName = UUID.randomUUID().toString();
+    OmKeyInfo fromKeyParent = OMRequestTestUtils.createOmKeyInfo(volumeName,
+        bucketName, fromKeyParentName, HddsProtos.ReplicationType.RATIS,
+        HddsProtos.ReplicationFactor.THREE, 100L);
+
+    OmKeyInfo toKeyInfo = addKey(toKey, offset + 4L);
+    OmKeyInfo fromKeyInfo = addKey(fromKey, offset + 5L);
+    OMResponse omResponse = OMResponse
+        .newBuilder()
+        .setRenameKeyResponse(
+            OzoneManagerProtocolProtos.RenameKeyResponse.getDefaultInstance())
+        .setStatus(OzoneManagerProtocolProtos.Status.OK)
+        .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey)
+        .build();
+
+    OMKeyRenameResponseWithFSO omKeyRenameResponse =
+        new OMKeyRenameResponseWithFSO(omResponse, getDBKeyName(fromKeyInfo),
+            getDBKeyName(toKeyInfo), fromKeyParent, null, toKeyInfo,
+            null, true, BucketLayout.FILE_SYSTEM_OPTIMIZED);
+    omKeyRenameResponse.addToDBBatch(omMetadataManager, batchOperation);
+    omMetadataManager.getStore().commitBatchOperation(batchOperation);
+  }
+
+  protected String getDBKeyName(OmKeyInfo keyInfo) throws IOException {
+    return omMetadataManager.getOzonePathKey(
+        omMetadataManager.getVolumeId(volumeName),
+        omMetadataManager.getBucketId(volumeName, bucketName),
+        keyInfo.getParentObjectID(), keyInfo.getKeyName());
+  }
+
   private void createSnapshot(String snapName) throws Exception {
     OMRequest omRequest =
         OMRequestTestUtils.createSnapshotRequest(
@@ -362,9 +401,10 @@ public class TestOMSnapshotCreateRequest {
     return new OMSnapshotCreateRequest(modifiedRequest);
   }
 
-  private OmKeyInfo addKey(String keyName) {
+  private OmKeyInfo addKey(String keyName, long objectId) {
     return OMRequestTestUtils.createOmKeyInfo(volumeName, bucketName, keyName,
-        HddsProtos.ReplicationType.RATIS, HddsProtos.ReplicationFactor.ONE, 
0L);
+        HddsProtos.ReplicationType.RATIS, HddsProtos.ReplicationFactor.ONE,
+        objectId);
   }
 
   protected String addKeyToTable(OmKeyInfo keyInfo) throws Exception {
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponse.java
index 5fab714b22..fd8839d8c9 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponse.java
@@ -63,7 +63,7 @@ public class TestOMKeyRenameResponse extends 
TestOMKeyResponse {
         .isExist(dbFromKey));
     Assert.assertFalse(omMetadataManager.getKeyTable(getBucketLayout())
         .isExist(dbToKey));
-    
Assert.assertTrue(omMetadataManager.getSnapshotRenamedKeyTable().isEmpty());
+    Assert.assertTrue(omMetadataManager.getSnapshotRenamedTable().isEmpty());
     if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {
       Assert.assertFalse(omMetadataManager.getDirectoryTable()
           .isExist(getDBKeyName(fromKeyParent)));
@@ -86,9 +86,9 @@ public class TestOMKeyRenameResponse extends 
TestOMKeyResponse {
     String renameDbKey = omMetadataManager.getRenameKey(
         fromKeyInfo.getVolumeName(), fromKeyInfo.getBucketName(),
         fromKeyInfo.getObjectID());
-    // snapshotRenamedKeyTable shouldn't contain those keys which
+    // snapshotRenamedTable shouldn't contain those keys which
     // is not part of snapshot bucket.
-    Assert.assertFalse(omMetadataManager.getSnapshotRenamedKeyTable()
+    Assert.assertFalse(omMetadataManager.getSnapshotRenamedTable()
         .isExist(renameDbKey));
 
     if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {


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


Reply via email to