Skip to content

Commit 5275ded

Browse files
authored
HDDS-10133. Add a method to check key name in OMKeyRequest (#6012)
1 parent fd5c6d8 commit 5275ded

10 files changed

Lines changed: 120 additions & 50 deletions

File tree

hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -568,11 +568,6 @@ public final class OzoneConfigKeys {
568568
"ozone.https.client.need-auth";
569569
public static final boolean OZONE_CLIENT_HTTPS_NEED_AUTH_DEFAULT = false;
570570

571-
public static final String OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY =
572-
"ozone.om.keyname.character.check.enabled";
573-
public static final boolean OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT =
574-
false;
575-
576571
public static final int OZONE_INIT_DEFAULT_LAYOUT_VERSION_DEFAULT = -1;
577572
public static final String OZONE_CLIENT_KEY_PROVIDER_CACHE_EXPIRY =
578573
"ozone.client.key.provider.cache.expiry";

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.apache.hadoop.hdds.client.ReplicationConfig;
3333
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
3434
import org.apache.ratis.server.protocol.TermIndex;
35-
import org.apache.hadoop.ozone.OmUtils;
3635
import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
3736
import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
3837
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -117,8 +116,10 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
117116
super.preExecute(ozoneManager).getCreateDirectoryRequest();
118117
Preconditions.checkNotNull(createDirectoryRequest);
119118

120-
OmUtils.verifyKeyNameWithSnapshotReservedWord(
121-
createDirectoryRequest.getKeyArgs().getKeyName());
119+
KeyArgs keyArgs = createDirectoryRequest.getKeyArgs();
120+
ValidateKeyArgs validateArgs = new ValidateKeyArgs.Builder()
121+
.setSnapshotReservedWord(keyArgs.getKeyName()).build();
122+
validateKey(ozoneManager, validateArgs);
122123

123124
KeyArgs.Builder newKeyArgs = createDirectoryRequest.getKeyArgs()
124125
.toBuilder().setModificationTime(Time.now());

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@
3030
import org.apache.commons.lang3.StringUtils;
3131
import org.apache.hadoop.hdds.client.ReplicationConfig;
3232
import org.apache.ratis.server.protocol.TermIndex;
33-
import org.apache.hadoop.ozone.OmUtils;
3433
import org.apache.hadoop.ozone.OzoneConsts;
35-
import org.apache.hadoop.ozone.om.OMConfigKeys;
3634
import org.apache.hadoop.ozone.om.OzoneConfigUtil;
3735
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
3836
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
@@ -93,16 +91,11 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
9391
Preconditions.checkNotNull(createFileRequest);
9492

9593
KeyArgs keyArgs = createFileRequest.getKeyArgs();
96-
97-
// Verify key name
98-
OmUtils.verifyKeyNameWithSnapshotReservedWord(keyArgs.getKeyName());
99-
final boolean checkKeyNameEnabled = ozoneManager.getConfiguration()
100-
.getBoolean(OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY,
101-
OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT);
102-
if (checkKeyNameEnabled) {
103-
OmUtils.validateKeyName(StringUtils.removeEnd(keyArgs.getKeyName(),
104-
OzoneConsts.FS_FILE_COPYING_TEMP_SUFFIX));
105-
}
94+
ValidateKeyArgs validateArgs = new ValidateKeyArgs.Builder()
95+
.setSnapshotReservedWord(keyArgs.getKeyName())
96+
.setKeyName(StringUtils.removeEnd(keyArgs.getKeyName(),
97+
OzoneConsts.FS_FILE_COPYING_TEMP_SUFFIX)).build();
98+
validateKey(ozoneManager, validateArgs);
10699

107100
UserInfo userInfo = getUserInfo();
108101
if (keyArgs.getKeyName().length() == 0) {

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@
3030
import org.apache.commons.lang3.StringUtils;
3131
import org.apache.hadoop.ozone.OzoneManagerVersion;
3232
import org.apache.ratis.server.protocol.TermIndex;
33-
import org.apache.hadoop.ozone.OmUtils;
3433
import org.apache.hadoop.ozone.OzoneConsts;
35-
import org.apache.hadoop.ozone.om.OMConfigKeys;
3634
import org.apache.hadoop.ozone.om.helpers.KeyValueUtil;
3735
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
3836
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -100,14 +98,11 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
10098
ozoneManager.checkFeatureEnabled(OzoneManagerVersion.ATOMIC_REWRITE_KEY);
10199
}
102100

103-
// Verify key name
104-
final boolean checkKeyNameEnabled = ozoneManager.getConfiguration()
105-
.getBoolean(OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY,
106-
OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT);
107-
if (checkKeyNameEnabled) {
108-
OmUtils.validateKeyName(StringUtils.removeEnd(keyArgs.getKeyName(),
109-
OzoneConsts.FS_FILE_COPYING_TEMP_SUFFIX));
110-
}
101+
ValidateKeyArgs validateArgs = new ValidateKeyArgs.Builder()
102+
.setKeyName(StringUtils.removeEnd(keyArgs.getKeyName(),
103+
OzoneConsts.FS_FILE_COPYING_TEMP_SUFFIX)).build();
104+
validateKey(ozoneManager, validateArgs);
105+
111106
boolean isHsync = commitKeyRequest.hasHsync() && commitKeyRequest.getHsync();
112107
boolean isRecovery = commitKeyRequest.hasRecovery() && commitKeyRequest.getRecovery();
113108
boolean enableHsync = OzoneFSUtils.canEnableHsync(ozoneManager.getConfiguration(), false);

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import org.apache.hadoop.hdds.client.ReplicationConfig;
3131
import org.apache.hadoop.ozone.OzoneManagerVersion;
3232
import org.apache.ratis.server.protocol.TermIndex;
33-
import org.apache.hadoop.ozone.OmUtils;
34-
import org.apache.hadoop.ozone.om.OMConfigKeys;
3533
import org.apache.hadoop.ozone.om.OzoneConfigUtil;
3634
import org.apache.hadoop.ozone.om.exceptions.OMException;
3735
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
@@ -98,14 +96,10 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
9896
ozoneManager.checkFeatureEnabled(OzoneManagerVersion.ATOMIC_REWRITE_KEY);
9997
}
10098

101-
// Verify key name
102-
OmUtils.verifyKeyNameWithSnapshotReservedWord(keyArgs.getKeyName());
103-
final boolean checkKeyNameEnabled = ozoneManager.getConfiguration()
104-
.getBoolean(OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY,
105-
OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT);
106-
if (checkKeyNameEnabled) {
107-
OmUtils.validateKeyName(keyArgs.getKeyName());
108-
}
99+
ValidateKeyArgs validateArgs = new ValidateKeyArgs.Builder()
100+
.setSnapshotReservedWord(keyArgs.getKeyName())
101+
.setKeyName(keyArgs.getKeyName()).build();
102+
validateKey(ozoneManager, validateArgs);
109103

110104
String keyPath = keyArgs.getKeyName();
111105
keyPath = validateAndNormalizeKey(ozoneManager.getEnableFileSystemPaths(),

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@
2424

2525
import com.google.common.base.Preconditions;
2626
import org.apache.ratis.server.protocol.TermIndex;
27-
import org.apache.hadoop.ozone.OmUtils;
2827
import org.apache.hadoop.ozone.OzoneConsts;
29-
import org.apache.hadoop.ozone.om.OMConfigKeys;
3028
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
3129
import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
3230
import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator;
@@ -83,15 +81,10 @@ public OMRequest preExecute(OzoneManager ozoneManager) throws IOException {
8381
.getRenameKeyRequest();
8482
Preconditions.checkNotNull(renameKeyRequest);
8583

86-
// Verify key name
87-
final boolean checkKeyNameEnabled = ozoneManager.getConfiguration()
88-
.getBoolean(OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY,
89-
OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT);
90-
if (checkKeyNameEnabled) {
91-
OmUtils.validateKeyName(renameKeyRequest.getToKeyName());
92-
}
93-
9484
KeyArgs renameKeyArgs = renameKeyRequest.getKeyArgs();
85+
ValidateKeyArgs validateArgs = new ValidateKeyArgs.Builder()
86+
.setKeyName(renameKeyRequest.getToKeyName()).build();
87+
validateKey(ozoneManager, validateArgs);
9588

9689
String srcKey = extractSrcKey(renameKeyArgs);
9790
String dstKey = extractDstKey(renameKeyRequest);

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.hadoop.ozone.om.OMMetrics;
4848
import org.apache.hadoop.ozone.om.PrefixManager;
4949
import org.apache.hadoop.ozone.om.ResolvedBucket;
50+
import org.apache.hadoop.ozone.om.OMConfigKeys;
5051
import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
5152
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
5253
import org.apache.hadoop.ozone.om.helpers.KeyValueUtil;
@@ -176,6 +177,80 @@ protected KeyArgs resolveBucketAndCheckOpenKeyAcls(KeyArgs keyArgs,
176177
return resolvedArgs;
177178
}
178179

180+
/**
181+
* Define the parameters carried when verifying the Key.
182+
*/
183+
public static class ValidateKeyArgs {
184+
private String snapshotReservedWord;
185+
private String keyName;
186+
private boolean validateSnapshotReserved;
187+
private boolean validateKeyName;
188+
189+
ValidateKeyArgs(String snapshotReservedWord, String keyName,
190+
boolean validateSnapshotReserved, boolean validateKeyName) {
191+
this.snapshotReservedWord = snapshotReservedWord;
192+
this.keyName = keyName;
193+
this.validateSnapshotReserved = validateSnapshotReserved;
194+
this.validateKeyName = validateKeyName;
195+
}
196+
197+
public String getSnapshotReservedWord() {
198+
return snapshotReservedWord;
199+
}
200+
201+
public String getKeyName() {
202+
return keyName;
203+
}
204+
205+
public boolean isValidateSnapshotReserved() {
206+
return validateSnapshotReserved;
207+
}
208+
209+
public boolean isValidateKeyName() {
210+
return validateKeyName;
211+
}
212+
213+
/**
214+
* Tools for building {@link ValidateKeyArgs}.
215+
*/
216+
public static class Builder {
217+
private String snapshotReservedWord;
218+
private String keyName;
219+
private boolean validateSnapshotReserved;
220+
private boolean validateKeyName;
221+
222+
public Builder setSnapshotReservedWord(String snapshotReservedWord) {
223+
this.snapshotReservedWord = snapshotReservedWord;
224+
this.validateSnapshotReserved = true;
225+
return this;
226+
}
227+
228+
public Builder setKeyName(String keyName) {
229+
this.keyName = keyName;
230+
this.validateKeyName = true;
231+
return this;
232+
}
233+
234+
public ValidateKeyArgs build() {
235+
return new ValidateKeyArgs(snapshotReservedWord, keyName,
236+
validateSnapshotReserved, validateKeyName);
237+
}
238+
}
239+
}
240+
241+
protected void validateKey(OzoneManager ozoneManager, ValidateKeyArgs validateKeyArgs)
242+
throws OMException {
243+
if (validateKeyArgs.isValidateSnapshotReserved()) {
244+
OmUtils.verifyKeyNameWithSnapshotReservedWord(validateKeyArgs.getSnapshotReservedWord());
245+
}
246+
final boolean checkKeyNameEnabled = ozoneManager.getConfiguration()
247+
.getBoolean(OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_KEY,
248+
OMConfigKeys.OZONE_OM_KEYNAME_CHARACTER_CHECK_ENABLED_DEFAULT);
249+
if (validateKeyArgs.isValidateKeyName() && checkKeyNameEnabled) {
250+
OmUtils.validateKeyName(validateKeyArgs.getKeyName());
251+
}
252+
}
253+
179254
/**
180255
* This methods avoids multiple rpc calls to SCM by allocating multiple blocks
181256
* in one rpc call.

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public void setup() throws Exception {
9797
folder.toAbsolutePath().toString());
9898
omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration,
9999
ozoneManager);
100+
when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration);
100101
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
101102
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
102103
AuditLogger auditLogger = mock(AuditLogger.class);

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequestWithFSO.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public void setup() throws Exception {
9797
OMRequestTestUtils.configureFSOptimizedPaths(ozoneConfiguration, true);
9898
omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration,
9999
ozoneManager);
100+
when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration);
100101
when(ozoneManager.getMetrics()).thenReturn(omMetrics);
101102
when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager);
102103
auditLogger = mock(AuditLogger.class);

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import jakarta.annotation.Nonnull;
6161
import org.junit.jupiter.api.AfterEach;
6262
import org.junit.jupiter.api.BeforeEach;
63+
import org.junit.jupiter.api.Test;
6364
import org.junit.jupiter.api.io.TempDir;
6465

6566
import org.apache.hadoop.hdds.client.ContainerBlockID;
@@ -85,6 +86,10 @@
8586

8687
import static org.apache.hadoop.ozone.om.request.OMRequestTestUtils.setupReplicationConfigValidation;
8788
import static org.junit.jupiter.api.Assertions.assertNotNull;
89+
import static org.junit.jupiter.api.Assertions.assertTrue;
90+
import static org.junit.jupiter.api.Assertions.assertFalse;
91+
import static org.junit.jupiter.api.Assertions.assertEquals;
92+
import static org.junit.jupiter.api.Assertions.assertNull;
8893
import static org.mockito.Mockito.any;
8994
import static org.mockito.Mockito.anyInt;
9095
import static org.mockito.Mockito.anyLong;
@@ -322,4 +327,21 @@ protected SnapshotInfo createSnapshot(String snapshotName) throws Exception {
322327
return snapshotInfo;
323328
}
324329

330+
@Test
331+
public void testValidateKeyArgs() {
332+
OMKeyRequest.ValidateKeyArgs validateKeyArgs1 = new OMKeyRequest.ValidateKeyArgs.Builder()
333+
.setKeyName("tmpKey").setSnapshotReservedWord("tmpSnapshotReservedWord").build();
334+
assertEquals("tmpSnapshotReservedWord", validateKeyArgs1.getSnapshotReservedWord());
335+
assertEquals("tmpKey", validateKeyArgs1.getKeyName());
336+
assertTrue(validateKeyArgs1.isValidateKeyName());
337+
assertTrue(validateKeyArgs1.isValidateSnapshotReserved());
338+
339+
OMKeyRequest.ValidateKeyArgs validateKeyArgs2 = new OMKeyRequest.ValidateKeyArgs.Builder()
340+
.setKeyName("tmpKey2").build();
341+
assertNull(validateKeyArgs2.getSnapshotReservedWord());
342+
assertEquals("tmpKey2", validateKeyArgs2.getKeyName());
343+
assertTrue(validateKeyArgs2.isValidateKeyName());
344+
assertFalse(validateKeyArgs2.isValidateSnapshotReserved());
345+
}
346+
325347
}

0 commit comments

Comments
 (0)