From 47b7cd969461f427addd8cf6dfb828ba234e2b75 Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Wed, 14 Feb 2024 18:37:44 +0530 Subject: [PATCH 1/3] HDDS-10369. Set Times API doesn't work with linked buckets. --- .../AbstractRootedOzoneFileSystemTest.java | 35 +++++++++++++++++++ .../om/request/key/OMKeySetTimesRequest.java | 8 +++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java index a3555fcf52df..32ef7ad1f7c2 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java @@ -2485,4 +2485,39 @@ void testSetTimes() throws Exception { assertEquals(mtime, fileStatus.getModificationTime()); } + @Test + public void testSetTimesForLinkedBucketPath() throws Exception { + // Create a file + OzoneBucket sourceBucket = + TestDataUtil.createVolumeAndBucket(client, bucketLayout); + Path volumePath1 = + new Path(OZONE_URI_DELIMITER, sourceBucket.getVolumeName()); + Path sourceBucketPath = new Path(volumePath1, sourceBucket.getName()); + Path path = new Path(sourceBucketPath, "key1"); + try (FSDataOutputStream stream = fs.create(path)) { + stream.write(1); + } + OzoneVolume sourceVol = client.getObjectStore().getVolume(sourceBucket.getVolumeName()); + String linkBucketName = UUID.randomUUID().toString(); + createLinkBucket(sourceVol.getName(), linkBucketName, + sourceVol.getName(), sourceBucket.getName()); + + Path linkedBucketPath = new Path(volumePath1, linkBucketName); + Path keyInLinkedBucket = new Path(linkedBucketPath, "key1"); + + // test setTimes in linked bucket path + long mtime = 1000; + fs.setTimes(keyInLinkedBucket, mtime, 2000); + + FileStatus fileStatus = fs.getFileStatus(path); + // verify that mtime is updated as expected. + assertEquals(mtime, fileStatus.getModificationTime()); + + long mtimeDontUpdate = -1; + fs.setTimes(keyInLinkedBucket, mtimeDontUpdate, 2000); + + fileStatus = fs.getFileStatus(keyInLinkedBucket); + // verify that mtime is NOT updated as expected. + assertEquals(mtime, fileStatus.getModificationTime()); + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java index 1f5e623da0d2..1ce95163f9ca 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java @@ -23,6 +23,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; @@ -63,9 +64,10 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { OMRequest request = super.preExecute(ozoneManager); SetTimesRequest setTimesRequest = request.getSetTimesRequest(); String keyPath = setTimesRequest.getKeyArgs().getKeyName(); + OmBucketInfo bucketInfo = ozoneManager.getBucketInfo(volumeName, bucketName); String normalizedKeyPath = validateAndNormalizeKey(ozoneManager.getEnableFileSystemPaths(), - keyPath, getBucketLayout()); + keyPath, bucketInfo.getBucketLayout()); OzoneManagerProtocolProtos.KeyArgs keyArgs = OzoneManagerProtocolProtos.KeyArgs.newBuilder() @@ -74,10 +76,12 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { .setKeyName(normalizedKeyPath) .build(); + OzoneManagerProtocolProtos.KeyArgs newKeyArgs = resolveBucketLink(ozoneManager, keyArgs); + return request.toBuilder() .setSetTimesRequest( setTimesRequest.toBuilder() - .setKeyArgs(keyArgs) + .setKeyArgs(newKeyArgs) .setMtime(getModificationTime())) .build(); } From 9bff7f42dd7d0526c8a240e30c613bd3de2e8539 Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Thu, 15 Feb 2024 11:30:40 +0530 Subject: [PATCH 2/3] address comment --- .../hadoop/ozone/om/request/key/OMKeySetTimesRequest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java index 1ce95163f9ca..cdc6fcd78916 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java @@ -64,10 +64,9 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException { OMRequest request = super.preExecute(ozoneManager); SetTimesRequest setTimesRequest = request.getSetTimesRequest(); String keyPath = setTimesRequest.getKeyArgs().getKeyName(); - OmBucketInfo bucketInfo = ozoneManager.getBucketInfo(volumeName, bucketName); String normalizedKeyPath = validateAndNormalizeKey(ozoneManager.getEnableFileSystemPaths(), - keyPath, bucketInfo.getBucketLayout()); + keyPath, getBucketLayout()); OzoneManagerProtocolProtos.KeyArgs keyArgs = OzoneManagerProtocolProtos.KeyArgs.newBuilder() From 71457747f74a3cb4539d7c1e4100e20def89400a Mon Sep 17 00:00:00 2001 From: Sadanand Shenoy Date: Thu, 15 Feb 2024 11:33:36 +0530 Subject: [PATCH 3/3] remove import --- .../apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java index cdc6fcd78916..e14cfaaad281 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java @@ -23,7 +23,6 @@ import java.util.LinkedHashMap; import java.util.Map; -import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.ratis.server.protocol.TermIndex; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue;