HDDS-12983. Validator Registry Changes for Supporting Version based validations#8404
HDDS-12983. Validator Registry Changes for Supporting Version based validations#8404swamirishi wants to merge 14 commits intoapache:masterfrom
Conversation
…alidations Change-Id: I939888c989eaec0a62884aa564e2f24a594122ef
Change-Id: Icec10ce7bb452753db0936212b0757c01279b533
Change-Id: I9a010c86d0128da8140fa33b46eaeef9da0dc283
adoroszlai
left a comment
There was a problem hiding this comment.
Thanks @swamirishi for the patch.
| public List<Method> validationsFor(RequestType requestType, | ||
| RequestProcessingPhase phase, | ||
| Map<Class<? extends Annotation>, ? extends Versioned> requestVersions) { |
There was a problem hiding this comment.
Please do not format method signature like this. Whenever visibility / return type / method name / other modifiers are changed, we would have to reindent all parameters.
| Validator validator, String methodName, Class<ReturnValue> returnValueType) { | ||
| try { | ||
| return (ReturnValue) validator.getClass().getMethod(methodName).invoke(validator); |
There was a problem hiding this comment.
Use returnValueType (currently unused) to cast the result, instead of using unchecked cast (ReturnValue).
| processingPhase = RequestProcessingPhase.PRE_PROCESS, | ||
| requestType = Type.CreateBucket | ||
| requestType = Type.CreateBucket, | ||
| applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT |
There was a problem hiding this comment.
nit:
| applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT | |
| applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT |
| * One validator can be applied in multiple, E.g. | ||
| * {@link org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator}, | ||
| * {@link org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator} |
There was a problem hiding this comment.
I don't think this sentence makes sense.
There was a problem hiding this comment.
updated the sentence lmk if it is ok now
| ValidatorRegistry<OzoneManagerProtocolProtos.Type> registry = | ||
| new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, | ||
| Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), | ||
| REQUEST_PROCESSING_PHASES); |
There was a problem hiding this comment.
Can we avoid duplicating this logic in each test case?
| * @return All the items which has an index value greater than given index value. | ||
| */ | ||
| public List<T> getItemsEqualToIdx(IDX indexValue) { |
There was a problem hiding this comment.
Javadoc mismatch ("greater than" vs. EqualTo)
| */ | ||
| private static final class IndexedItems<T, IDX extends Comparable<IDX>> { | ||
| private final List<T> items; | ||
| private final TreeMap<IDX, Integer> indexMap; |
There was a problem hiding this comment.
Declare as interface: NavigableMap.
| .sorted((validatorMethodPair1, validatorMethodPair2) -> | ||
| Integer.compare( | ||
| this.getApplyBeforeVersion(validatorMethodPair1.getKey()).version(), | ||
| this.getApplyBeforeVersion(validatorMethodPair2.getKey()).version())) |
There was a problem hiding this comment.
Extract this lambda to a static method.
| List<Method> validations = registry.validationsFor(request.getCmdType(), PRE_PROCESS, | ||
| this.getVersions(request)); |
There was a problem hiding this comment.
nit: remove this. and do not wrap line.
Change-Id: Ibf524d42e3d8535377105a07f8ca3213c8c62199
Change-Id: I67634e5517239bdec3965ed8819f9af6ecf577dd
Change-Id: Idf26bbc7e83877a71f46bafdf0216d70733a92ee
Change-Id: Idecefb392dbf5c01227d7c3702db1781b9edb073
Change-Id: I174cea546d6fd021e58966b3a5bca3672e9d567e # Conflicts: # hadoop-ozone/client/pom.xml # hadoop-ozone/interface-storage/pom.xml # hadoop-ozone/recon-codegen/pom.xml # hadoop-ozone/s3gateway/pom.xml
Change-Id: I132006b2b5a638e7f19d9ec1beb33b332d105e98
|
This PR has been marked as stale due to 21 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in 7 days. |
|
Thank you for your contribution. This PR is being closed due to inactivity. If needed, feel free to reopen it. |
Change-Id: Ie1076419cae849563efc8a14ac97e5c0c83828a9 # Conflicts: # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java # hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java
Change-Id: I461d46461905d041a613b101182d24e18a143d5c
| @OMLayoutVersionValidator( | ||
| processingPhase = RequestProcessingPhase.PRE_PROCESS, | ||
| requestType = Type.CreateDirectory | ||
| requestType = Type.CreateDirectory, | ||
| applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT |
There was a problem hiding this comment.
Please simply replace the two changed lines instead of moving things around.
- @RequestFeatureValidator(
- conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION,
+ @OMLayoutVersionValidator(
+ applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT,
hadoop-hdds/client/pom.xml
Outdated
| <bannedImport>org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator</bannedImport> | ||
| <bannedImport>org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator</bannedImport> | ||
| <bannedImport>org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator</bannedImport> |
There was a problem hiding this comment.
Created #9530 to reduce the change that this PR needs to make in POM files. The other PR:
- adds the new annotations, since they were already introduced in HDDS-11981
- more importantly, removes
RequestFeatureValidatorfrom modules where it's not even accessible
So this PR will only need to update POMs for the removal of RequestFeatureValidator, and only in fewer modules.
There was a problem hiding this comment.
merged with master branch
Change-Id: Ie6717a5c5e5e6821c2ec8d7abc7a5d4a20d6767f # Conflicts: # hadoop-hdds/client/pom.xml # hadoop-hdds/common/pom.xml # hadoop-hdds/container-service/pom.xml # hadoop-hdds/framework/pom.xml # hadoop-hdds/server-scm/pom.xml # hadoop-ozone/cli-admin/pom.xml # hadoop-ozone/cli-shell/pom.xml # hadoop-ozone/common/pom.xml # hadoop-ozone/csi/pom.xml # hadoop-ozone/freon/pom.xml # hadoop-ozone/insight/pom.xml # hadoop-ozone/recon/pom.xml # hadoop-ozone/tools/pom.xml # pom.xml
Change-Id: Ia2f6792669628c67088b8b5a273fb271476e8848
|
@adoroszlai I have addressed all your review comments. Can you take a look at the change now. |
| OMResponse validatedResponse = response; | ||
| List<Method> validations = registry.validationsFor(request.getCmdType(), POST_PROCESS, this.getVersions(request)); | ||
|
|
||
| OMResponse validatedResponse = response.toBuilder().build(); |
There was a problem hiding this comment.
Why is response being copied here?
There was a problem hiding this comment.
just wanted to ensure the validators don't change the original object passed so that the caller can get both the objects. I can remove it if you want me to. It is inconsequential
There was a problem hiding this comment.
Yes, please remove, it is unnecessary. OMResponse (as a protobuf message) is immutable, so validators cannot change it.
There was a problem hiding this comment.
Pull request overview
This pull request refactors the request validation framework in Ozone Manager to support version-based validations instead of condition-based validations. The changes replace the ValidationCondition enum and RequestFeatureValidator annotation with a more flexible version-based system using OMClientVersionValidator and OMLayoutVersionValidator annotations.
Changes:
- Introduced version-based validator registration using
@RegisterValidatormeta-annotation - Replaced condition-based validation with version comparison logic in
ValidatorRegistry - Updated all validator usages across S3, key, file, and bucket request handlers
- Added support for both client version and layout version validators
- Implemented
IndexedItemsdata structure for efficient version-range lookups
Reviewed changes
Copilot reviewed 30 out of 30 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| ValidatorRegistry.java | Core refactoring to support version-based validator lookups with IndexedItems for efficient range queries |
| RequestValidations.java | Updated to extract versions from requests and lookup validators based on version ranges |
| ValidationCondition.java | Removed - replaced by version-based approach |
| RequestFeatureValidator.java | Removed - replaced by OMClientVersionValidator and OMLayoutVersionValidator |
| VersionExtractor.java | New enum to extract client and layout versions from OM requests |
| package-info.java | Updated documentation to reflect new version-based validation approach |
| Versioned.java | Added versionComparator() utility method |
| OzoneManagerRequestHandler.java | Updated validators to use OMClientVersionValidator |
| S3 multipart request handlers | Updated validators to use new annotations with explicit version parameters |
| Key/file/bucket request handlers | Updated validators to use new annotations with explicit version parameters |
| Test files | Updated tests to work with version-based validation logic |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| * applyBeforeVersion: Enum extending Version | ||
| * RequestType: Enum signifying the type of request. | ||
| * RequestProcessingPhase: Signifying if the validator is supposed to run pre or post submitting the request. | ||
| * Based on the afforementioned parameters a complete map is built which stores the validators in a sorted order of |
There was a problem hiding this comment.
Typo in "afforementioned". It should be "aforementioned".
| * Based on the afforementioned parameters a complete map is built which stores the validators in a sorted order of | |
| * Based on the aforementioned parameters a complete map is built which stores the validators in a sorted order of |
| return new EnumMap<>(RequestProcessingPhase.class); | ||
| } | ||
| /** | ||
| * Class responsible for maintaining indexs of items. Here each item should have an index corresponding to it. |
There was a problem hiding this comment.
Typo in the word "indexs". It should be "indexes" or "indices".
| * Class responsible for maintaining indexs of items. Here each item should have an index corresponding to it. | |
| * Class responsible for maintaining indexes of items. Here each item should have an index corresponding to it. |
| applyBefore = OMLayoutFeature.QUOTA, | ||
| processingPhase = PRE_PROCESS, | ||
| requestType = CreateVolume) | ||
| public static OMRequest multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( |
There was a problem hiding this comment.
Typo in the method name "multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| assertEquals(1, oldClientValidators.size()); | ||
| String expectedMethodName = "multiPurposePostProcessCreateVolumeValidator"; | ||
| assertEquals(1, combinedValidators.size()); | ||
| String expectedMethodName = "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"; |
There was a problem hiding this comment.
Typo in the expected method name "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| * @param item | ||
| * @param idx |
There was a problem hiding this comment.
Missing Javadoc for parameters. The add method should document what the item and idx parameters represent.
| * @param item | |
| * @param idx | |
| * @param item the item to add to this collection | |
| * @param idx the index associated with the item; indices must be provided in increasing order |
| public static OMRequest multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( | ||
| OMRequest req, ValidationContext ctx) { | ||
| fireValidationEvent("multiPurposePreProcessCreateVolumeValidator"); | ||
| fireValidationEvent("multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); |
There was a problem hiding this comment.
Typo in the method name "multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| requestType = CreateKey) | ||
| public static OMResponse oldClientPostProcessCreateKeyValidator2( | ||
| requestType = CreateVolume) | ||
| public static OMResponse multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( |
There was a problem hiding this comment.
Typo in the method name "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| public static OMResponse multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( | ||
| OMRequest req, OMResponse resp, ValidationContext ctx) { | ||
| fireValidationEvent("oldClientPostProcessCreateKeyValidator2"); | ||
| fireValidationEvent("multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); |
There was a problem hiding this comment.
Typo in the method name "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| assertEquals(1, preFinalizeValidators.size()); | ||
| assertEquals(1, newClientValidators.size()); | ||
| String expectedMethodName = "multiPurposePreProcessCreateVolumeValidator"; | ||
| String expectedMethodName = "multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"; |
There was a problem hiding this comment.
Typo in the expected method name "multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator". The word "CLient" should be "Client" (lowercase 'l').
| * | ||
| * The main reason to avoid validating multiple request types with the same | ||
| * validator, is that these validators have to be simple methods without state | ||
| * any complex validation has to happen in the reql request handling. |
There was a problem hiding this comment.
Typo in "reql". It should be "real".
| * any complex validation has to happen in the reql request handling. | |
| * any complex validation has to happen in the real request handling. |
|
This PR has been marked as stale due to 21 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in 7 days. |
|
This PR has been marked as stale due to 21 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in 7 days. |
What changes were proposed in this pull request?
Making changes to the ValidatorRegistry class to be able to pull the validators registered and inturn being able to get all the underlying validator methods based on the usage of the registered feature validator based on a specified version, request processing phase and request type efficiently.
This is the last PR for completing the request validator fixes after breaking down
#6932 into smaller PRs
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-12983
How was this patch tested?
Adding unit tests