This is an automated email from the ASF dual-hosted git repository.
hemant 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 527be1a6ac HDDS-9422. Return error response when trying to create a
directory under .snapshot path (#5781)
527be1a6ac is described below
commit 527be1a6ac904e4bcb0efbe5d0e51c44c21c91fa
Author: Hemant Kumar <[email protected]>
AuthorDate: Thu Dec 14 02:58:02 2023 -0800
HDDS-9422. Return error response when trying to create a directory under
.snapshot path (#5781)
---
.../om/request/file/OMDirectoryCreateRequest.java | 4 ++
.../request/file/TestOMDirectoryCreateRequest.java | 52 ++++++++++++++--------
2 files changed, 38 insertions(+), 18 deletions(-)
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
index 2dc3f7b4bc..3e98513f2c 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java
@@ -31,6 +31,7 @@ import com.google.common.base.Preconditions;
import org.apache.hadoop.hdds.client.ECReplicationConfig;
import org.apache.hadoop.hdds.client.ReplicationConfig;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -117,6 +118,9 @@ public class OMDirectoryCreateRequest extends OMKeyRequest {
getOmRequest().getCreateDirectoryRequest();
Preconditions.checkNotNull(createDirectoryRequest);
+ OmUtils.verifyKeyNameWithSnapshotReservedWord(
+ createDirectoryRequest.getKeyArgs().getKeyName());
+
KeyArgs.Builder newKeyArgs = createDirectoryRequest.getKeyArgs()
.toBuilder().setModificationTime(Time.now());
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java
index fadf56025c..0bc1e68bf3 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java
@@ -30,6 +30,7 @@ import org.apache.commons.lang3.RandomStringUtils;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.om.ResolvedBucket;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
@@ -42,6 +43,8 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.Mockito;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -55,12 +58,9 @@ import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
- .CreateDirectoryRequest;
-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.CreateDirectoryRequest;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
+import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER;
import static org.mockito.ArgumentMatchers.any;
@@ -78,12 +78,9 @@ public class TestOMDirectoryCreateRequest {
private OzoneManager ozoneManager;
private OMMetrics omMetrics;
private OMMetadataManager omMetadataManager;
- private AuditLogger auditLogger;
// Just setting ozoneManagerDoubleBuffer which does nothing.
- private OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper =
- ((response, transactionIndex) -> {
- return null;
- });
+ private final OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper =
+ ((response, transactionIndex) -> null);
@BeforeEach
public void setup() throws Exception {
@@ -96,7 +93,7 @@ public class TestOMDirectoryCreateRequest {
ozoneManager);
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
- auditLogger = Mockito.mock(AuditLogger.class);
+ AuditLogger auditLogger = Mockito.mock(AuditLogger.class);
when(ozoneManager.getAuditLogger()).thenReturn(auditLogger);
Mockito.doNothing().when(auditLogger).logWrite(any(AuditMessage.class));
when(ozoneManager.resolveBucketLink(any(KeyArgs.class),
@@ -112,12 +109,11 @@ public class TestOMDirectoryCreateRequest {
Mockito.framework().clearInlineMocks();
}
- @Test
- public void testPreExecute() throws Exception {
-
+ @ParameterizedTest
+ @ValueSource(strings = {"a/b/c", "a/.snapshot/c", "a.snapshot/b/c"})
+ public void testPreExecute(String keyName) throws Exception {
String volumeName = "vol1";
String bucketName = "bucket1";
- String keyName = "a/b/c";
OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
omMetadataManager);
@@ -130,11 +126,31 @@ public class TestOMDirectoryCreateRequest {
OMRequest modifiedOmRequest =
omDirectoryCreateRequest.preExecute(ozoneManager);
- // As in preExecute, we modify original request.
+ // As in preExecute, we modify the original request.
Assertions.assertNotEquals(omRequest, modifiedOmRequest);
-
}
+ // Test verifies that .snapshot is not allowed as root dir name.
+ @Test
+ public void testPreExecuteFailure() throws Exception {
+ String volumeName = "vol1";
+ String bucketName = "bucket1";
+ String keyName = ".snapshot/a/b/c";
+
+ OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
+ omMetadataManager);
+
+ OMRequest omRequest = createDirectoryRequest(volumeName, bucketName,
+ keyName);
+ OMDirectoryCreateRequest omDirectoryCreateRequest =
+ new OMDirectoryCreateRequest(omRequest, getBucketLayout());
+
+ OMException omException = Assertions.assertThrows(OMException.class,
+ () -> omDirectoryCreateRequest.preExecute(ozoneManager));
+ Assertions.assertEquals(
+ "Cannot create key under path reserved for snapshot: .snapshot/",
+ omException.getMessage());
+ }
@Test
public void testValidateAndUpdateCache() throws Exception {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]