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

ritesh 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 9882cf7390 HDDS-7382. FSO bucket `rename` supports change modification 
time of parent dir (#3953)
9882cf7390 is described below

commit 9882cf7390ed6fbb1f1b8caf9c3a150c31b8f4e9
Author: XiChen <[email protected]>
AuthorDate: Mon Feb 6 13:34:53 2023 +0800

    HDDS-7382. FSO bucket `rename` supports change modification time of parent 
dir (#3953)
---
 .../fs/ozone/TestOzoneFileSystemWithFSO.java       | 103 ++++++++++++
 .../ozone/om/request/file/OMFileRequest.java       |  26 ++-
 .../om/request/key/OMKeyRenameRequestWithFSO.java  |  88 +++++++---
 .../response/key/OMKeyRenameResponseWithFSO.java   |  45 ++++-
 .../om/request/key/TestOMKeyRenameRequest.java     | 121 +++++++++-----
 .../request/key/TestOMKeyRenameRequestWithFSO.java | 100 ++++++++++-
 .../om/response/key/TestOMKeyRenameResponse.java   | 186 +++++++++++----------
 .../key/TestOMKeyRenameResponseWithFSO.java        |  94 +++++++++++
 8 files changed, 587 insertions(+), 176 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileSystemWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileSystemWithFSO.java
index 83fa1e76a6..8ed595187b 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileSystemWithFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileSystemWithFSO.java
@@ -49,6 +49,7 @@ import java.util.Collection;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
@@ -348,6 +349,108 @@ public class TestOzoneFileSystemWithFSO extends 
TestOzoneFileSystem {
     Assert.assertFalse(getFs().rename(dir2SourcePath, newDestinPath));
   }
 
+  @Test
+  public void testRenameParentDirModificationTime() throws IOException {
+    Path dir1 = new Path(getFs().getUri().toString(), "/dir1");
+    Path file1 = new Path(dir1, "file1");
+    Path dir2 = new Path(getFs().getUri().toString(), "/dir2");
+    // mv "/dir1/file1" to "/dir2/file1"
+    Path renamedFile1 = new Path(dir2, "file1");
+    getFs().mkdirs(dir1);
+    getFs().create(file1, false).close();
+    getFs().mkdirs(dir2);
+
+    long dir1BeforeMTime = getFs().getFileStatus(dir1).getModificationTime();
+    long dir2BeforeMTime = getFs().getFileStatus(dir2).getModificationTime();
+    long file1BeforeMTime = getFs().getFileStatus(file1).getModificationTime();
+    getFs().rename(file1, renamedFile1);
+    long dir1AfterMTime = getFs().getFileStatus(dir1).getModificationTime();
+    long dir2AfterMTime = getFs().getFileStatus(dir2).getModificationTime();
+    long file1AfterMTime = getFs().getFileStatus(renamedFile1)
+        .getModificationTime();
+    // rename should change the parent directory of source and object files
+    // modification time but not change modification time of the renamed file
+    assertTrue(dir1BeforeMTime < dir1AfterMTime);
+    assertTrue(dir2BeforeMTime < dir2AfterMTime);
+    assertEquals(file1BeforeMTime, file1AfterMTime);
+
+    // mv "/dir1/subdir1/" to "/dir2/subdir1/"
+    Path subdir1 = new Path(dir1, "subdir1");
+    Path renamedSubdir1 = new Path(dir2, "subdir1");
+    getFs().mkdirs(subdir1);
+
+    dir1BeforeMTime = getFs().getFileStatus(dir1).getModificationTime();
+    dir2BeforeMTime = getFs().getFileStatus(dir2).getModificationTime();
+    long subdir1BeforeMTime = getFs().getFileStatus(subdir1)
+        .getModificationTime();
+    getFs().rename(subdir1, renamedSubdir1);
+    dir1AfterMTime = getFs().getFileStatus(dir1).getModificationTime();
+    dir2AfterMTime = getFs().getFileStatus(dir2).getModificationTime();
+    long subdir1AfterMTime = getFs().getFileStatus(renamedSubdir1)
+        .getModificationTime();
+    assertTrue(dir1BeforeMTime < dir1AfterMTime);
+    assertTrue(dir2BeforeMTime < dir2AfterMTime);
+    assertEquals(subdir1BeforeMTime, subdir1AfterMTime);
+  }
+
+  @Test
+  public void testRenameParentBucketModificationTime() throws IOException {
+    OMMetadataManager omMgr =
+        getCluster().getOzoneManager().getMetadataManager();
+
+    // mv /file1 -> /renamedFile1, the bucket mtime should be changed
+    Path file1 = new Path("/file1");
+    Path renamedFile1 = new Path("/renamedFile1");
+    getFs().create(file1, false).close();
+    renameAndAssert(omMgr, file1, renamedFile1, true);
+
+    // mv /dir1/subFile2 -> /dir2/renamedSubFile2,
+    // the bucket mtime should not be changed
+    Path dir1 = new Path(getFs().getUri().toString(), "/dir1");
+    Path subFile2 = new Path(dir1, "subFile2");
+    Path dir2 = new Path(getFs().getUri().toString(), "/dir2");
+    Path renamedSubFile2 = new Path(dir2, "renamedSubFile2");
+    getFs().mkdirs(dir1);
+    getFs().mkdirs(dir2);
+    getFs().create(subFile2, false).close();
+    renameAndAssert(omMgr, subFile2, renamedSubFile2, false);
+
+    // mv /dir3/subFile3 -> "/renamedFile3"  the bucket mtime should be changed
+    Path dir3 = new Path(getFs().getUri().toString(), "/dir3");
+    Path subFile3 = new Path(dir3, "subFile3");
+    Path renamedFile3 = new Path("/renamedFile3");
+    getFs().mkdirs(dir3);
+    getFs().create(subFile3, false).close();
+    renameAndAssert(omMgr, subFile3, renamedFile3, true);
+
+    // mv /file4 -> "/dir4/renamedFile4"  the bucket mtime should be changed
+    Path file4 = new Path("/file4");
+    Path dir4 = new Path(getFs().getUri().toString(), "/dir4");
+    Path renamedSubFile4 = new Path(dir4, "subFile3");
+    getFs().mkdirs(dir4);
+    getFs().create(file4, false).close();
+    renameAndAssert(omMgr, file4, renamedSubFile4, true);
+  }
+
+  private void renameAndAssert(OMMetadataManager omMgr,
+      Path from, Path to, boolean exceptChangeMtime) throws IOException {
+    OmBucketInfo omBucketInfo = omMgr.getBucketTable()
+        .get(omMgr.getBucketKey(getVolumeName(), getBucketName()));
+    long bucketBeforeMTime = omBucketInfo.getModificationTime();
+    long fileBeforeMTime = getFs().getFileStatus(from).getModificationTime();
+    getFs().rename(from, to);
+    omBucketInfo = omMgr.getBucketTable()
+        .get(omMgr.getBucketKey(getVolumeName(), getBucketName()));
+    long bucketAfterMTime = omBucketInfo.getModificationTime();
+    long fileAfterMTime = getFs().getFileStatus(to).getModificationTime();
+    if (exceptChangeMtime) {
+      assertTrue(bucketBeforeMTime < bucketAfterMTime);
+    } else {
+      assertEquals(bucketBeforeMTime, bucketAfterMTime);
+    }
+    assertEquals(fileBeforeMTime, fileAfterMTime);
+  }
+
   @Override
   @Test
   @Ignore("TODO:HDDS-2939")
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileRequest.java
index f7b36f5246..4a273d367c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileRequest.java
@@ -804,7 +804,7 @@ public final class OMFileRequest {
 
   /**
    * Verify parent exists for the destination path and return destination
-   * path parent Id.
+   * path parent.
    * <p>
    * Check whether dst parent dir exists or not. If the parent exists, then the
    * source can be renamed to dst path.
@@ -812,39 +812,33 @@ public final class OMFileRequest {
    * @param volumeName  volume name
    * @param bucketName  bucket name
    * @param toKeyName   destination path
-   * @param fromKeyName source path
    * @param metaMgr     metadata manager
-   * @throws IOException if the destination parent dir doesn't exists.
+   * @return omDirectoryInfo object of destination path's parent
+   * or null if parent is bucket
+   * @throws IOException if the destination parent is not a directory.
    */
-  public static long getToKeyNameParentId(String volumeName,
-      String bucketName, String toKeyName, String fromKeyName,
-      OMMetadataManager metaMgr) throws IOException {
-
+  public static OmKeyInfo getKeyParentDir(String volumeName, String bucketName,
+      String toKeyName, OMMetadataManager metaMgr) throws IOException {
     int totalDirsCount = OzoneFSUtils.getFileCount(toKeyName);
     // skip parent is root '/'
     if (totalDirsCount <= 1) {
-      String bucketKey = metaMgr.getBucketKey(volumeName, bucketName);
-      OmBucketInfo omBucketInfo =
-              metaMgr.getBucketTable().get(bucketKey);
-      return omBucketInfo.getObjectID();
+      return null;
     }
-
     String toKeyParentDir = OzoneFSUtils.getParentDir(toKeyName);
-
     OzoneFileStatus toKeyParentDirStatus = getOMKeyInfoIfExists(metaMgr,
             volumeName, bucketName, toKeyParentDir, 0);
     // check if the immediate parent exists
     if (toKeyParentDirStatus == null) {
       throw new OMException(String.format(
-              "Failed to rename %s to %s, %s doesn't exist", fromKeyName,
+              "Failed to get parent dir %s, %s doesn't exist",
               toKeyName, toKeyParentDir),
               OMException.ResultCodes.KEY_RENAME_ERROR);
     } else if (toKeyParentDirStatus.isFile()) {
       throw new OMException(String.format(
-              "Failed to rename %s to %s, %s is a file", fromKeyName, 
toKeyName,
+              "Failed to get parent dir %s, %s is a file", toKeyName,
               toKeyParentDir), OMException.ResultCodes.KEY_RENAME_ERROR);
     }
-    return toKeyParentDirStatus.getKeyInfo().getObjectID();
+    return toKeyParentDirStatus.getKeyInfo();
   }
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java
index b83a2d4e2f..d9f12aa2b0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OMMetrics;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -182,9 +183,9 @@ public class OMKeyRenameRequestWithFSO extends 
OMKeyRenameRequest {
                     OMException.ResultCodes.KEY_ALREADY_EXISTS);
           }
 
-          omClientResponse = renameKey(toKeyValue.getObjectID(), trxnLogIndex,
-                  fromKeyValue, isRenameDirectory, newToKeyName,
-                  keyArgs.getModificationTime(), omResponse, ozoneManager);
+          omClientResponse = renameKey(toKeyValue, newToKeyName, fromKeyValue,
+              fromKeyName, isRenameDirectory, keyArgs.getModificationTime(),
+              ozoneManager, omResponse, trxnLogIndex);
           result = Result.SUCCESS;
         } else {
           // case-6) If destination is a file type and if exists then throws
@@ -197,12 +198,12 @@ public class OMKeyRenameRequestWithFSO extends 
OMKeyRenameRequest {
         // case-7) Check whether dst parent dir exists or not. If parent
         // doesn't exist then throw exception, otw the source can be renamed to
         // destination path.
-        long toKeyParentId = OMFileRequest.getToKeyNameParentId(volumeName,
-                bucketName, toKeyName, fromKeyName, omMetadataManager);
+        OmKeyInfo toKeyParent = OMFileRequest.getKeyParentDir(volumeName,
+                bucketName, toKeyName, omMetadataManager);
 
-        omClientResponse = renameKey(toKeyParentId, trxnLogIndex,
-                fromKeyValue, isRenameDirectory, toKeyName,
-                keyArgs.getModificationTime(), omResponse, ozoneManager);
+        omClientResponse = renameKey(toKeyParent, toKeyName, fromKeyValue,
+            fromKeyName, isRenameDirectory, keyArgs.getModificationTime(),
+            ozoneManager, omResponse, trxnLogIndex);
 
         result = Result.SUCCESS;
       }
@@ -243,27 +244,46 @@ public class OMKeyRenameRequestWithFSO extends 
OMKeyRenameRequest {
   }
 
   @SuppressWarnings("parameternumber")
-  private OMClientResponse renameKey(long toKeyParentId,
-      long trxnLogIndex, OmKeyInfo fromKeyValue, boolean isRenameDirectory,
-      String toKeyName, long modificationTime, OMResponse.Builder omResponse,
-      OzoneManager ozoneManager) throws IOException {
-
+  private OMClientResponse renameKey(OmKeyInfo toKeyParent, String toKeyName,
+      OmKeyInfo fromKeyValue, String fromKeyName, boolean isRenameDirectory,
+      long modificationTime, OzoneManager ozoneManager,
+      OMResponse.Builder omResponse, long trxnLogIndex) throws IOException {
     final OMMetadataManager ommm = ozoneManager.getMetadataManager();
     final long volumeId = ommm.getVolumeId(fromKeyValue.getVolumeName());
     final long bucketId = ommm.getBucketId(fromKeyValue.getVolumeName(),
             fromKeyValue.getBucketName());
+    OmBucketInfo omBucketInfo = null;
     final String dbFromKey = ommm.getOzonePathKey(volumeId, bucketId,
             fromKeyValue.getParentObjectID(), fromKeyValue.getFileName());
     String toKeyFileName = OzoneFSUtils.getFileName(toKeyName);
+    OmKeyInfo fromKeyParent = null;
+    OMMetadataManager metadataMgr = ozoneManager.getMetadataManager();
+    Table<String, OmDirectoryInfo> dirTable = metadataMgr.getDirectoryTable();
+    String bucketKey = metadataMgr.getBucketKey(
+        fromKeyValue.getVolumeName(), fromKeyValue.getBucketName());
 
     fromKeyValue.setUpdateID(trxnLogIndex, ozoneManager.isRatisEnabled());
     // Set toFileName
     fromKeyValue.setKeyName(toKeyFileName);
     fromKeyValue.setFileName(toKeyFileName);
     // Set toKeyObjectId
-    fromKeyValue.setParentObjectID(toKeyParentId);
-    //Set modification time
-    fromKeyValue.setModificationTime(modificationTime);
+    if (toKeyParent != null) {
+      fromKeyValue.setParentObjectID(toKeyParent.getObjectID());
+    } else {
+      omBucketInfo = metadataMgr.getBucketTable().get(bucketKey);
+      fromKeyValue.setParentObjectID(omBucketInfo.getObjectID());
+    }
+    // Set modification time
+    setModificationTime(ommm, omBucketInfo, toKeyParent, volumeId, bucketId,
+        modificationTime, dirTable, trxnLogIndex);
+    fromKeyParent = OMFileRequest.getKeyParentDir(fromKeyValue.getVolumeName(),
+        fromKeyValue.getBucketName(), fromKeyName, metadataMgr);
+    if (fromKeyParent == null && omBucketInfo == null) {
+      // Get omBucketInfo only when needed to reduce unnecessary DB IO
+      omBucketInfo = metadataMgr.getBucketTable().get(bucketKey);
+    }
+    setModificationTime(ommm, omBucketInfo, fromKeyParent, volumeId,
+        bucketId, modificationTime, dirTable, trxnLogIndex);
 
     // destination dbKeyName
     String dbToKey = ommm.getOzonePathKey(volumeId, bucketId,
@@ -273,9 +293,7 @@ public class OMKeyRenameRequestWithFSO extends 
OMKeyRenameRequest {
     // dbFromKey should be deleted, dbToKey should be added with newly updated
     // omKeyInfo.
     // Add from_key and to_key details into cache.
-    OMMetadataManager metadataMgr = ozoneManager.getMetadataManager();
     if (isRenameDirectory) {
-      Table<String, OmDirectoryInfo> dirTable = 
metadataMgr.getDirectoryTable();
       dirTable.addCacheEntry(new CacheKey<>(dbFromKey),
               new CacheValue<>(Optional.absent(), trxnLogIndex));
 
@@ -295,10 +313,40 @@ public class OMKeyRenameRequestWithFSO extends 
OMKeyRenameRequest {
 
     OMClientResponse omClientResponse = new OMKeyRenameResponseWithFSO(
         
omResponse.setRenameKeyResponse(RenameKeyResponse.newBuilder()).build(),
-        dbFromKey, dbToKey, fromKeyValue, isRenameDirectory,
-        getBucketLayout());
+        dbFromKey, dbToKey, fromKeyParent, toKeyParent, fromKeyValue,
+        omBucketInfo, isRenameDirectory, getBucketLayout());
     return omClientResponse;
   }
+  @SuppressWarnings("checkstyle:ParameterNumber")
+  private void setModificationTime(OMMetadataManager omMetadataManager,
+      OmBucketInfo bucketInfo, OmKeyInfo keyParent,
+      long volumeId, long bucketId, long modificationTime,
+      Table<String, OmDirectoryInfo> dirTable, long trxnLogIndex)
+      throws OMException {
+    // For Filesystem. rename will change renamed file parent directory
+    // modification time but not change its modification time.
+    if (keyParent != null) {
+      keyParent.setModificationTime(modificationTime);
+      String dbToKeyParent = omMetadataManager.getOzonePathKey(volumeId,
+          bucketId, keyParent.getParentObjectID(), keyParent.getFileName());
+      dirTable.addCacheEntry(new CacheKey<>(dbToKeyParent),
+          new CacheValue<>(Optional.of(OMFileRequest
+              .getDirectoryInfo(keyParent)), trxnLogIndex));
+    } else {
+      // For FSO a bucket is root of the filesystem, so rename an
+      // object at the root of a bucket need change bucket's modificationTime
+      if (bucketInfo == null) {
+        throw new OMException("Bucket not found",
+            OMException.ResultCodes.BUCKET_NOT_FOUND);
+      }
+      bucketInfo.setModificationTime(modificationTime);
+      String bucketKey = omMetadataManager.getBucketKey(
+          bucketInfo.getVolumeName(), bucketInfo.getBucketName());
+      omMetadataManager.getBucketTable().addCacheEntry(
+          new CacheKey<>(bucketKey),
+          new CacheValue<>(Optional.of(bucketInfo), trxnLogIndex));
+    }
+  }
 
   private Map<String, String> buildAuditMap(
           KeyArgs keyArgs, RenameKeyRequest renameKeyRequest) {
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 4085008c37..4b5f6d1fdb 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
@@ -21,6 +21,7 @@ package org.apache.hadoop.ozone.om.response.key;
 import org.apache.hadoop.hdds.utils.db.BatchOperation;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
@@ -40,12 +41,21 @@ import static 
org.apache.hadoop.ozone.om.OmMetadataManagerImpl.FILE_TABLE;
 public class OMKeyRenameResponseWithFSO extends OMKeyRenameResponse {
 
   private boolean isRenameDirectory;
+  private OmKeyInfo fromKeyParent;
+  private OmKeyInfo toKeyParent;
+  private OmBucketInfo bucketInfo;
 
+  @SuppressWarnings("checkstyle:ParameterNumber")
   public OMKeyRenameResponseWithFSO(@Nonnull OMResponse omResponse,
-      String fromKeyName, String toKeyName, @Nonnull OmKeyInfo renameKeyInfo,
+      String fromDBKey, String toDBKey, OmKeyInfo fromKeyParent,
+      OmKeyInfo toKeyParent, @Nonnull OmKeyInfo renameKeyInfo,
+      OmBucketInfo bucketInfo,
       boolean isRenameDirectory, BucketLayout bucketLayout) {
-    super(omResponse, fromKeyName, toKeyName, renameKeyInfo, bucketLayout);
+    super(omResponse, fromDBKey, toDBKey, renameKeyInfo, bucketLayout);
     this.isRenameDirectory = isRenameDirectory;
+    this.fromKeyParent = fromKeyParent;
+    this.toKeyParent = toKeyParent;
+    this.bucketInfo = bucketInfo;
   }
 
   /**
@@ -60,7 +70,10 @@ public class OMKeyRenameResponseWithFSO extends 
OMKeyRenameResponse {
   @Override
   public void addToDBBatch(OMMetadataManager omMetadataManager,
                            BatchOperation batchOperation) throws IOException {
-
+    long volumeId = omMetadataManager.getVolumeId(
+        getRenameKeyInfo().getVolumeName());
+    long bucketId = omMetadataManager.getBucketId(
+        getRenameKeyInfo().getVolumeName(), 
getRenameKeyInfo().getBucketName());
     if (isRenameDirectory) {
       omMetadataManager.getDirectoryTable().deleteWithBatch(batchOperation,
               getFromKeyName());
@@ -76,10 +89,36 @@ public class OMKeyRenameResponseWithFSO extends 
OMKeyRenameResponse {
       omMetadataManager.getKeyTable(getBucketLayout())
           .putWithBatch(batchOperation, getToKeyName(), getRenameKeyInfo());
     }
+    if (fromKeyParent != null) {
+      addDirToDBBatch(omMetadataManager, fromKeyParent,
+          volumeId, bucketId, batchOperation);
+    }
+    if (toKeyParent != null) {
+      addDirToDBBatch(omMetadataManager, toKeyParent,
+          volumeId, bucketId, batchOperation);
+    }
+    if (bucketInfo != null) {
+      String dbBucketKey =
+          omMetadataManager.getBucketKey(bucketInfo.getVolumeName(),
+              bucketInfo.getBucketName());
+      omMetadataManager.getBucketTable().putWithBatch(batchOperation,
+          dbBucketKey, bucketInfo);
+    }
   }
 
   @Override
   public BucketLayout getBucketLayout() {
     return BucketLayout.FILE_SYSTEM_OPTIMIZED;
   }
+
+  private void addDirToDBBatch(OMMetadataManager metadataManager,
+      OmKeyInfo keyInfo, long volumeId, long bucketId, BatchOperation batch)
+      throws IOException {
+    String dbKey = metadataManager.getOzonePathKey(volumeId, bucketId,
+        keyInfo.getParentObjectID(), keyInfo.getFileName());
+    OmDirectoryInfo keyDirInfo =
+        OMFileRequest.getDirectoryInfo(keyInfo);
+    metadataManager.getDirectoryTable().putWithBatch(batch,
+        dbKey, keyDirInfo);
+  }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequest.java
index bb0bf8de9f..6f5717baea 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequest.java
@@ -18,10 +18,13 @@
 
 package org.apache.hadoop.ozone.om.request.key;
 
+import java.io.IOException;
 import java.util.UUID;
 
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
+import org.apache.hadoop.fs.Path;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
@@ -37,26 +40,37 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
 /**
  * Tests RenameKey request.
  */
+@SuppressWarnings("checkstyle:VisibilityModifier")
 public class TestOMKeyRenameRequest extends TestOMKeyRequest {
+  protected OmKeyInfo fromKeyInfo;
+  protected String fromKeyName;
+  protected String toKeyName;
+  protected String dbToKey;
+
+  @Before
+  public void createParentKey() throws Exception {
+    OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
+        omMetadataManager, getBucketLayout());
+    fromKeyName = new Path("fromKey").toString();
+    toKeyName = new Path("toKey").toString();
+    fromKeyInfo = getOmKeyInfo(fromKeyName);
+    dbToKey = omMetadataManager.getOzoneKey(volumeName, bucketName, toKeyName);
+  }
 
   @Test
   public void testPreExecute() throws Exception {
-    doPreExecute(createRenameKeyRequest(UUID.randomUUID().toString()));
+    doPreExecute(createRenameKeyRequest(
+        volumeName, bucketName, fromKeyName, toKeyName));
   }
 
   @Test
   public void testValidateAndUpdateCache() throws Exception {
-    String toKeyName = UUID.randomUUID().toString();
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
-
-    OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
-        omMetadataManager);
-    OMRequestTestUtils.addKeyToTable(false, volumeName, bucketName, keyName,
-        clientID, replicationType, replicationFactor, omMetadataManager);
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+            volumeName, bucketName, fromKeyName, toKeyName));
+    String dbFromKey = addKeyToTable(fromKeyInfo);
 
     OMKeyRenameRequest omKeyRenameRequest =
-        new OMKeyRenameRequest(modifiedOmRequest, getBucketLayout());
+            getOMKeyRenameRequest(modifiedOmRequest);
 
     OMClientResponse omKeyRenameResponse =
         omKeyRenameRequest.validateAndUpdateCache(ozoneManager, 100L,
@@ -65,34 +79,24 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
     Assert.assertEquals(OzoneManagerProtocolProtos.Status.OK,
         omKeyRenameResponse.getOMResponse().getStatus());
 
-    String key = omMetadataManager.getOzoneKey(volumeName, bucketName, 
keyName);
     // Original key should be deleted, toKey should exist.
-    OmKeyInfo omKeyInfo =
-        omMetadataManager.getKeyTable(getBucketLayout()).get(key);
-
-    Assert.assertNull(omKeyInfo);
+    Assert.assertNull(omMetadataManager.getKeyTable(getBucketLayout())
+        .get(dbFromKey));
 
-    omKeyInfo = omMetadataManager.getKeyTable(getBucketLayout())
-        .get(omMetadataManager.getOzoneKey(volumeName, bucketName, toKeyName));
+    OmKeyInfo toKeyInfo =
+            omMetadataManager.getKeyTable(getBucketLayout()).get(dbToKey);
 
-    Assert.assertNotNull(omKeyInfo);
-
-    // For new key modification time should be updated.
+    Assert.assertNotNull(toKeyInfo);
 
     KeyArgs keyArgs = modifiedOmRequest.getRenameKeyRequest().getKeyArgs();
 
-    Assert.assertEquals(keyArgs.getModificationTime(),
-        omKeyInfo.getModificationTime());
-
-    // KeyName should be updated in OmKeyInfo to toKeyName.
-    Assert.assertEquals(omKeyInfo.getKeyName(), toKeyName);
+    assertModificationTime(keyArgs.getModificationTime());
   }
 
   @Test
   public void testValidateAndUpdateCacheWithKeyNotFound() throws Exception {
-    String toKeyName = UUID.randomUUID().toString();
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+        volumeName, bucketName, fromKeyName, toKeyName));
 
     // Add only volume and bucket entry to DB.
 
@@ -114,9 +118,8 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testValidateAndUpdateCacheWithVolumeNotFound() throws Exception {
-    String toKeyName = UUID.randomUUID().toString();
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+        "not_exist_volume", "not_exist_bucket", fromKeyName, toKeyName));
 
     OMKeyRenameRequest omKeyRenameRequest =
         new OMKeyRenameRequest(modifiedOmRequest, getBucketLayout());
@@ -131,9 +134,8 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testValidateAndUpdateCacheWithBucketNotFound() throws Exception {
-    String toKeyName = UUID.randomUUID().toString();
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+        volumeName, "not_exist_bucket", fromKeyName, toKeyName));
 
     // Add only volume entry to DB.
     OMRequestTestUtils.addVolumeToDB(volumeName, omMetadataManager);
@@ -151,9 +153,9 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testValidateAndUpdateCacheWithToKeyInvalid() throws Exception {
-    String toKeyName = "";
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
+    String invalidToKeyName = "";
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+        volumeName, bucketName, fromKeyName, invalidToKeyName));
 
     // Add only volume and bucket entry to DB.
 
@@ -175,10 +177,9 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testValidateAndUpdateCacheWithFromKeyInvalid() throws Exception {
-    String toKeyName = UUID.randomUUID().toString();
-    keyName = "";
-    OMRequest modifiedOmRequest =
-        doPreExecute(createRenameKeyRequest(toKeyName));
+    String invalidToKeyName = "";
+    OMRequest modifiedOmRequest = doPreExecute(createRenameKeyRequest(
+        volumeName, bucketName, invalidToKeyName, toKeyName));
 
     // Add only volume and bucket entry to DB.
 
@@ -207,7 +208,7 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
 
   private OMRequest doPreExecute(OMRequest originalOmRequest) throws Exception 
{
     OMKeyRenameRequest omKeyRenameRequest =
-        new OMKeyRenameRequest(originalOmRequest, getBucketLayout());
+            getOMKeyRenameRequest(originalOmRequest);
 
     OMRequest modifiedOmRequest = omKeyRenameRequest.preExecute(ozoneManager);
 
@@ -225,12 +226,13 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
    * Create OMRequest which encapsulates RenameKeyRequest.
    * @return OMRequest
    */
-  private OMRequest createRenameKeyRequest(String toKeyName) {
-    KeyArgs keyArgs = KeyArgs.newBuilder().setKeyName(keyName)
-        .setVolumeName(volumeName).setBucketName(bucketName).build();
+  protected OMRequest createRenameKeyRequest(
+      String volume, String bucket, String fromKey, String toKey) {
+    KeyArgs keyArgs = KeyArgs.newBuilder().setKeyName(fromKey)
+        .setVolumeName(volume).setBucketName(bucket).build();
 
     RenameKeyRequest renameKeyRequest = RenameKeyRequest.newBuilder()
-            .setKeyArgs(keyArgs).setToKeyName(toKeyName).build();
+            .setKeyArgs(keyArgs).setToKeyName(toKey).build();
 
     return OMRequest.newBuilder()
         .setClientId(UUID.randomUUID().toString())
@@ -238,4 +240,31 @@ public class TestOMKeyRenameRequest extends 
TestOMKeyRequest {
         .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey).build();
   }
 
+  protected OmKeyInfo getOmKeyInfo(String keyName) {
+    return OMRequestTestUtils.createOmKeyInfo(volumeName, bucketName, keyName,
+        replicationType, replicationFactor, 0L);
+  }
+
+  protected String addKeyToTable(OmKeyInfo keyInfo) throws Exception {
+    OMRequestTestUtils.addKeyToTable(false, false, keyInfo, clientID, 0L,
+        omMetadataManager);
+    return getDBKeyName(keyInfo);
+  }
+
+  protected OMKeyRenameRequest getOMKeyRenameRequest(OMRequest omRequest) {
+    return new OMKeyRenameRequest(omRequest, getBucketLayout());
+  }
+
+  protected String getDBKeyName(OmKeyInfo keyName) throws IOException {
+    return omMetadataManager.getOzoneKey(keyName.getVolumeName(),
+        keyName.getBucketName(), keyName.getKeyName());
+  }
+
+  protected void assertModificationTime(long except)
+      throws IOException {
+    // For new key modification time should be updated.
+    OmKeyInfo toKeyInfo =
+        omMetadataManager.getKeyTable(getBucketLayout()).get(dbToKey);
+    Assert.assertEquals(except, toKeyInfo.getModificationTime());
+  }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
index dd527ca23f..d6d2f3388f 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
@@ -18,22 +18,78 @@
 
 package org.apache.hadoop.ozone.om.request.key;
 
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
+import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RenameKeyRequest;
+import org.apache.hadoop.util.Time;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
+import java.io.IOException;
 import java.util.UUID;
 
 /**
  * Tests RenameKeyWithFSO request.
  */
-public class TestOMKeyRenameRequestWithFSO extends TestOMKeyRequest {
+public class TestOMKeyRenameRequestWithFSO extends TestOMKeyRenameRequest {
+  private OmKeyInfo fromKeyParentInfo;
+  private OmKeyInfo toKeyParentInfo;
+  @Override
+  @Before
+  public void createParentKey() throws Exception {
+    OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
+        omMetadataManager, getBucketLayout());
+    long volumeId = omMetadataManager.getVolumeId(volumeName);
+    long bucketId = omMetadataManager.getBucketId(volumeName,
+        bucketName);
+    String fromKeyParentName = UUID.randomUUID().toString();
+    String toKeyParentName = UUID.randomUUID().toString();
+    fromKeyName = new Path(fromKeyParentName, "fromKey").toString();
+    toKeyName = new Path(toKeyParentName, "toKey").toString();
+    fromKeyParentInfo = getOmKeyInfo(fromKeyParentName);
+    fromKeyParentInfo.setParentObjectID(bucketId);
+    toKeyParentInfo = getOmKeyInfo(toKeyParentName);
+    toKeyParentInfo.setParentObjectID(bucketId);
+    fromKeyInfo = getOmKeyInfo(fromKeyName);
+    fromKeyInfo.setParentObjectID(fromKeyParentInfo.getObjectID());
+    OMRequestTestUtils.addDirKeyToDirTable(false,
+        OMFileRequest.getDirectoryInfo(fromKeyParentInfo), volumeName,
+        bucketName, txnLogId, omMetadataManager);
+    OMRequestTestUtils.addDirKeyToDirTable(false,
+        OMFileRequest.getDirectoryInfo(toKeyParentInfo), volumeName,
+        bucketName, txnLogId, omMetadataManager);
+    dbToKey = omMetadataManager.getOzonePathKey(volumeId, bucketId,
+        toKeyParentInfo.getObjectID(), "toKey");
+  }
+
+  @Override
+  @Test
+  public void testValidateAndUpdateCacheWithToKeyInvalid() throws Exception {
+    String invalidToKeyName = "";
+    Assert.assertThrows(
+        OMException.class, () -> doPreExecute(createRenameKeyRequest(
+            volumeName, bucketName, fromKeyName, invalidToKeyName)));  }
+
+  @Override
+  @Test
+  public void testValidateAndUpdateCacheWithFromKeyInvalid() throws Exception {
+    String invalidFromKeyName = "";
+    Assert.assertThrows(
+        OMException.class, () -> doPreExecute(createRenameKeyRequest(
+            volumeName, bucketName, invalidFromKeyName, toKeyName)));
+  }
 
   @Test
   public void testPreExecuteWithUnNormalizedPath() throws Exception {
@@ -92,6 +148,48 @@ public class TestOMKeyRenameRequestWithFSO extends 
TestOMKeyRequest {
     return modifiedOmRequest;
   }
 
+  @Override
+  protected OmKeyInfo getOmKeyInfo(String keyName) {
+    long bucketId = random.nextLong();
+    return OMRequestTestUtils.createOmKeyInfo(
+        volumeName, bucketName, keyName,
+        HddsProtos.ReplicationType.RATIS, HddsProtos.ReplicationFactor.ONE,
+        bucketId + 100L, bucketId + 101L, 0L, Time.now());
+  }
+
+  @Override
+  protected String addKeyToTable(OmKeyInfo keyInfo) throws Exception {
+    OMRequestTestUtils.addFileToKeyTable(false, false,
+        keyInfo.getFileName(), keyInfo, clientID, txnLogId, omMetadataManager);
+    return getDBKeyName(keyInfo);
+  }
+
+  @Override
+  protected OMKeyRenameRequest getOMKeyRenameRequest(OMRequest omRequest) {
+    return new OMKeyRenameRequestWithFSO(omRequest, getBucketLayout());
+  }
+
+  @Override
+  protected String getDBKeyName(OmKeyInfo keyInfo) throws IOException {
+    return omMetadataManager.getOzonePathKey(
+        omMetadataManager.getVolumeId(volumeName),
+        omMetadataManager.getBucketId(volumeName, bucketName),
+        keyInfo.getParentObjectID(), keyInfo.getKeyName());
+  }
+
+  @Override
+  protected void assertModificationTime(long except)
+      throws IOException {
+    // For filesystem should change the modification time for
+    // both the parents directory
+    OmDirectoryInfo updatedFromKeyParentInfo = omMetadataManager
+        .getDirectoryTable().get(getDBKeyName(fromKeyParentInfo));
+    OmDirectoryInfo updatedToKeyParentInfo = omMetadataManager
+        .getDirectoryTable().get(getDBKeyName(toKeyParentInfo));
+    Assert.assertEquals(except, 
updatedFromKeyParentInfo.getModificationTime());
+    Assert.assertEquals(except, updatedToKeyParentInfo.getModificationTime());
+  }
+
   @Override
   public BucketLayout getBucketLayout() {
     return BucketLayout.FILE_SYSTEM_OPTIMIZED;
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 92b2448650..ecd80c897d 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
@@ -18,8 +18,12 @@
 
 package org.apache.hadoop.ozone.om.response.key;
 
+import java.io.IOException;
 import java.util.UUID;
 
+import org.apache.hadoop.hdds.utils.db.Table;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
 import org.junit.Assert;
 import org.junit.Test;
@@ -27,84 +31,96 @@ import org.junit.Test;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 
+import static  
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
+
 /**
  * Tests OMKeyRenameResponse.
  */
+@SuppressWarnings("checkstyle:VisibilityModifier")
 public class TestOMKeyRenameResponse extends TestOMKeyResponse {
+  protected OmKeyInfo fromKeyParent;
+  protected OmKeyInfo toKeyParent;
+  protected OmBucketInfo bucketInfo;
   @Test
   public void testAddToDBBatch() throws Exception {
-
-    OmKeyInfo omKeyInfo = OMRequestTestUtils.createOmKeyInfo(volumeName,
-        bucketName, keyName, replicationType, replicationFactor);
-
-    OzoneManagerProtocolProtos.OMResponse omResponse =
-        
OzoneManagerProtocolProtos.OMResponse.newBuilder().setRenameKeyResponse(
+    OMResponse omResponse =
+        OMResponse.newBuilder().setRenameKeyResponse(
             OzoneManagerProtocolProtos.RenameKeyResponse.getDefaultInstance())
             .setStatus(OzoneManagerProtocolProtos.Status.OK)
             .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey)
             .build();
 
     String toKeyName = UUID.randomUUID().toString();
-
-    OMKeyRenameResponse omKeyRenameResponse = new OMKeyRenameResponse(
-        omResponse, keyName, toKeyName, omKeyInfo, getBucketLayout());
-
-    String ozoneFromKey = omMetadataManager.getOzoneKey(volumeName, bucketName,
-        keyName);
-
-    String ozoneToKey = omMetadataManager.getOzoneKey(volumeName, bucketName,
-        toKeyName);
-
-    OMRequestTestUtils.addKeyToTable(false, volumeName, bucketName, keyName,
-        clientID, replicationType, replicationFactor, omMetadataManager);
-
-    Assert.assertTrue(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
-    Assert.assertFalse(
-        omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneToKey));
+    OmKeyInfo toKeyInfo = getOmKeyInfo(toKeyName);
+    OmKeyInfo fromKeyInfo = getOmKeyInfo(keyName);
+    String dbFromKey = addKeyToTable(fromKeyInfo);
+    String dbToKey = getDBKeyName(toKeyInfo);
+
+    OMKeyRenameResponse omKeyRenameResponse =
+        getOMKeyRenameResponse(omResponse, fromKeyInfo, toKeyInfo);
+
+    Assert.assertTrue(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbFromKey));
+    Assert.assertFalse(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbToKey));
+    if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(fromKeyParent)));
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(toKeyParent)));
+      Assert.assertFalse(
+          omMetadataManager.getBucketTable().iterator().hasNext());
+    }
 
     omKeyRenameResponse.addToDBBatch(omMetadataManager, batchOperation);
 
     // Do manual commit and see whether addToBatch is successful or not.
     omMetadataManager.getStore().commitBatchOperation(batchOperation);
 
-    Assert.assertFalse(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
-    Assert.assertTrue(
-        omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneToKey));
+    Assert.assertFalse(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbFromKey));
+    Assert.assertTrue(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbToKey));
+    if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {
+      Assert.assertTrue(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(fromKeyParent)));
+      Assert.assertTrue(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(toKeyParent)));
+      Table.KeyValue<String, OmBucketInfo> keyValue =
+          omMetadataManager.getBucketTable().iterator().next();
+      Assert.assertEquals(omMetadataManager.getBucketKey(
+          bucketInfo.getVolumeName(), bucketInfo.getBucketName()),
+          keyValue.getKey());
+    }
   }
 
   @Test
   public void testAddToDBBatchWithErrorResponse() throws Exception {
-
-    OmKeyInfo omKeyInfo = OMRequestTestUtils.createOmKeyInfo(volumeName,
-        bucketName, keyName, replicationType, replicationFactor);
-
-    OzoneManagerProtocolProtos.OMResponse omResponse =
-        
OzoneManagerProtocolProtos.OMResponse.newBuilder().setRenameKeyResponse(
+    OMResponse omResponse = OMResponse.newBuilder().setRenameKeyResponse(
             OzoneManagerProtocolProtos.RenameKeyResponse.getDefaultInstance())
-            .setStatus(OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND)
-            .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey)
-            .build();
+        .setStatus(OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND)
+        .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey)
+        .build();
 
     String toKeyName = UUID.randomUUID().toString();
