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]