-
-    OMKeyRenameResponse omKeyRenameResponse = new OMKeyRenameResponse(
-        omResponse, keyName, toKeyName, omKeyInfo, getBucketLayout());
-
-    String ozoneFromKey = omMetadataManager.getOzoneKey(volumeName, bucketName,
-        keyName);
-
-    String ozoneToKey = omMetadataManager.getOzoneKey(volumeName, bucketName,
-        toKeyName);
-
-    OMRequestTestUtils.addKeyToTable(false, volumeName, bucketName, keyName,
-        clientID, replicationType, replicationFactor, omMetadataManager);
-
-    Assert.assertTrue(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
-    Assert.assertFalse(
-        omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneToKey));
+    OmKeyInfo toKeyInfo = getOmKeyInfo(toKeyName);
+    OmKeyInfo fromKeyInfo = getOmKeyInfo(keyName);
+    String dbFromKey = addKeyToTable(fromKeyInfo);
+    String dbToKey = getDBKeyName(toKeyInfo);
+
+    OMKeyRenameResponse omKeyRenameResponse = getOMKeyRenameResponse(
+        omResponse, fromKeyInfo, toKeyInfo);
+
+    Assert.assertTrue(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbFromKey));
+    Assert.assertFalse(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbToKey));
+    if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(fromKeyParent)));
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(toKeyParent)));
+    }
 
     omKeyRenameResponse.checkAndUpdateDB(omMetadataManager, batchOperation);
 
@@ -112,47 +128,37 @@ public class TestOMKeyRenameResponse extends 
TestOMKeyResponse {
     omMetadataManager.getStore().commitBatchOperation(batchOperation);
 
     // As omResponse has error, it is a no-op. So, no changes should happen.
-    Assert.assertTrue(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
-    Assert.assertFalse(
-        omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneToKey));
-
+    Assert.assertTrue(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbFromKey));
+    Assert.assertFalse(omMetadataManager.getKeyTable(getBucketLayout())
+        .isExist(dbToKey));
+    if (getBucketLayout() == BucketLayout.FILE_SYSTEM_OPTIMIZED) {
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(fromKeyParent)));
+      Assert.assertFalse(omMetadataManager.getDirectoryTable()
+          .isExist(getDBKeyName(toKeyParent)));
+    }
   }
 
-  @Test
-  public void testAddToDBBatchWithSameKeyName() throws Exception {
-
-    OmKeyInfo omKeyInfo = OMRequestTestUtils.createOmKeyInfo(volumeName,
-        bucketName, keyName, replicationType, replicationFactor);
-
-    OzoneManagerProtocolProtos.OMResponse omResponse =
-        
OzoneManagerProtocolProtos.OMResponse.newBuilder().setRenameKeyResponse(
-            OzoneManagerProtocolProtos.RenameKeyResponse.getDefaultInstance())
-            .setStatus(OzoneManagerProtocolProtos.Status.KEY_NOT_FOUND)
-            .setCmdType(OzoneManagerProtocolProtos.Type.RenameKey)
-            .build();
-
-
-    // Passing toKeyName also same as KeyName.
-    OMKeyRenameResponse omKeyRenameResponse = new OMKeyRenameResponse(
-        omResponse, keyName, keyName, omKeyInfo, getBucketLayout());
-
-    String ozoneFromKey = omMetadataManager.getOzoneKey(volumeName, bucketName,
-        keyName);
-
-    OMRequestTestUtils.addKeyToTable(false, volumeName, bucketName, keyName,
-        clientID, replicationType, replicationFactor, omMetadataManager);
-
-    Assert.assertTrue(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
-
-    omKeyRenameResponse.addToDBBatch(omMetadataManager, batchOperation);
+  protected OmKeyInfo getOmKeyInfo(String keyName) {
+    return OMRequestTestUtils.createOmKeyInfo(volumeName, bucketName, keyName,
+        replicationType, replicationFactor, 0L);
+  }
 
-    // Do manual commit and see whether addToBatch is successful or not.
-    omMetadataManager.getStore().commitBatchOperation(batchOperation);
+  protected String addKeyToTable(OmKeyInfo keyInfo) throws Exception {
+    OMRequestTestUtils.addKeyToTable(false, false, keyInfo, clientID, 0L,
+        omMetadataManager);
+    return getDBKeyName(keyInfo);
+  }
 
-    Assert.assertTrue(
-        
omMetadataManager.getKeyTable(getBucketLayout()).isExist(ozoneFromKey));
+  protected String getDBKeyName(OmKeyInfo keyName)  throws Exception {
+    return omMetadataManager.getOzoneKey(keyName.getVolumeName(),
+        keyName.getBucketName(), keyName.getKeyName());
+  }
 
+  protected OMKeyRenameResponse getOMKeyRenameResponse(OMResponse response,
+      OmKeyInfo fromKeyInfo, OmKeyInfo toKeyInfo) throws IOException {
+    return new OMKeyRenameResponse(response, fromKeyInfo.getKeyName(),
+        toKeyInfo.getKeyName(), toKeyInfo);
   }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponseWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponseWithFSO.java
new file mode 100644
index 0000000000..6dcf38df9c
--- /dev/null
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/TestOMKeyRenameResponseWithFSO.java
@@ -0,0 +1,94 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.response.key;
+
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
+import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
+import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
+import org.apache.hadoop.ozone.om.response.TestOMResponseUtils;
+import org.apache.hadoop.util.Time;
+
+import java.io.IOException;
+import java.util.UUID;
+
+import static 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
+
+/**
+ * Tests TestOMKeyRenameResponseWithFSO.
+ */
+public class TestOMKeyRenameResponseWithFSO extends TestOMKeyRenameResponse {
+  @Override
+  protected OmKeyInfo getOmKeyInfo(String keyName) {
+    long bucketId = random.nextLong();
+    return OMRequestTestUtils.createOmKeyInfo(
+        volumeName, bucketName, keyName,
+        HddsProtos.ReplicationType.RATIS, HddsProtos.ReplicationFactor.ONE,
+        bucketId + 100L, bucketId + 101L, 0L, Time.now());
+  }
+
+  @Override
+  protected String addKeyToTable(OmKeyInfo keyInfo) throws Exception {
+    OMRequestTestUtils.addFileToKeyTable(false, false,
+        keyInfo.getFileName(), keyInfo, clientID, txnLogId, omMetadataManager);
+    return getDBKeyName(keyInfo);
+  }
+
+  @Override
+  protected String getDBKeyName(OmKeyInfo keyInfo) throws IOException {
+    return omMetadataManager.getOzonePathKey(
+        omMetadataManager.getVolumeId(volumeName),
+        omMetadataManager.getBucketId(volumeName, bucketName),
+        keyInfo.getParentObjectID(), keyInfo.getKeyName());
+  }
+
+  @Override
+  protected OMKeyRenameResponse getOMKeyRenameResponse(OMResponse response,
+      OmKeyInfo fromKeyInfo, OmKeyInfo toKeyInfo) throws IOException {
+    createParent();
+    return new OMKeyRenameResponseWithFSO(response, getDBKeyName(fromKeyInfo),
+        getDBKeyName(toKeyInfo), fromKeyParent, toKeyParent, toKeyInfo,
+        bucketInfo, false, getBucketLayout());
+  }
+  protected void createParent() {
+    long bucketId = random.nextLong();
+    String fromKeyParentName = UUID.randomUUID().toString();
+    String toKeyParentName = UUID.randomUUID().toString();
+    fromKeyParent = OMRequestTestUtils.createOmKeyInfo(volumeName,
+        bucketName, fromKeyParentName, replicationType, replicationFactor,
+        bucketId + 100L);
+    toKeyParent = OMRequestTestUtils.createOmKeyInfo(volumeName,
+        bucketName, toKeyParentName, replicationType, replicationFactor,
+        bucketId + 101L);
+    fromKeyParent.setParentObjectID(bucketId);
+    toKeyParent.setParentObjectID(bucketId);
+    fromKeyParent.setFileName(OzoneFSUtils.getFileName(
+        fromKeyParent.getKeyName()));
+    toKeyParent.setFileName(OzoneFSUtils.getFileName(
+        toKeyParent.getKeyName()));
+    String volumeName = UUID.randomUUID().toString();
+    String bucketName = UUID.randomUUID().toString();
+    bucketInfo = TestOMResponseUtils.createBucket(volumeName, bucketName);
+  }
+  @Override
+  public BucketLayout getBucketLayout() {
+    return BucketLayout.FILE_SYSTEM_OPTIMIZED;
+  }
+}


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

Reply via email to