From 2fb399ca8a1decf5366718cdfbb5beffe10166e5 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 6 May 2025 16:43:08 -0400 Subject: [PATCH 1/9] HDDS-12983. Validator Registry Changes for Supporting Version based validations Change-Id: I939888c989eaec0a62884aa564e2f24a594122ef --- hadoop-hdds/client/pom.xml | 3 +- hadoop-hdds/common/pom.xml | 3 +- hadoop-hdds/container-service/pom.xml | 3 +- hadoop-hdds/framework/pom.xml | 3 +- hadoop-hdds/server-scm/pom.xml | 3 +- hadoop-ozone/cli-admin/pom.xml | 3 +- hadoop-ozone/client/pom.xml | 3 +- hadoop-ozone/common/pom.xml | 3 +- .../request/validation/ValidatorRegistry.java | 313 ++++++++++++++++++ hadoop-ozone/csi/pom.xml | 3 +- hadoop-ozone/freon/pom.xml | 3 +- hadoop-ozone/insight/pom.xml | 3 +- hadoop-ozone/interface-storage/pom.xml | 3 +- .../request/bucket/OMBucketCreateRequest.java | 22 +- .../request/bucket/OMBucketDeleteRequest.java | 10 +- .../bucket/OMBucketSetPropertyRequest.java | 9 +- .../file/OMDirectoryCreateRequest.java | 17 +- .../om/request/file/OMFileCreateRequest.java | 17 +- .../request/key/OMAllocateBlockRequest.java | 17 +- .../om/request/key/OMKeyCommitRequest.java | 27 +- .../om/request/key/OMKeyCreateRequest.java | 17 +- .../om/request/key/OMKeyDeleteRequest.java | 10 +- .../om/request/key/OMKeyRenameRequest.java | 10 +- .../om/request/key/OMKeysDeleteRequest.java | 10 +- .../om/request/key/OMKeysRenameRequest.java | 10 +- .../request/key/acl/OMKeyAddAclRequest.java | 10 +- .../key/acl/OMKeyRemoveAclRequest.java | 10 +- .../request/key/acl/OMKeySetAclRequest.java | 12 +- .../S3InitiateMultipartUploadRequest.java | 17 +- .../S3MultipartUploadAbortRequest.java | 17 +- .../S3MultipartUploadCommitPartRequest.java | 17 +- .../S3MultipartUploadCompleteRequest.java | 17 +- .../validation/OMClientVersionValidator.java | 1 + .../validation/RequestFeatureValidator.java | 100 ------ .../validation/RequestValidations.java | 39 ++- .../validation/ValidationCondition.java | 56 ---- .../request/validation/ValidatorRegistry.java | 197 ----------- .../om/request/validation/package-info.java | 34 +- .../OzoneManagerRequestHandler.java | 76 ++--- .../validation/TestRequestValidations.java | 44 ++- .../validation/TestValidatorRegistry.java | 172 ++++++---- .../GeneralValidatorsForTesting.java | 103 +++--- ...ValidatorsForOnlyOldClientValidations.java | 12 +- hadoop-ozone/recon-codegen/pom.xml | 3 +- hadoop-ozone/recon/pom.xml | 3 +- hadoop-ozone/s3gateway/pom.xml | 3 +- hadoop-ozone/tools/pom.xml | 3 +- pom.xml | 3 +- 48 files changed, 781 insertions(+), 693 deletions(-) create mode 100644 hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java delete mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestFeatureValidator.java delete mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidationCondition.java delete mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java diff --git a/hadoop-hdds/client/pom.xml b/hadoop-hdds/client/pom.xml index bdde78b96a13..ba8cceb9dbf4 100644 --- a/hadoop-hdds/client/pom.xml +++ b/hadoop-hdds/client/pom.xml @@ -140,7 +140,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-hdds/common/pom.xml b/hadoop-hdds/common/pom.xml index 1ce793305800..c8306745116e 100644 --- a/hadoop-hdds/common/pom.xml +++ b/hadoop-hdds/common/pom.xml @@ -302,7 +302,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-hdds/container-service/pom.xml b/hadoop-hdds/container-service/pom.xml index 1c9ae070114a..b0852eae2b0a 100644 --- a/hadoop-hdds/container-service/pom.xml +++ b/hadoop-hdds/container-service/pom.xml @@ -264,7 +264,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-hdds/framework/pom.xml b/hadoop-hdds/framework/pom.xml index eae071e3f4db..9e0b5c010905 100644 --- a/hadoop-hdds/framework/pom.xml +++ b/hadoop-hdds/framework/pom.xml @@ -345,7 +345,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.kohsuke.MetaInfServices diff --git a/hadoop-hdds/server-scm/pom.xml b/hadoop-hdds/server-scm/pom.xml index 3aab12b3cfbb..4951581cf04d 100644 --- a/hadoop-hdds/server-scm/pom.xml +++ b/hadoop-hdds/server-scm/pom.xml @@ -267,7 +267,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/cli-admin/pom.xml b/hadoop-ozone/cli-admin/pom.xml index 70babe687c13..b1df7847e65d 100644 --- a/hadoop-ozone/cli-admin/pom.xml +++ b/hadoop-ozone/cli-admin/pom.xml @@ -180,7 +180,8 @@ org.apache.hadoop.hdds.conf.Config org.apache.hadoop.hdds.conf.ConfigGroup org.apache.hadoop.hdds.scm.metadata.Replicate - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator diff --git a/hadoop-ozone/client/pom.xml b/hadoop-ozone/client/pom.xml index 98cf6ccd95be..f0d4a08cdcd9 100644 --- a/hadoop-ozone/client/pom.xml +++ b/hadoop-ozone/client/pom.xml @@ -149,7 +149,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/common/pom.xml b/hadoop-ozone/common/pom.xml index bb1d76d1b39c..165cf1156cef 100644 --- a/hadoop-ozone/common/pom.xml +++ b/hadoop-ozone/common/pom.xml @@ -237,7 +237,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java new file mode 100644 index 000000000000..f13bacc1317d --- /dev/null +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java @@ -0,0 +1,313 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.request.validation; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.hadoop.ozone.Versioned; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; + +/** + * Registry that loads and stores the request validators to be applied by + * a service. + */ +public class ValidatorRegistry> { + + /** + * A validator registered should have the following parameters: + * 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 + * the applyBeforeVersion value of the validator method. + * Thus when a request comes with a certain version value, all validators containing `applyBeforeVersion` parameter + * greater than the request versions get triggered. + * {@link #validationsFor(Enum, RequestProcessingPhase, Class, Versioned)} + */ + private final Map, EnumMap>>> indexedValidatorMap; + + /** + * Creates a {@link ValidatorRegistry} instance that discovers validation + * methods in the provided package and the packages in the same resource. + * A validation method is recognized by all the annotations classes which + * are annotated by {@link RegisterValidator} annotation that contains + * important information about how and when to use the validator. + * @param requestType class of request type enum. + * @param validatorPackage the main package inside which validatiors should + * be discovered. + * @param allowedValidators a set containing the various types of version allowed to be registered. + * @param allowedProcessingPhases set of request processing phases which would be allowed to be registered to + * registry. + * + */ + public ValidatorRegistry(Class requestType, + String validatorPackage, + Set> allowedValidators, + Set allowedProcessingPhases) { + this(requestType, ClasspathHelper.forPackage(validatorPackage), allowedValidators, allowedProcessingPhases); + } + + /** + * Creates a {@link ValidatorRegistry} instance that discovers validation + * methods under the provided URL. + * A validation method is recognized by all annotations annotated by the {@link RegisterValidator} + * annotation that contains important information about how and when to use + * the validator. + * @param requestType class of request type enum. + * @param searchUrls the path in which the annotated methods are searched. + * @param allowedValidators a set containing the various types of validator annotation allowed to be registered. + * @param allowedProcessingPhases set of request processing phases which would be allowed to be registered to + * registry. + */ + public ValidatorRegistry(Class requestType, + Collection searchUrls, + Set> allowedValidators, + Set allowedProcessingPhases) { + Class requestArrayClass = (Class) Array.newInstance(requestType, 0) + .getClass(); + Set> validatorsToBeRegistered = + new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage("org.apache.hadoop")) + .setScanners(Scanners.TypesAnnotated) + .setParallel(true)).getTypesAnnotatedWith(RegisterValidator.class).stream() + .filter(allowedValidators::contains) + .filter(annotationClass -> getReturnTypeOfAnnotationMethod((Class) annotationClass, + RegisterValidator.REQUEST_TYPE_METHOD_NAME) + .equals(requestArrayClass)) + .map(annotationClass -> (Class) annotationClass) + .collect(Collectors.toSet()); + this.indexedValidatorMap = allowedValidators.stream().collect(ImmutableMap.toImmutableMap(Function.identity(), + validatorClass -> new EnumMap<>(requestType))); + Reflections reflections = new Reflections(new ConfigurationBuilder() + .setUrls(searchUrls) + .setScanners(Scanners.MethodsAnnotated) + .setParallel(true) + ); + initMaps(requestArrayClass, allowedProcessingPhases, validatorsToBeRegistered, reflections); + } + + /** + * Get the validators that has to be run in the given list of, + * for the given requestType and for the given request versions. + * {@link RequestProcessingPhase}. + * + * @param requestType the type of the protocol message + * @param phase the request processing phase + * @param requestVersions different versions extracted from the request. + * @return the list of validation methods that has to run. + */ + public List validationsFor(RequestType requestType, + RequestProcessingPhase phase, + Map, ? extends Versioned> requestVersions) { + return requestVersions.entrySet().stream() + .flatMap(requestVersion -> this.validationsFor(requestType, phase, requestVersion.getKey(), + requestVersion.getValue()).stream()) + .distinct().collect(Collectors.toList()); + } + + /** + * Get the validators that has to be run in the given list of, + * for the given requestType and for the given request versions. + * {@link RequestProcessingPhase}. + * + * @param requestType the type of the protocol message + * @param phase the request processing phase + * @param requestVersion version extracted corresponding to the request. + * @return the list of validation methods that has to run. + */ + public List validationsFor(RequestType requestType, + RequestProcessingPhase phase, + Class validatorClass, + V requestVersion) { + + return Optional.ofNullable(this.indexedValidatorMap.get(requestVersion.getClass())) + .map(requestTypeMap -> requestTypeMap.get(requestType)) + .map(phaseMap -> phaseMap.get(phase)) + .map(indexedMethods -> requestVersion.version() < 0 ? + indexedMethods.getItemsEqualToIdx(requestVersion.version()) : + indexedMethods.getItemsGreaterThanIdx(requestVersion.version())) + .orElse(Collections.emptyList()); + + } + + /** + * Calls a specified method on the validator. + * @Throws IllegalArgumentException when the specified method in the validator is invalid. + */ + private ReturnValue callAnnotationMethod( + Validator validator, String methodName, Class returnValueType) { + try { + return (ReturnValue) validator.getClass().getMethod(methodName).invoke(validator); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("Method " + methodName + " not found in class:" + + validator.getClass().getCanonicalName(), e); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new IllegalArgumentException("Error while invoking Method " + methodName + " from " + + validator.getClass().getCanonicalName(), e); + } + } + + private Class getReturnTypeOfAnnotationMethod(Class clzz, String methodName) { + try { + return clzz.getMethod(methodName).getReturnType(); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("Method " + methodName + " not found in class:" + clzz.getCanonicalName()); + } + } + + private Versioned getApplyBeforeVersion(Validator validator) { + return callAnnotationMethod(validator, RegisterValidator.APPLY_BEFORE_METHOD_NAME, Versioned.class); + } + + private RequestProcessingPhase getRequestPhase(Validator validator) { + return callAnnotationMethod(validator, RegisterValidator.PROCESSING_PHASE_METHOD_NAME, + RequestProcessingPhase.class); + } + + private RequestType[] getRequestType(Validator validator, + Class requestType) { + return callAnnotationMethod(validator, RegisterValidator.REQUEST_TYPE_METHOD_NAME, requestType); + } + + private void checkAllowedAnnotationValues(Set values, V value, String valueName, String methodName) { + if (!values.contains(value)) { + throw new IllegalArgumentException( + String.format("Invalid %1$s defined at annotation defined for method : %2$s, Annotation value : %3$s " + + "Allowed versionType: %4$s", valueName, methodName, value.toString(), values)); + } + } + + /** + * Initializes the internal request validator store. + * The requests are stored in the following structure: + * - An EnumMap with the RequestType as the key, and in which + * - values are an EnumMap with the request processing phase as the key, and in which + * - values is an {@link IndexedItems } containing the validation list + * @param validatorsToBeRegistered collection of the annotated validtors to process. + */ + private void initMaps(Class requestType, + Set allowedPhases, + Collection> validatorsToBeRegistered, + Reflections reflections) { + for (Class validator : validatorsToBeRegistered) { + registerValidator(requestType, allowedPhases, validator, reflections); + } + } + + private void registerValidator(Class requestType, + Set allowedPhases, + Class validatorToBeRegistered, + Reflections reflections) { + Collection methods = reflections.getMethodsAnnotatedWith(validatorToBeRegistered); + List> sortedMethodsByApplyBeforeVersion = methods.stream() + .map(method -> Pair.of(method.getAnnotation(validatorToBeRegistered), method)) + .sorted((validatorMethodPair1, validatorMethodPair2) -> + Integer.compare( + this.getApplyBeforeVersion(validatorMethodPair1.getKey()).version(), + this.getApplyBeforeVersion(validatorMethodPair2.getKey()).version())) + .collect(Collectors.toList()); + for (Pair validatorMethodPair : sortedMethodsByApplyBeforeVersion) { + Annotation validator = validatorMethodPair.getKey(); + Method method = validatorMethodPair.getValue(); + Versioned applyBeforeVersion = this.getApplyBeforeVersion(validator); + RequestProcessingPhase phase = this.getRequestPhase(validator); + checkAllowedAnnotationValues(allowedPhases, phase, RegisterValidator.PROCESSING_PHASE_METHOD_NAME, + method.getName()); + Set types = Sets.newHashSet(this.getRequestType(validator, requestType)); + method.setAccessible(true); + for (RequestType type : types) { + EnumMap>> requestMap = + this.indexedValidatorMap.get(validatorToBeRegistered); + EnumMap> phaseMap = + requestMap.computeIfAbsent(type, k -> new EnumMap<>(RequestProcessingPhase.class)); + phaseMap.computeIfAbsent(phase, k -> new IndexedItems<>()).add(method, applyBeforeVersion.version()); + } + } + } + + /** + * Class responsible for maintaining indexs of items. Here each item should have an index corresponding to it. + * The class implements functions for efficiently fetching range gets on the items added to the data structure. + * @param Refers to the Type of the item in the data structure + * @param Type of the index of an item added in the data structure. It is important that the index is + * comparable to each other. + */ + private static final class IndexedItems> { + private final List items; + private final TreeMap indexMap; + + private IndexedItems() { + this.items = new ArrayList<>(); + this.indexMap = new TreeMap<>(); + } + + /** + * Add an item to the collection and update index if required. The order of items added should have their index + * sorted in increasing order. + * @param item + * @param idx + */ + public void add(T item, IDX idx) { + indexMap.putIfAbsent(idx, items.size()); + items.add(item); + } + + /** + * @param indexValue Given index value. + * @return All the items which has an index value greater than given index value. + */ + public List getItemsGreaterThanIdx(IDX indexValue) { + return Optional.ofNullable(indexMap.higherEntry(indexValue)) + .map(Map.Entry::getValue) + .map(startIndex -> items.subList(startIndex, items.size())).orElse(Collections.emptyList()); + } + + /** + * @param indexValue Given index value. + * @return All the items which has an index value greater than given index value. + */ + public List getItemsEqualToIdx(IDX indexValue) { + return Optional.ofNullable(indexMap.get(indexValue)) + .map(startIndex -> items.subList(startIndex, Optional.ofNullable(indexMap.higherEntry(indexValue)) + .map(Map.Entry::getValue).orElse(items.size()))) + .orElse(Collections.emptyList()); + } + + } + +} diff --git a/hadoop-ozone/csi/pom.xml b/hadoop-ozone/csi/pom.xml index 6100ed160132..39297893f9da 100644 --- a/hadoop-ozone/csi/pom.xml +++ b/hadoop-ozone/csi/pom.xml @@ -257,7 +257,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/freon/pom.xml b/hadoop-ozone/freon/pom.xml index 4c175593e8c1..04eaa4c47057 100644 --- a/hadoop-ozone/freon/pom.xml +++ b/hadoop-ozone/freon/pom.xml @@ -261,7 +261,8 @@ org.apache.hadoop.hdds.conf.Config org.apache.hadoop.hdds.conf.ConfigGroup org.apache.hadoop.hdds.scm.metadata.Replicate - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator diff --git a/hadoop-ozone/insight/pom.xml b/hadoop-ozone/insight/pom.xml index 304bc958e482..178f0c4ec330 100644 --- a/hadoop-ozone/insight/pom.xml +++ b/hadoop-ozone/insight/pom.xml @@ -150,7 +150,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/interface-storage/pom.xml b/hadoop-ozone/interface-storage/pom.xml index 3a27e56c903b..98434756a3f4 100644 --- a/hadoop-ozone/interface-storage/pom.xml +++ b/hadoop-ozone/interface-storage/pom.xml @@ -106,7 +106,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java index 0ac5f5094077..a1d6bbf27b30 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java @@ -53,8 +53,8 @@ import org.apache.hadoop.ozone.om.helpers.OzoneAclUtil; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.OMBucketCreateResponse; @@ -397,10 +397,10 @@ public boolean checkQuotaBytesValid(OMMetadataManager metadataManager, } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket + requestType = Type.CreateBucket, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCreateBucketWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -420,10 +420,10 @@ public static OMRequest disallowCreateBucketWithECReplicationConfig( return req; } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket + requestType = Type.CreateBucket, + applyBefore = OMLayoutFeature.BUCKET_LAYOUT_SUPPORT ) public static OMRequest handleCreateBucketWithBucketLayoutDuringPreFinalize( OMRequest req, ValidationContext ctx) throws OMException { @@ -461,10 +461,10 @@ public static OMRequest handleCreateBucketWithBucketLayoutDuringPreFinalize( * write to them, instead of using the server default which may be in a layout * they do not understand. */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket + requestType = Type.CreateBucket, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest setDefaultBucketLayoutForOlderClients(OMRequest req, ValidationContext ctx) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java index bdc1b0455c48..64524d845ce9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java @@ -30,6 +30,7 @@ import org.apache.hadoop.hdds.utils.db.TableIterator; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; @@ -45,8 +46,7 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.OMBucketDeleteResponse; @@ -273,10 +273,10 @@ private boolean bucketContainsSnapshotInCache( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteBucket + requestType = Type.DeleteBucket, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockBucketDeleteWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java index ee65009e95ff..5c815ee5b66c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java @@ -44,8 +44,7 @@ import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.OMBucketSetPropertyResponse; @@ -352,10 +351,10 @@ public boolean checkQuotaNamespaceValid(OmVolumeArgs omVolumeArgs, return true; } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.SetBucketProperty + requestType = Type.SetBucketProperty, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowSetBucketPropertyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { 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 311017bed1b3..27c7b770c0b9 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 java.nio.file.Paths; import java.util.List; import java.util.Map; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -43,8 +44,8 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.file.OMDirectoryCreateResponse; @@ -262,10 +263,10 @@ private void logResult(CreateDirectoryRequest createDirectoryRequest, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateDirectory + requestType = Type.CreateDirectory, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCreateDirectoryWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -295,10 +296,10 @@ public static OMRequest disallowCreateDirectoryWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateDirectory + requestType = Type.CreateDirectory, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockCreateDirectoryWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java index 1d65363463a8..e1ece9f23de6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList; import org.apache.hadoop.hdds.utils.UniqueId; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -50,8 +51,8 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.file.OMFileCreateResponse; @@ -381,10 +382,10 @@ protected void checkAllParentsExist(KeyArgs keyArgs, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = CreateFile + requestType = CreateFile, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCreateFileWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -413,10 +414,10 @@ public static OMRequest disallowCreateFileWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateFile + requestType = Type.CreateFile, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockCreateFileWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java index a6938073983f..cda50bc31327 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; @@ -45,8 +46,8 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo; import org.apache.hadoop.ozone.om.helpers.QuotaUtil; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMAllocateBlockResponse; @@ -274,10 +275,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut return omClientResponse; } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AllocateBlock + requestType = Type.AllocateBlock, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowAllocateBlockWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -304,10 +305,10 @@ public static OMRequest disallowAllocateBlockWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AllocateBlock + requestType = Type.AllocateBlock, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockAllocateBlockWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java index 09d010856b32..68bc560b645f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.OzoneManagerVersion; import org.apache.hadoop.ozone.audit.AuditLogger; @@ -53,8 +54,8 @@ import org.apache.hadoop.ozone.om.helpers.WithMetadata; import org.apache.hadoop.ozone.om.request.util.OmKeyHSyncUtil; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeyCommitResponse; @@ -489,10 +490,10 @@ protected void processResult(CommitKeyRequest commitKeyRequest, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey + requestType = Type.CommitKey, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCommitKeyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -519,10 +520,10 @@ public static OMRequest disallowCommitKeyWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey + requestType = Type.CommitKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockCommitKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { @@ -538,10 +539,10 @@ public static OMRequest blockCommitKeyWithBucketLayoutFromOldClient( return req; } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey + requestType = Type.CommitKey, + applyBefore = OMLayoutFeature.HBASE_SUPPORT ) public static OMRequest disallowHsync( OMRequest req, ValidationContext ctx) throws OMException { @@ -571,8 +572,8 @@ public static OMRequest disallowHsync( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.HBASE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, requestType = Type.CommitKey ) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java index 8874fc4f582b..40468ff75051 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java @@ -33,6 +33,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList; import org.apache.hadoop.hdds.utils.UniqueId; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneManagerVersion; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -48,8 +49,8 @@ import org.apache.hadoop.ozone.om.lock.OzoneLockStrategy; import org.apache.hadoop.ozone.om.request.file.OMFileRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeyCreateResponse; @@ -387,10 +388,10 @@ protected void logResult(CreateKeyRequest createKeyRequest, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateKey + requestType = Type.CreateKey, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCreateKeyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -417,10 +418,10 @@ public static OMRequest disallowCreateKeyWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateKey + requestType = Type.CreateKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockCreateKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java index cf3b675f345c..90f10066ec6b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; @@ -43,8 +44,7 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeyDeleteResponse; @@ -243,10 +243,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteKey + requestType = Type.DeleteKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockDeleteKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java index 3af8c7420be5..5624365d61ee 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; @@ -38,8 +39,7 @@ import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeyRenameResponse; @@ -255,10 +255,10 @@ private Map buildAuditMap( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RenameKey + requestType = Type.RenameKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockRenameKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java index 71f209bc32e5..a389717e5c0e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java @@ -42,6 +42,7 @@ import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -57,8 +58,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.OzoneFileStatus; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeysDeleteResponse; @@ -375,10 +375,10 @@ protected static void addDeletedKeys(Map auditMap, * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteKeys + requestType = Type.DeleteKeys, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockDeleteKeysWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java index 34c2bf3a7754..268adcc3ce04 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -46,8 +47,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.OmRenameKeys; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.OMKeysRenameResponse; @@ -294,10 +294,10 @@ private Map buildAuditMap(Map auditMap, * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RenameKeys + requestType = Type.RenameKeys, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockRenameKeysWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java index efd637bc64d0..6bb926aeab7a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; @@ -32,8 +33,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; @@ -161,10 +161,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AddAcl + requestType = Type.AddAcl, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockAddAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java index 6a64b2c3b515..2853eaa98f0b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; @@ -32,8 +33,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; @@ -162,10 +162,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RemoveAcl + requestType = Type.RemoveAcl, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockRemoveAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java index db133febabcb..28c3235602f8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java @@ -17,9 +17,11 @@ package org.apache.hadoop.ozone.om.request.key.acl; +import com.google.common.collect.Lists; import java.io.IOException; import java.util.List; import java.util.Map; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.AuditLogger; @@ -32,8 +34,7 @@ import org.apache.hadoop.ozone.om.helpers.OzoneAclUtil; import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; @@ -45,7 +46,6 @@ import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; import org.apache.hadoop.ozone.security.acl.OzoneObj; import org.apache.hadoop.ozone.security.acl.OzoneObjInfo; -import org.apache.hadoop.util.Lists; import org.apache.hadoop.util.Time; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,10 +158,10 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.SetAcl + requestType = Type.SetAcl, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockSetAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java index a87eb4ae5966..09429af62683 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hdds.client.ReplicationConfig; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -46,8 +47,8 @@ import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OMMultipartUploadUtils; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.multipart.S3InitiateMultipartUploadResponse; @@ -284,10 +285,10 @@ protected void logResult(OzoneManager ozoneManager, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.InitiateMultiPartUpload + requestType = Type.InitiateMultiPartUpload, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowInitiateMultiPartUploadWithECReplicationConfig( @@ -317,10 +318,10 @@ protected void logResult(OzoneManager ozoneManager, * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.InitiateMultiPartUpload + requestType = Type.InitiateMultiPartUpload, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockInitiateMPUWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java index fbff13045902..e3f1b0f9d23a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -38,8 +39,8 @@ import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OMMultipartUploadUtils; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.multipart.S3MultipartUploadAbortResponse; @@ -253,10 +254,10 @@ protected String getMultipartOpenKey(String multipartUploadID, getBucketLayout()); } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AbortMultiPartUpload + requestType = Type.AbortMultiPartUpload, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowAbortMultiPartUploadWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -284,10 +285,10 @@ public static OMRequest disallowAbortMultiPartUploadWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AbortMultiPartUpload + requestType = Type.AbortMultiPartUpload, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockMPUAbortWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java index 91e4b2030912..3cdc94ace939 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -41,8 +42,8 @@ import org.apache.hadoop.ozone.om.helpers.OmMultipartKeyInfo; import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.multipart.S3MultipartUploadCommitPartResponse; @@ -339,10 +340,10 @@ private String getMultipartKey(String volumeName, String bucketName, keyName, uploadID); } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitMultiPartUpload + requestType = Type.CommitMultiPartUpload, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCommitMultiPartUploadWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -370,10 +371,10 @@ public static OMRequest disallowCommitMultiPartUploadWithECReplicationConfig( * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitMultiPartUpload + requestType = Type.CommitMultiPartUpload, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockMPUCommitWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java index f1b88853c2d4..1e063989dd33 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java @@ -35,6 +35,7 @@ import org.apache.hadoop.hdds.client.ReplicationConfig; import org.apache.hadoop.hdds.utils.db.cache.CacheKey; import org.apache.hadoop.hdds.utils.db.cache.CacheValue; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; @@ -54,8 +55,8 @@ import org.apache.hadoop.ozone.om.request.file.OMFileRequest; import org.apache.hadoop.ozone.om.request.key.OMKeyRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.s3.multipart.S3MultipartUploadCompleteResponse; @@ -703,10 +704,10 @@ private void updateCache(OMMetadataManager omMetadataManager, } } - @RequestFeatureValidator( - conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION, + @OMLayoutVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CompleteMultiPartUpload + requestType = Type.CompleteMultiPartUpload, + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT ) public static OMRequest disallowCompleteMultiPartUploadWithECReplicationConfig( @@ -735,10 +736,10 @@ private void updateCache(OMMetadataManager omMetadataManager, * @return the validated request * @throws OMException if the request is invalid */ - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CompleteMultiPartUpload + requestType = Type.CompleteMultiPartUpload, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest blockMPUCompleteWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java index 015b67b47ddc..430c106b4d6e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java @@ -25,6 +25,7 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.request.validation.RegisterValidator; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; /** * An annotation to mark methods that do certain request validations based on the diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestFeatureValidator.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestFeatureValidator.java deleted file mode 100644 index 2aca1cf771b3..000000000000 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestFeatureValidator.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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.request.validation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; -import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; - -/** - * An annotation to mark methods that do certain request validations. - * - * The methods annotated with this annotation are collected by the - * {@link ValidatorRegistry} class during the initialization of the server. - * - * The conditions specify the specific use case in which the validator should be - * applied to the request. See {@link ValidationCondition} for more details - * on the specific conditions. - * The validator method should be applied to just one specific request type - * to help keep these methods simple and straightforward. If you want to use - * the same validation for different request types, use inheritance, and - * annotate the override method that just calls super. - * Note that the aim is to have these validators together with the request - * processing code, so the handling of these specific situations are easy to - * find. - * - * The annotated methods have to have a fixed signature. - * A {@link RequestProcessingPhase#PRE_PROCESS} phase method is running before - * the request is processed by the regular code. - * Its signature has to be the following: - * - it has to be static and idempotent - * - it has to have two parameters - * - the first parameter it is an - * {@link - * org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest} - * - the second parameter of type {@link ValidationContext} - * - the method has to return the modified request, or throw a ServiceException - * in case the request is considered to be invalid - * - the method does not need to care about preserving the request it gets, - * the original request is captured and saved by the calling environment. - * - * A {@link RequestProcessingPhase#POST_PROCESS} phase method is running once - * the - * {@link - * org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse} - * is calculated for a given request. - * Its signature has to be the following: - * - it has to be static and idempotent - * - it has three parameters - * - similalry to the pre-processing validators, first parameter is the - * OMRequest, the second parameter is the OMResponse, and the third - * parameter is a ValidationContext. - * - the method has to return the modified OMResponse or throw a - * ServiceException if the request is considered invalid based on response. - * - the method gets the request object that was supplied for the general - * request processing code, not the original request, while it gets a copy - * of the original response object provided by the general request processing - * code. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface RequestFeatureValidator { - - /** - * Runtime conditions in which a validator should run. - * @return a list of conditions when the validator should be applied - */ - ValidationCondition[] conditions(); - - /** - * Defines if the validation has to run before or after the general request - * processing. - * @return if this is a pre or post processing validator - */ - RequestProcessingPhase processingPhase(); - - /** - * The type of the request handled by this validator method. - * @return the requestType to whihc the validator shoudl be applied - */ - Type requestType(); - -} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java index a2be5a2d97cb..54da24e512de 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java @@ -20,15 +20,25 @@ import static org.apache.hadoop.ozone.request.validation.RequestProcessingPhase.POST_PROCESS; import static org.apache.hadoop.ozone.request.validation.RequestProcessingPhase.PRE_PROCESS; +import com.google.common.collect.Sets; import com.google.protobuf.ServiceException; +import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; +import org.apache.hadoop.ozone.Versioned; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; +import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; +import org.jgrapht.alg.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,10 +50,11 @@ public class RequestValidations { static final Logger LOG = LoggerFactory.getLogger(RequestValidations.class); private static final String DEFAULT_PACKAGE = "org.apache.hadoop.ozone"; - + private static final Set ALLOWED_REQUEST_PROCESSING_PHASES = + Sets.immutableEnumSet(PRE_PROCESS, POST_PROCESS); private String validationsPackageName = DEFAULT_PACKAGE; private ValidationContext context = null; - private ValidatorRegistry registry = null; + private ValidatorRegistry registry = null; public synchronized RequestValidations fromPackage(String packageName) { validationsPackageName = packageName; @@ -56,15 +67,17 @@ public RequestValidations withinContext(ValidationContext validationContext) { } public synchronized RequestValidations load() { - registry = new ValidatorRegistry(validationsPackageName); + registry = new ValidatorRegistry<>(Type.class, validationsPackageName, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + ALLOWED_REQUEST_PROCESSING_PHASES); return this; } public OMRequest validateRequest(OMRequest request) throws Exception { - List validations = registry.validationsFor( - conditions(request), request.getCmdType(), PRE_PROCESS); + List validations = registry.validationsFor(request.getCmdType(), PRE_PROCESS, + this.getVersions(request)); OMRequest validatedRequest = request; try { for (Method m : validations) { @@ -87,10 +100,10 @@ public OMRequest validateRequest(OMRequest request) public OMResponse validateResponse(OMRequest request, OMResponse response) throws ServiceException { - List validations = registry.validationsFor( - conditions(request), request.getCmdType(), POST_PROCESS); - OMResponse validatedResponse = response; + List validations = registry.validationsFor(request.getCmdType(), POST_PROCESS, this.getVersions(request)); + + OMResponse validatedResponse = response.toBuilder().build(); try { for (Method m : validations) { LOG.debug("Running the {} request post-process validation from {}.{}", @@ -105,9 +118,11 @@ public OMResponse validateResponse(OMRequest request, OMResponse response) return validatedResponse; } - private List conditions(OMRequest request) { - return Arrays.stream(ValidationCondition.values()) - .filter(c -> c.shouldApply(request, context)) - .collect(Collectors.toList()); + private Map, Versioned> getVersions(OMRequest request) { + return Arrays.stream(VersionExtractor.values()) + .map(versionExtractor -> Pair.of(versionExtractor.getValidatorClass(), + versionExtractor.extractVersion(request, context))) + .filter(pair -> Objects.nonNull(pair.getSecond())) + .collect(Collectors.toMap(pair -> pair.getFirst(), pair -> pair.getSecond())); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidationCondition.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidationCondition.java deleted file mode 100644 index 87f2188ea1e2..000000000000 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidationCondition.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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.request.validation; - -import org.apache.hadoop.ozone.ClientVersion; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; - -/** - * Defines conditions for which validators can be assigned to. - * - * These conditions describe a situation where special request handling might - * be necessary. In these cases we do not override the actual request handling - * code, but based on certain request properties we might reject a request - * early, or we might modify the request, or the response received/sent from/to - * the client. - */ -public enum ValidationCondition { - /** - * Classifies validations that has to run after an upgrade until the cluster - * is in a pre-finalized state. - */ - CLUSTER_NEEDS_FINALIZATION { - @Override - public boolean shouldApply(OMRequest req, ValidationContext ctx) { - return ctx.versionManager().needsFinalization(); - } - }, - - /** - * Classifies validations that has to run, when the client uses an older - * protocol version than the server. - */ - OLDER_CLIENT_REQUESTS { - @Override - public boolean shouldApply(OMRequest req, ValidationContext ctx) { - return req.getVersion() < ClientVersion.CURRENT_VERSION; - } - }; - - public abstract boolean shouldApply(OMRequest req, ValidationContext ctx); -} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java deleted file mode 100644 index ebc60aab7682..000000000000 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * 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 - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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.request.validation; - -import static org.apache.hadoop.ozone.request.validation.RequestProcessingPhase.POST_PROCESS; -import static org.apache.hadoop.ozone.request.validation.RequestProcessingPhase.PRE_PROCESS; - -import java.lang.reflect.Method; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Supplier; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; -import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; -import org.reflections.Reflections; -import org.reflections.scanners.Scanners; -import org.reflections.util.ClasspathHelper; -import org.reflections.util.ConfigurationBuilder; - -/** - * Registry that loads and stores the request validators to be applied by - * a service. - */ -public class ValidatorRegistry { - - private final EnumMap>>> - validators = new EnumMap<>(ValidationCondition.class); - - /** - * Creates a {@link ValidatorRegistry} instance that discovers validation - * methods in the provided package and the packages in the same resource. - * A validation method is recognized by the {@link RequestFeatureValidator} - * annotation that contains important information about how and when to use - * the validator. - * @param validatorPackage the main package inside which validatiors should - * be discovered. - */ - ValidatorRegistry(String validatorPackage) { - this(ClasspathHelper.forPackage(validatorPackage)); - } - - /** - * Creates a {@link ValidatorRegistry} instance that discovers validation - * methods under the provided URL. - * A validation method is recognized by the {@link RequestFeatureValidator} - * annotation that contains important information about how and when to use - * the validator. - * @param searchUrls the path in which the annotated methods are searched. - */ - ValidatorRegistry(Collection searchUrls) { - Reflections reflections = new Reflections(new ConfigurationBuilder() - .setUrls(searchUrls) - .setScanners(Scanners.MethodsAnnotated) - .setParallel(true) - ); - - Set describedValidators = - reflections.getMethodsAnnotatedWith(RequestFeatureValidator.class); - initMaps(describedValidators); - } - - /** - * Get the validators that has to be run in the given list of - * {@link ValidationCondition}s, for the given requestType and - * {@link RequestProcessingPhase}. - * - * @param conditions conditions that are present for the request - * @param requestType the type of the protocol message - * @param phase the request processing phase - * @return the list of validation methods that has to run. - */ - List validationsFor( - List conditions, - Type requestType, - RequestProcessingPhase phase) { - - if (conditions.isEmpty() || validators.isEmpty()) { - return Collections.emptyList(); - } - - Set returnValue = new HashSet<>(); - - for (ValidationCondition condition: conditions) { - returnValue.addAll(validationsFor(condition, requestType, phase)); - } - return new ArrayList<>(returnValue); - } - - /** - * Grabs validations for one particular condition. - * - * @param condition conditions that are present for the request - * @param requestType the type of the protocol message - * @param phase the request processing phase - * @return the list of validation methods that has to run. - */ - private List validationsFor( - ValidationCondition condition, - Type requestType, - RequestProcessingPhase phase) { - - EnumMap>> - requestTypeMap = validators.get(condition); - if (requestTypeMap == null || requestTypeMap.isEmpty()) { - return Collections.emptyList(); - } - - EnumMap> phases = - requestTypeMap.get(requestType); - if (phases == null) { - return Collections.emptyList(); - } - - List validatorsForPhase = phases.get(phase); - if (validatorsForPhase == null) { - return Collections.emptyList(); - } - return validatorsForPhase; - } - - /** - * Initializes the internal request validator store. - * The requests are stored in the following structure: - * - An EnumMap with the {@link ValidationCondition} as the key, and in which - * - values are an EnumMap with the request type as the key, and in which - * - values are Pair of lists, in which - * - left side is the pre-processing validations list - * - right side is the post-processing validations list - * @param describedValidators collection of the annotated methods to process. - */ - void initMaps(Collection describedValidators) { - for (Method m : describedValidators) { - RequestFeatureValidator descriptor = - m.getAnnotation(RequestFeatureValidator.class); - m.setAccessible(true); - - for (ValidationCondition condition : descriptor.conditions()) { - EnumMap>> - requestTypeMap = getAndInitialize( - condition, this::newTypeMap, validators); - EnumMap> phases = getAndInitialize( - descriptor.requestType(), this::newPhaseMap, requestTypeMap); - if (isPreProcessValidator(descriptor)) { - getAndInitialize(PRE_PROCESS, ArrayList::new, phases).add(m); - } else if (isPostProcessValidator(descriptor)) { - getAndInitialize(POST_PROCESS, ArrayList::new, phases).add(m); - } - } - } - } - - private EnumMap>> newTypeMap() { - return new EnumMap<>(Type.class); - } - - private EnumMap> newPhaseMap() { - return new EnumMap<>(RequestProcessingPhase.class); - } - - private V getAndInitialize(K key, Supplier defaultSupplier, Map from) { - return from.computeIfAbsent(key, k -> defaultSupplier.get()); - } - - private boolean isPreProcessValidator(RequestFeatureValidator descriptor) { - return descriptor.processingPhase() - .equals(PRE_PROCESS); - } - - private boolean isPostProcessValidator(RequestFeatureValidator descriptor) { - return descriptor.processingPhase() - .equals(POST_PROCESS); - } - -} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java index d3d70fe6ff76..cd3e65389b91 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java @@ -16,7 +16,7 @@ */ /** - * Request's feature validation handling. + * Request's validation handling. * * This package holds facilities to add new situation specific behaviour to * request handling without cluttering the basic logic of the request handler @@ -28,25 +28,29 @@ * request type * - a client connects to the server but uses an older version of the protocol * - a client connects to the server but uses a newer version of the protocol + * - a client connects to the server and performs an operation corresponding + * to a feature the server hasn't finalized for which these requests might have + * to be rejected. * - the code can handle certain checks that have to run all the time, but at * first we do not see a general use case that we would pull in immediately. - * These are the current - * {@link org.apache.hadoop.ozone.om.request.validation.ValidationCondition}s - * but this list might be extended later on if we see other use cases. + * These are the current registered + * {@link org.apache.hadoop.ozone.om.request.validation.VersionExtractor}s + * which would be extracted out of the om request and all validators + * fulfilling the condition would be run. * - * The system uses a reflection based discovery to find methods that are + * The system uses a reflection based discovery to find annotations that are * annotated with the - * {@link org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator} + * {@link org.apache.hadoop.ozone.request.validation.RegisterValidator} * annotation. - * This annotation is used to specify the condition in which a certain validator - * has to be used, the request type to which the validation should be applied, - * and the request processing phase in which we apply the validation. - * - * One validator can be applied in multiple - * {@link org.apache.hadoop.ozone.om.request.validation.ValidationCondition} - * but a validator has to handle strictly just one - * {@link org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type - * }. + * This annotation is used to register a particular annotation which in turn would be used to specify + * the request type to which the validation should be applied, + * and the request processing phase in which we apply the validation and the maxVersion corresponding to which this + * is supposed to run. + * + * 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} + * * 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. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java index bea7785bfbc2..f20cbd87bce8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java @@ -60,6 +60,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus; import org.apache.hadoop.hdds.scm.protocolPB.OzonePBHelper; import org.apache.hadoop.hdds.utils.FaultInjector; +import org.apache.hadoop.ozone.ClientVersion; import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.OzoneManagerPrepareState; @@ -94,8 +95,7 @@ import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; -import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.upgrade.DisallowedUntilLayoutVersion; @@ -657,10 +657,10 @@ private GetKeyInfoResponse getKeyInfo(GetKeyInfoRequest request, return keyInfo.toProtobuf(clientVersion); } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupKey + requestType = Type.LookupKey, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowLookupKeyResponseWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -684,10 +684,10 @@ public static OMResponse disallowLookupKeyResponseWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupKey + requestType = Type.LookupKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowLookupKeyWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -771,10 +771,10 @@ private ListKeysLightResponse listKeysLight(ListKeysRequest request) return resp.build(); } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListKeys + requestType = Type.ListKeys, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowListKeysResponseWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -798,10 +798,10 @@ public static OMResponse disallowListKeysResponseWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListKeys + requestType = Type.ListKeys, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowListKeysWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -839,10 +839,10 @@ public static OMResponse disallowListKeysWithBucketLayout( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListTrash + requestType = Type.ListTrash, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowListTrashWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -869,10 +869,10 @@ public static OMResponse disallowListTrashWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListTrash + requestType = Type.ListTrash, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowListTrashWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1085,10 +1085,10 @@ private RefetchSecretKeyResponse refetchSecretKey() { return response; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.GetFileStatus + requestType = Type.GetFileStatus, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowGetFileStatusWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1114,10 +1114,10 @@ public static OMResponse disallowGetFileStatusWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.GetFileStatus + requestType = Type.GetFileStatus, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowGetFileStatusWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1163,10 +1163,10 @@ private LookupFileResponse lookupFile(LookupFileRequest request, .build(); } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupFile + requestType = Type.LookupFile, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowLookupFileWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1191,10 +1191,10 @@ public static OMResponse disallowLookupFileWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupFile + requestType = Type.LookupFile, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowLookupFileWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1273,10 +1273,10 @@ private ListStatusLightResponse listStatusLight( return listStatusLightResponseBuilder.build(); } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListStatus + requestType = Type.ListStatus, + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT ) public static OMResponse disallowListStatusResponseWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1301,10 +1301,10 @@ public static OMResponse disallowListStatusResponseWithECReplicationConfig( return resp; } - @RequestFeatureValidator( - conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + @OMClientVersionValidator( processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListStatus + requestType = Type.ListStatus, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMResponse disallowListStatusResponseWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java index dca87f88733c..14c063124609 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java @@ -27,6 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -40,6 +42,7 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.request.validation.testvalidatorset1.GeneralValidatorsForTesting; import org.apache.hadoop.ozone.om.request.validation.testvalidatorset1.GeneralValidatorsForTesting.ValidationListener; +import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; @@ -159,7 +162,7 @@ public void testPreProcessorExceptionHandling() throws Exception { ValidationContext ctx = of(aFinalizedVersionManager(), metadataManager); RequestValidations validations = loadValidations(ctx); assertThrows(Exception.class, - () -> validations.validateRequest(aDeleteKeysRequest(olderClientVersion()))); + () -> validations.validateRequest(aDeleteKeysRequest(ClientVersion.ERASURE_CODING_SUPPORT))); validationListener.assertNumOfEvents(1); validationListener.assertExactListOfValidatorsCalled( @@ -171,7 +174,8 @@ public void testPostProcessorExceptionHandling() { ValidationContext ctx = of(aFinalizedVersionManager(), metadataManager); RequestValidations validations = loadValidations(ctx); assertThrows(Exception.class, - () -> validations.validateResponse(aDeleteKeysRequest(olderClientVersion()), aDeleteKeysResponse())); + () -> validations.validateResponse(aDeleteKeysRequest(ClientVersion.ERASURE_CODING_SUPPORT), + aDeleteKeysResponse())); validationListener.assertNumOfEvents(1); validationListener.assertExactListOfValidatorsCalled( @@ -184,11 +188,11 @@ public void testOldClientConditionIsRecognizedAndPreValidatorsApplied() ValidationContext ctx = of(aFinalizedVersionManager(), metadataManager); RequestValidations validations = loadValidations(ctx); - validations.validateRequest(aCreateKeyRequest(olderClientVersion())); + validations.validateRequest(aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT)); validationListener.assertNumOfEvents(1); validationListener.assertExactListOfValidatorsCalled( - "oldClientPreProcessCreateKeyValidator"); + "preProcessCreateKeyBucketLayoutClientValidator"); } @Test @@ -198,12 +202,12 @@ public void testOldClientConditionIsRecognizedAndPostValidatorsApplied() RequestValidations validations = loadValidations(ctx); validations.validateResponse( - aCreateKeyRequest(olderClientVersion()), aCreateKeyResponse()); + aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT), aCreateKeyResponse()); validationListener.assertNumOfEvents(2); validationListener.assertExactListOfValidatorsCalled( - "oldClientPostProcessCreateKeyValidator", - "oldClientPostProcessCreateKeyValidator2"); + "postProcessCreateKeyBucketLayoutClientValidator", + "postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } @Test @@ -212,12 +216,12 @@ public void testPreFinalizedWithOldClientConditionPreProcValidatorsApplied() ValidationContext ctx = of(anUnfinalizedVersionManager(), metadataManager); RequestValidations validations = loadValidations(ctx); - validations.validateRequest(aCreateKeyRequest(olderClientVersion())); + validations.validateRequest(aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT)); validationListener.assertNumOfEvents(2); validationListener.assertExactListOfValidatorsCalled( - "preFinalizePreProcessCreateKeyValidator", - "oldClientPreProcessCreateKeyValidator"); + "preProcessCreateKeyQuotaLayoutValidator", + "preProcessCreateKeyBucketLayoutClientValidator"); } @Test @@ -227,13 +231,13 @@ public void testPreFinalizedWithOldClientConditionPostProcValidatorsApplied() RequestValidations validations = loadValidations(ctx); validations.validateResponse( - aCreateKeyRequest(olderClientVersion()), aCreateKeyResponse()); + aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT), aCreateKeyResponse()); validationListener.assertNumOfEvents(3); validationListener.assertExactListOfValidatorsCalled( - "preFinalizePostProcessCreateKeyValidator", - "oldClientPostProcessCreateKeyValidator", - "oldClientPostProcessCreateKeyValidator2"); + "postProcessCreateKeyQuotaLayoutValidator", + "postProcessCreateKeyBucketLayoutClientValidator", + "postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } /** @@ -295,6 +299,14 @@ private OMRequest aCreateKeyRequest(int clientVersion) { return aRequest(CreateKey, clientVersion); } + private OMRequest aCreateKeyRequest(ClientVersion clientVersion) { + return aRequest(CreateKey, clientVersion.toProtoValue()); + } + + private OMRequest aDeleteKeysRequest(ClientVersion clientVersion) { + return aDeleteKeysRequest(clientVersion.toProtoValue()); + } + private OMRequest aDeleteKeysRequest(int clientVersion) { return aRequest(DeleteKeys, clientVersion); } @@ -333,12 +345,16 @@ private OMResponse aResponse(Type type) { private LayoutVersionManager aFinalizedVersionManager() { LayoutVersionManager vm = mock(LayoutVersionManager.class); when(vm.needsFinalization()).thenReturn(false); + when(vm.getFeature(anyString())).thenReturn(OMLayoutFeature.QUOTA); + when(vm.getFeature(anyInt())).thenReturn(OMLayoutFeature.QUOTA); return vm; } private LayoutVersionManager anUnfinalizedVersionManager() { LayoutVersionManager vm = mock(LayoutVersionManager.class); when(vm.needsFinalization()).thenReturn(true); + when(vm.getFeature(anyString())).thenReturn(OMLayoutFeature.HSYNC); + when(vm.getFeature(anyInt())).thenReturn(OMLayoutFeature.HSYNC); return vm; } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java index db37843b837d..7bca78fb8e0e 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java @@ -17,10 +17,8 @@ package org.apache.hadoop.ozone.om.request.validation; -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static org.apache.hadoop.ozone.om.request.validation.ValidationCondition.CLUSTER_NEEDS_FINALIZATION; -import static org.apache.hadoop.ozone.om.request.validation.ValidationCondition.OLDER_CLIENT_REQUESTS; +import static org.apache.hadoop.ozone.om.request.validation.VersionExtractor.CLIENT_VERSION_EXTRACTOR; +import static org.apache.hadoop.ozone.om.request.validation.VersionExtractor.LAYOUT_VERSION_EXTRACTOR; import static org.apache.hadoop.ozone.om.request.validation.testvalidatorset1.GeneralValidatorsForTesting.finishValidatorTest; import static org.apache.hadoop.ozone.om.request.validation.testvalidatorset1.GeneralValidatorsForTesting.startValidatorTest; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateDirectory; @@ -32,13 +30,22 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -59,6 +66,9 @@ public class TestValidatorRegistry { private static final String PACKAGE_WO_VALIDATORS = "org.apache.hadoop.hdds.annotation"; + private static final Set REQUEST_PROCESSING_PHASES = + Sets.immutableEnumSet(PRE_PROCESS, POST_PROCESS); + @BeforeEach public void setup() { startValidatorTest(); @@ -71,121 +81,148 @@ public void tearDown() { @Test public void testNoValidatorsReturnedForEmptyConditionList() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); - List validators = - registry.validationsFor(emptyList(), CreateKey, PRE_PROCESS); + ValidatorRegistry registry = + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass) + .collect(Collectors.toSet()), REQUEST_PROCESSING_PHASES); + List validators = registry.validationsFor(CreateKey, PRE_PROCESS, + CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT); assertTrue(validators.isEmpty()); } @Test public void testRegistryHasThePreFinalizePreProcessCreateKeyValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); List validators = - registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION), CreateKey, PRE_PROCESS); + registry.validationsFor(CreateKey, PRE_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT, + LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.FILESYSTEM_SNAPSHOT)); assertEquals(1, validators.size()); - String expectedMethodName = "preFinalizePreProcessCreateKeyValidator"; + String expectedMethodName = "preProcessCreateKeyQuotaLayoutValidator"; assertEquals(expectedMethodName, validators.get(0).getName()); } @Test public void testRegistryHasThePreFinalizePostProcessCreateKeyValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); - List validators = - registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION), CreateKey, POST_PROCESS); + ValidatorRegistry registry = + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + List validators = registry.validationsFor(CreateKey, POST_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT, + LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.BUCKET_LAYOUT_SUPPORT)); assertEquals(1, validators.size()); - String expectedMethodName = "preFinalizePostProcessCreateKeyValidator"; + String expectedMethodName = "postProcessCreateKeyQuotaLayoutValidator"; assertEquals(expectedMethodName, validators.get(0).getName()); } @Test public void testRegistryHasTheOldClientPreProcessCreateKeyValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); + ValidatorRegistry registry = + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); List validators = - registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateKey, PRE_PROCESS); + registry.validationsFor(CreateKey, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(2, validators.size()); List methodNames = validators.stream().map(Method::getName).collect(Collectors.toList()); - assertThat(methodNames).contains("oldClientPreProcessCreateKeyValidator"); - assertThat(methodNames).contains("oldClientPreProcessCreateKeyValidator2"); + assertEquals(Arrays.asList("preProcessCreateKeyBucketLayoutClientValidator", + "preProcessCreateKeyBucketLayoutClientValidator"), methodNames); } @Test public void testRegistryHasTheOldClientPostProcessCreateKeyValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); - List validators = - registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateKey, POST_PROCESS); + ValidatorRegistry registry = + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + List validators = registry.validationsFor(CreateKey, POST_PROCESS, + CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(2, validators.size()); List methodNames = validators.stream().map(Method::getName).collect(Collectors.toList()); - assertThat(methodNames).contains("oldClientPostProcessCreateKeyValidator"); - assertThat(methodNames).contains("oldClientPostProcessCreateKeyValidator2"); + assertThat(methodNames).contains("postProcessCreateKeyBucketLayoutClientValidator"); + assertThat(methodNames).contains("postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } @Test public void testRegistryHasTheMultiPurposePreProcessCreateVolumeValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); + ValidatorRegistry registry = + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); List preFinalizeValidators = - registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION), CreateVolume, PRE_PROCESS); + registry.validationsFor(CreateVolume, PRE_PROCESS, LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), + OMLayoutFeature.HSYNC); List newClientValidators = - registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateVolume, PRE_PROCESS); + registry.validationsFor(CreateVolume, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(1, preFinalizeValidators.size()); assertEquals(1, newClientValidators.size()); - String expectedMethodName = "multiPurposePreProcessCreateVolumeValidator"; + String expectedMethodName = "multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"; assertEquals(expectedMethodName, preFinalizeValidators.get(0).getName()); assertEquals(expectedMethodName, newClientValidators.get(0).getName()); } @Test public void testRegistryHasTheMultiPurposePostProcessCreateVolumeValidator() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); List preFinalizeValidators = - registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION), CreateVolume, POST_PROCESS); + registry.validationsFor(CreateVolume, POST_PROCESS, LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), + OMLayoutFeature.HSYNC); List oldClientValidators = - registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateVolume, POST_PROCESS); + registry.validationsFor(CreateVolume, POST_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(1, preFinalizeValidators.size()); assertEquals(1, oldClientValidators.size()); - String expectedMethodName = "multiPurposePostProcessCreateVolumeValidator"; + String expectedMethodName = "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"; assertEquals(expectedMethodName, preFinalizeValidators.get(0).getName()); assertEquals(expectedMethodName, oldClientValidators.get(0).getName()); } @Test public void testValidatorsAreReturnedForMultiCondition() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); - List validators = - registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION, OLDER_CLIENT_REQUESTS), - CreateKey, POST_PROCESS); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + List validators = registry.validationsFor(CreateKey, POST_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT, + LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.HSYNC)); assertEquals(3, validators.size()); List methodNames = validators.stream().map(Method::getName).collect(Collectors.toList()); - assertThat(methodNames).contains("preFinalizePostProcessCreateKeyValidator"); - assertThat(methodNames).contains("oldClientPostProcessCreateKeyValidator"); - assertThat(methodNames).contains("oldClientPostProcessCreateKeyValidator2"); + assertThat(methodNames).contains("postProcessCreateKeyQuotaLayoutValidator"); + assertThat(methodNames).contains("postProcessCreateKeyBucketLayoutClientValidator"); + assertThat(methodNames).contains("postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } @Test public void testNoValidatorForRequestsAtAllReturnsEmptyList() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE_WO_VALIDATORS); - assertTrue(registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateKey, PRE_PROCESS).isEmpty()); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE_WO_VALIDATORS, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + assertTrue(registry.validationsFor(CreateKey, PRE_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT, + LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.HSYNC)).isEmpty()); } @Test @@ -196,18 +233,41 @@ public void testNoValidatorForConditionReturnsEmptyList() for (URL url : urls) { urlsToUse.add(new URL(url, PACKAGE2.replaceAll("\\.", "/"))); } - ValidatorRegistry registry = new ValidatorRegistry(urlsToUse); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, urlsToUse, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); - assertTrue(registry.validationsFor( - asList(CLUSTER_NEEDS_FINALIZATION), CreateKey, PRE_PROCESS).isEmpty()); + assertTrue(registry.validationsFor(CreateKey, PRE_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT, + LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.BUCKET_LAYOUT_SUPPORT)).isEmpty()); } @Test public void testNoDefinedValidationForRequestReturnsEmptyList() { - ValidatorRegistry registry = new ValidatorRegistry(PACKAGE); + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + + assertTrue(registry.validationsFor(CreateDirectory, null, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + ClientVersion.ERASURE_CODING_SUPPORT).isEmpty()); + } - assertTrue(registry.validationsFor( - asList(OLDER_CLIENT_REQUESTS), CreateDirectory, null).isEmpty()); + @Test + public void testFutureVersionForRequestReturnsOnlyFutureVersionValidators() { + ValidatorRegistry registry = new ValidatorRegistry<>( + OzoneManagerProtocolProtos.Type.class, PACKAGE, + Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), + REQUEST_PROCESSING_PHASES); + + List validators = registry.validationsFor(CreateKey, PRE_PROCESS, + CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.FUTURE_VERSION); + + assertEquals(1, validators.size()); + List methodNames = + validators.stream().map(Method::getName).collect(Collectors.toList()); + assertThat(methodNames).contains("preProcessCreateKeyFutureClientValidator"); } } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java index f0895ac47d7f..b0b3ddd514a1 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java @@ -17,8 +17,6 @@ package org.apache.hadoop.ozone.om.request.validation.testvalidatorset1; -import static org.apache.hadoop.ozone.om.request.validation.ValidationCondition.CLUSTER_NEEDS_FINALIZATION; -import static org.apache.hadoop.ozone.om.request.validation.ValidationCondition.OLDER_CLIENT_REQUESTS; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateKey; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateVolume; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.DeleteKeys; @@ -28,9 +26,12 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; +import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; +import org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator; import org.apache.hadoop.ozone.om.request.validation.TestRequestValidations; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; +import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; @@ -88,82 +89,88 @@ private static void fireValidationEvent(String calledMethodName) { listeners.forEach(l -> l.validationCalled(calledMethodName)); } - @RequestFeatureValidator( - conditions = { CLUSTER_NEEDS_FINALIZATION }, + @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.QUOTA, processingPhase = PRE_PROCESS, requestType = CreateKey) - public static OMRequest preFinalizePreProcessCreateKeyValidator( + public static OMRequest preProcessCreateKeyQuotaLayoutValidator( OMRequest req, ValidationContext ctx) { - fireValidationEvent("preFinalizePreProcessCreateKeyValidator"); + fireValidationEvent("preProcessCreateKeyQuotaLayoutValidator"); return req; } - @RequestFeatureValidator( - conditions = { CLUSTER_NEEDS_FINALIZATION }, - processingPhase = POST_PROCESS, - requestType = CreateKey) - public static OMResponse preFinalizePostProcessCreateKeyValidator( - OMRequest req, OMResponse resp, ValidationContext ctx) { - fireValidationEvent("preFinalizePostProcessCreateKeyValidator"); - return resp; - } - - @RequestFeatureValidator( - conditions = { OLDER_CLIENT_REQUESTS }, + @OMClientVersionValidator( + applyBefore = ClientVersion.FUTURE_VERSION, processingPhase = PRE_PROCESS, requestType = CreateKey) - public static OMRequest oldClientPreProcessCreateKeyValidator( + public static OMRequest preProcessCreateKeyFutureClientValidator( OMRequest req, ValidationContext ctx) { - fireValidationEvent("oldClientPreProcessCreateKeyValidator"); + fireValidationEvent("preProcessCreateKeyFutureClientValidator"); return req; } - @RequestFeatureValidator( - conditions = { OLDER_CLIENT_REQUESTS }, + @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.QUOTA, processingPhase = POST_PROCESS, requestType = CreateKey) - public static OMResponse oldClientPostProcessCreateKeyValidator( + public static OMResponse postProcessCreateKeyQuotaLayoutValidator( OMRequest req, OMResponse resp, ValidationContext ctx) { - fireValidationEvent("oldClientPostProcessCreateKeyValidator"); + fireValidationEvent("postProcessCreateKeyQuotaLayoutValidator"); return resp; } - @RequestFeatureValidator( - conditions = { CLUSTER_NEEDS_FINALIZATION, OLDER_CLIENT_REQUESTS }, + @OMClientVersionValidator( processingPhase = PRE_PROCESS, - requestType = CreateVolume) - public static OMRequest multiPurposePreProcessCreateVolumeValidator( + requestType = CreateKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + public static OMRequest preProcessCreateKeyBucketLayoutClientValidator( OMRequest req, ValidationContext ctx) { - fireValidationEvent("multiPurposePreProcessCreateVolumeValidator"); + fireValidationEvent("preProcessCreateKeyBucketLayoutClientValidator"); return req; } - @RequestFeatureValidator( - conditions = { OLDER_CLIENT_REQUESTS, CLUSTER_NEEDS_FINALIZATION }, + @OMClientVersionValidator( processingPhase = POST_PROCESS, - requestType = CreateVolume) - public static OMResponse multiPurposePostProcessCreateVolumeValidator( + requestType = CreateKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + public static OMResponse postProcessCreateKeyBucketLayoutClientValidator( OMRequest req, OMResponse resp, ValidationContext ctx) { - fireValidationEvent("multiPurposePostProcessCreateVolumeValidator"); + fireValidationEvent("postProcessCreateKeyBucketLayoutClientValidator"); return resp; } - @RequestFeatureValidator( - conditions = { OLDER_CLIENT_REQUESTS }, + @OMClientVersionValidator( + processingPhase = PRE_PROCESS, + requestType = CreateVolume, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + @OMLayoutVersionValidator(processingPhase = PRE_PROCESS, + requestType = CreateVolume, + applyBefore = OMLayoutFeature.QUOTA) + public static OMRequest multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( + OMRequest req, ValidationContext ctx) { + fireValidationEvent("multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); + return req; + } + + @OMClientVersionValidator( processingPhase = POST_PROCESS, - requestType = CreateKey) - public static OMResponse oldClientPostProcessCreateKeyValidator2( + requestType = CreateVolume, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + @OMLayoutVersionValidator(processingPhase = POST_PROCESS, + requestType = CreateVolume, + applyBefore = OMLayoutFeature.QUOTA) + public static OMResponse multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( OMRequest req, OMResponse resp, ValidationContext ctx) { - fireValidationEvent("oldClientPostProcessCreateKeyValidator2"); + fireValidationEvent("multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); return resp; } - @RequestFeatureValidator( - conditions = {OLDER_CLIENT_REQUESTS}, + @OMClientVersionValidator( processingPhase = PRE_PROCESS, - requestType = DeleteKeys + requestType = DeleteKeys, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) - public static OMRequest throwingPreProcessValidator( + public static OMRequest throwingPreProcessDeleteKeyBucketLayoutClientValidator( OMRequest req, ValidationContext ctx) throws IOException { fireValidationEvent("throwingPreProcessValidator"); if (validatorTestsRunning) { @@ -172,12 +179,12 @@ public static OMRequest throwingPreProcessValidator( return req; } - @RequestFeatureValidator( - conditions = {OLDER_CLIENT_REQUESTS}, + @OMClientVersionValidator( processingPhase = POST_PROCESS, - requestType = DeleteKeys + requestType = DeleteKeys, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) - public static OMResponse throwingPostProcessValidator( + public static OMResponse throwingPostProcessDeleteKeyBucketLayoutClientValidator( OMRequest req, OMResponse resp, ValidationContext ctx) throws IOException { fireValidationEvent("throwingPostProcessValidator"); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java index 52faefe57a10..253e4ea45df4 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java @@ -17,11 +17,11 @@ package org.apache.hadoop.ozone.om.request.validation.testvalidatorset2; -import static org.apache.hadoop.ozone.om.request.validation.ValidationCondition.OLDER_CLIENT_REQUESTS; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.CreateKey; import static org.apache.hadoop.ozone.request.validation.RequestProcessingPhase.PRE_PROCESS; -import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; +import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator; import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; @@ -33,11 +33,11 @@ public final class ValidatorsForOnlyOldClientValidations { private ValidatorsForOnlyOldClientValidations() { } - @RequestFeatureValidator( - conditions = { OLDER_CLIENT_REQUESTS }, + @OMClientVersionValidator( processingPhase = PRE_PROCESS, - requestType = CreateKey) - public static OMRequest oldClientPreProcessCreateKeyValidator2( + requestType = CreateKey, + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + public static OMRequest preProcessCreateKeyBucketLayoutClientValidator( OMRequest req, ValidationContext ctx) { return req; } diff --git a/hadoop-ozone/recon-codegen/pom.xml b/hadoop-ozone/recon-codegen/pom.xml index b85e7cef1269..ad7464e9fbd6 100644 --- a/hadoop-ozone/recon-codegen/pom.xml +++ b/hadoop-ozone/recon-codegen/pom.xml @@ -103,7 +103,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/recon/pom.xml b/hadoop-ozone/recon/pom.xml index 13a5108bae76..14c31ec400c8 100644 --- a/hadoop-ozone/recon/pom.xml +++ b/hadoop-ozone/recon/pom.xml @@ -336,7 +336,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/s3gateway/pom.xml b/hadoop-ozone/s3gateway/pom.xml index 289d7246544f..3a55da199c97 100644 --- a/hadoop-ozone/s3gateway/pom.xml +++ b/hadoop-ozone/s3gateway/pom.xml @@ -250,7 +250,8 @@ Only selected annotation processors are enabled, see configuration of maven-compiler-plugin. - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices diff --git a/hadoop-ozone/tools/pom.xml b/hadoop-ozone/tools/pom.xml index dcbc5637ab88..5b3af0024dd1 100644 --- a/hadoop-ozone/tools/pom.xml +++ b/hadoop-ozone/tools/pom.xml @@ -334,7 +334,8 @@ org.apache.hadoop.hdds.conf.Config org.apache.hadoop.hdds.conf.ConfigGroup org.apache.hadoop.hdds.scm.metadata.Replicate - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator diff --git a/pom.xml b/pom.xml index 64b2cb0d7cbf..4cafc4309580 100644 --- a/pom.xml +++ b/pom.xml @@ -1721,7 +1721,8 @@ org.apache.hadoop.hdds.conf.Config org.apache.hadoop.hdds.conf.ConfigGroup - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator org.apache.hadoop.hdds.scm.metadata.Replicate org.kohsuke.MetaInfServices From 16dd2d2d5f6bfd79236aecb23bf2202bb649f6a4 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 6 May 2025 16:51:52 -0400 Subject: [PATCH 2/9] HDDS-12983. Revert module move change Change-Id: Icec10ce7bb452753db0936212b0757c01279b533 --- .../ozone/om/request/validation/OMClientVersionValidator.java | 1 - .../ozone/om/request/validation/RequestValidations.java | 1 - .../ozone/om}/request/validation/ValidatorRegistry.java | 4 +++- .../ozone/om/request/validation/TestRequestValidations.java | 4 ---- .../ozone/om/request/validation/TestValidatorRegistry.java | 1 - 5 files changed, 3 insertions(+), 8 deletions(-) rename hadoop-ozone/{common/src/main/java/org/apache/hadoop/ozone => ozone-manager/src/main/java/org/apache/hadoop/ozone/om}/request/validation/ValidatorRegistry.java (98%) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java index 430c106b4d6e..015b67b47ddc 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/OMClientVersionValidator.java @@ -25,7 +25,6 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.request.validation.RegisterValidator; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; -import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; /** * An annotation to mark methods that do certain request validations based on the diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java index 54da24e512de..8bc70659338c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java @@ -37,7 +37,6 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; -import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; import org.jgrapht.alg.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java similarity index 98% rename from hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java rename to hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index f13bacc1317d..91fff9f68930 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.hadoop.ozone.request.validation; +package org.apache.hadoop.ozone.om.request.validation; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; @@ -37,6 +37,8 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.ozone.Versioned; +import org.apache.hadoop.ozone.request.validation.RegisterValidator; +import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; import org.reflections.Reflections; import org.reflections.scanners.Scanners; import org.reflections.util.ClasspathHelper; diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java index 14c063124609..8d13bfc2c06f 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java @@ -287,10 +287,6 @@ private RequestValidations loadEmptyValidations(ValidationContext ctx) { .load(); } - private int olderClientVersion() { - return ClientVersion.CURRENT_VERSION - 1; - } - private int currentClientVersion() { return ClientVersion.CURRENT_VERSION; } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java index 7bca78fb8e0e..f527ba30a5cc 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java @@ -45,7 +45,6 @@ import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; -import org.apache.hadoop.ozone.request.validation.ValidatorRegistry; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From de26a00eddd2e1d4c219f8606e46f91ab878ba17 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Wed, 7 May 2025 01:18:18 -0400 Subject: [PATCH 3/9] HDDS-12983. Fix Validator registry Change-Id: I9a010c86d0128da8140fa33b46eaeef9da0dc283 --- .../om/request/validation/ValidatorRegistry.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index 91fff9f68930..deec3eafbefa 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -33,7 +33,6 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; -import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.ozone.Versioned; @@ -61,7 +60,7 @@ public class ValidatorRegistry> { * greater than the request versions get triggered. * {@link #validationsFor(Enum, RequestProcessingPhase, Class, Versioned)} */ - private final Map, EnumMap, EnumMap>>> indexedValidatorMap; /** @@ -113,8 +112,11 @@ public ValidatorRegistry(Class requestType, .equals(requestArrayClass)) .map(annotationClass -> (Class) annotationClass) .collect(Collectors.toSet()); - this.indexedValidatorMap = allowedValidators.stream().collect(ImmutableMap.toImmutableMap(Function.identity(), - validatorClass -> new EnumMap<>(requestType))); + this.indexedValidatorMap = + allowedValidators.stream().collect(ImmutableMap.toImmutableMap(annotationClass -> + (Class) getReturnTypeOfAnnotationMethod(annotationClass, + RegisterValidator.APPLY_BEFORE_METHOD_NAME), + validatorClass -> new EnumMap<>(requestType))); Reflections reflections = new Reflections(new ConfigurationBuilder() .setUrls(searchUrls) .setScanners(Scanners.MethodsAnnotated) @@ -236,6 +238,9 @@ private void registerValidator(Class requestType, Class validatorToBeRegistered, Reflections reflections) { Collection methods = reflections.getMethodsAnnotatedWith(validatorToBeRegistered); + Class versionClass = + (Class) this.getReturnTypeOfAnnotationMethod(validatorToBeRegistered, + RegisterValidator.APPLY_BEFORE_METHOD_NAME); List> sortedMethodsByApplyBeforeVersion = methods.stream() .map(method -> Pair.of(method.getAnnotation(validatorToBeRegistered), method)) .sorted((validatorMethodPair1, validatorMethodPair2) -> @@ -254,7 +259,7 @@ private void registerValidator(Class requestType, method.setAccessible(true); for (RequestType type : types) { EnumMap>> requestMap = - this.indexedValidatorMap.get(validatorToBeRegistered); + this.indexedValidatorMap.get(versionClass); EnumMap> phaseMap = requestMap.computeIfAbsent(type, k -> new EnumMap<>(RequestProcessingPhase.class)); phaseMap.computeIfAbsent(phase, k -> new IndexedItems<>()).add(method, applyBeforeVersion.version()); From bf983889f3b4c96b2da60ae98e4e5a369f3d3592 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 20 May 2025 08:06:45 -0400 Subject: [PATCH 4/9] HDDS-12983. Change key to validator map Change-Id: Ibf524d42e3d8535377105a07f8ca3213c8c62199 --- .../request/bucket/OMBucketCreateRequest.java | 2 +- .../validation/RequestValidations.java | 6 +- .../request/validation/ValidatorRegistry.java | 17 +-- .../validation/TestRequestValidations.java | 10 +- .../validation/TestValidatorRegistry.java | 135 +++++++----------- 5 files changed, 65 insertions(+), 105 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java index a1d6bbf27b30..ee7b42f327ba 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java @@ -464,7 +464,7 @@ public static OMRequest handleCreateBucketWithBucketLayoutDuringPreFinalize( @OMClientVersionValidator( processingPhase = RequestProcessingPhase.PRE_PROCESS, requestType = Type.CreateBucket, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT ) public static OMRequest setDefaultBucketLayoutForOlderClients(OMRequest req, ValidationContext ctx) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java index 8bc70659338c..866b623d2043 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java @@ -31,13 +31,13 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.ozone.Versioned; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; -import org.jgrapht.alg.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,7 +121,7 @@ private Map, Versioned> getVersions(OMRequest reques return Arrays.stream(VersionExtractor.values()) .map(versionExtractor -> Pair.of(versionExtractor.getValidatorClass(), versionExtractor.extractVersion(request, context))) - .filter(pair -> Objects.nonNull(pair.getSecond())) - .collect(Collectors.toMap(pair -> pair.getFirst(), pair -> pair.getSecond())); + .filter(pair -> Objects.nonNull(pair.getValue())) + .collect(Collectors.toMap(Pair::getKey, Pair::getValue)); } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index deec3eafbefa..27a06a0f3f2c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -33,6 +33,7 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; +import java.util.function.Function; import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.ozone.Versioned; @@ -60,7 +61,7 @@ public class ValidatorRegistry> { * greater than the request versions get triggered. * {@link #validationsFor(Enum, RequestProcessingPhase, Class, Versioned)} */ - private final Map, EnumMap, EnumMap>>> indexedValidatorMap; /** @@ -112,11 +113,8 @@ public ValidatorRegistry(Class requestType, .equals(requestArrayClass)) .map(annotationClass -> (Class) annotationClass) .collect(Collectors.toSet()); - this.indexedValidatorMap = - allowedValidators.stream().collect(ImmutableMap.toImmutableMap(annotationClass -> - (Class) getReturnTypeOfAnnotationMethod(annotationClass, - RegisterValidator.APPLY_BEFORE_METHOD_NAME), - validatorClass -> new EnumMap<>(requestType))); + this.indexedValidatorMap = allowedValidators.stream().collect(ImmutableMap.toImmutableMap(Function.identity(), + validatorClass -> new EnumMap<>(requestType))); Reflections reflections = new Reflections(new ConfigurationBuilder() .setUrls(searchUrls) .setScanners(Scanners.MethodsAnnotated) @@ -159,7 +157,7 @@ public List validationsFor(RequestType requestType Class validatorClass, V requestVersion) { - return Optional.ofNullable(this.indexedValidatorMap.get(requestVersion.getClass())) + return Optional.ofNullable(this.indexedValidatorMap.get(validatorClass)) .map(requestTypeMap -> requestTypeMap.get(requestType)) .map(phaseMap -> phaseMap.get(phase)) .map(indexedMethods -> requestVersion.version() < 0 ? @@ -238,9 +236,6 @@ private void registerValidator(Class requestType, Class validatorToBeRegistered, Reflections reflections) { Collection methods = reflections.getMethodsAnnotatedWith(validatorToBeRegistered); - Class versionClass = - (Class) this.getReturnTypeOfAnnotationMethod(validatorToBeRegistered, - RegisterValidator.APPLY_BEFORE_METHOD_NAME); List> sortedMethodsByApplyBeforeVersion = methods.stream() .map(method -> Pair.of(method.getAnnotation(validatorToBeRegistered), method)) .sorted((validatorMethodPair1, validatorMethodPair2) -> @@ -259,7 +254,7 @@ private void registerValidator(Class requestType, method.setAccessible(true); for (RequestType type : types) { EnumMap>> requestMap = - this.indexedValidatorMap.get(versionClass); + this.indexedValidatorMap.get(validatorToBeRegistered); EnumMap> phaseMap = requestMap.computeIfAbsent(type, k -> new EnumMap<>(RequestProcessingPhase.class)); phaseMap.computeIfAbsent(phase, k -> new IndexedItems<>()).add(method, applyBeforeVersion.version()); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java index 8d13bfc2c06f..444762b2d573 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestRequestValidations.java @@ -204,10 +204,9 @@ public void testOldClientConditionIsRecognizedAndPostValidatorsApplied() validations.validateResponse( aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT), aCreateKeyResponse()); - validationListener.assertNumOfEvents(2); + validationListener.assertNumOfEvents(1); validationListener.assertExactListOfValidatorsCalled( - "postProcessCreateKeyBucketLayoutClientValidator", - "postProcessCreateKeyECReplicaIndexRequiredClientValidator"); + "postProcessCreateKeyBucketLayoutClientValidator"); } @Test @@ -233,11 +232,10 @@ public void testPreFinalizedWithOldClientConditionPostProcValidatorsApplied() validations.validateResponse( aCreateKeyRequest(ClientVersion.ERASURE_CODING_SUPPORT), aCreateKeyResponse()); - validationListener.assertNumOfEvents(3); + validationListener.assertNumOfEvents(2); validationListener.assertExactListOfValidatorsCalled( "postProcessCreateKeyQuotaLayoutValidator", - "postProcessCreateKeyBucketLayoutClientValidator", - "postProcessCreateKeyECReplicaIndexRequiredClientValidator"); + "postProcessCreateKeyBucketLayoutClientValidator"); } /** diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java index f527ba30a5cc..9f6b14b74509 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java @@ -38,10 +38,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.Versioned; import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.request.validation.RequestProcessingPhase; @@ -78,28 +81,38 @@ public void tearDown() { finishValidatorTest(); } - @Test - public void testNoValidatorsReturnedForEmptyConditionList() { + private List getValidatorsForRequest(OzoneManagerProtocolProtos.Type requestType, + RequestProcessingPhase phase, VersionExtractor extractor, Versioned versioned) { + return getValidatorsForRequest(PACKAGE, requestType, phase, Collections.singletonMap(extractor, versioned)); + } + + private List getValidatorsForRequest(OzoneManagerProtocolProtos.Type requestType, + RequestProcessingPhase phase, Map requestVersions) { + return getValidatorsForRequest(PACKAGE, requestType, phase, requestVersions); + } + + private List getValidatorsForRequest(String packageName, OzoneManagerProtocolProtos.Type requestType, + RequestProcessingPhase phase, Map requestVersions) { ValidatorRegistry registry = - new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, + new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, packageName, Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass) .collect(Collectors.toSet()), REQUEST_PROCESSING_PHASES); - List validators = registry.validationsFor(CreateKey, PRE_PROCESS, - CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT); + return registry.validationsFor(requestType, phase, requestVersions.entrySet().stream() + .collect(Collectors.toMap(e -> e.getKey().getValidatorClass(), Map.Entry::getValue))); + } + @Test + public void testNoValidatorsReturnedForEmptyConditionList() { + List validators = getValidatorsForRequest(CreateKey, PRE_PROCESS, + CLIENT_VERSION_EXTRACTOR, ClientVersion.CURRENT); assertTrue(validators.isEmpty()); } @Test public void testRegistryHasThePreFinalizePreProcessCreateKeyValidator() { - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List validators = - registry.validationsFor(CreateKey, PRE_PROCESS, - ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT, - LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.FILESYSTEM_SNAPSHOT)); + List validators = getValidatorsForRequest(CreateKey, PRE_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR, ClientVersion.CURRENT, + LAYOUT_VERSION_EXTRACTOR, OMLayoutFeature.FILESYSTEM_SNAPSHOT)); assertEquals(1, validators.size()); String expectedMethodName = "preProcessCreateKeyQuotaLayoutValidator"; @@ -108,13 +121,9 @@ public void testRegistryHasThePreFinalizePreProcessCreateKeyValidator() { @Test public void testRegistryHasThePreFinalizePostProcessCreateKeyValidator() { - ValidatorRegistry registry = - new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List validators = registry.validationsFor(CreateKey, POST_PROCESS, - ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.CURRENT, - LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.BUCKET_LAYOUT_SUPPORT)); + List validators = getValidatorsForRequest(CreateKey, POST_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR, ClientVersion.CURRENT, + LAYOUT_VERSION_EXTRACTOR, OMLayoutFeature.BUCKET_LAYOUT_SUPPORT)); assertEquals(1, validators.size()); String expectedMethodName = "postProcessCreateKeyQuotaLayoutValidator"; @@ -123,13 +132,8 @@ public void testRegistryHasThePreFinalizePostProcessCreateKeyValidator() { @Test public void testRegistryHasTheOldClientPreProcessCreateKeyValidator() { - ValidatorRegistry registry = - new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List validators = - registry.validationsFor(CreateKey, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), - ClientVersion.ERASURE_CODING_SUPPORT); + List validators = getValidatorsForRequest(CreateKey, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR, + ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(2, validators.size()); List methodNames = @@ -140,31 +144,20 @@ public void testRegistryHasTheOldClientPreProcessCreateKeyValidator() { @Test public void testRegistryHasTheOldClientPostProcessCreateKeyValidator() { - ValidatorRegistry registry = - new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List validators = registry.validationsFor(CreateKey, POST_PROCESS, - CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT); + List validators = getValidatorsForRequest(CreateKey, POST_PROCESS, + CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT); - assertEquals(2, validators.size()); + assertEquals(1, validators.size()); List methodNames = validators.stream().map(Method::getName).collect(Collectors.toList()); assertThat(methodNames).contains("postProcessCreateKeyBucketLayoutClientValidator"); - assertThat(methodNames).contains("postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } @Test public void testRegistryHasTheMultiPurposePreProcessCreateVolumeValidator() { - ValidatorRegistry registry = - new ValidatorRegistry<>(OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List preFinalizeValidators = - registry.validationsFor(CreateVolume, PRE_PROCESS, LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), - OMLayoutFeature.HSYNC); - List newClientValidators = - registry.validationsFor(CreateVolume, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + List preFinalizeValidators = getValidatorsForRequest(CreateVolume, PRE_PROCESS, LAYOUT_VERSION_EXTRACTOR, + OMLayoutFeature.HSYNC); + List newClientValidators = getValidatorsForRequest(CreateVolume, PRE_PROCESS, CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(1, preFinalizeValidators.size()); @@ -176,16 +169,10 @@ public void testRegistryHasTheMultiPurposePreProcessCreateVolumeValidator() { @Test public void testRegistryHasTheMultiPurposePostProcessCreateVolumeValidator() { - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List preFinalizeValidators = - registry.validationsFor(CreateVolume, POST_PROCESS, LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), - OMLayoutFeature.HSYNC); - List oldClientValidators = - registry.validationsFor(CreateVolume, POST_PROCESS, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), - ClientVersion.ERASURE_CODING_SUPPORT); + List preFinalizeValidators = getValidatorsForRequest(CreateVolume, POST_PROCESS, LAYOUT_VERSION_EXTRACTOR, + OMLayoutFeature.HSYNC); + List oldClientValidators = getValidatorsForRequest(CreateVolume, POST_PROCESS, CLIENT_VERSION_EXTRACTOR, + ClientVersion.ERASURE_CODING_SUPPORT); assertEquals(1, preFinalizeValidators.size()); assertEquals(1, oldClientValidators.size()); @@ -196,32 +183,22 @@ public void testRegistryHasTheMultiPurposePostProcessCreateVolumeValidator() { @Test public void testValidatorsAreReturnedForMultiCondition() { - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - List validators = registry.validationsFor(CreateKey, POST_PROCESS, - ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT, - LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.HSYNC)); + List validators = getValidatorsForRequest(CreateKey, POST_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT, + LAYOUT_VERSION_EXTRACTOR, OMLayoutFeature.HSYNC)); - assertEquals(3, validators.size()); + assertEquals(2, validators.size()); List methodNames = validators.stream().map(Method::getName).collect(Collectors.toList()); assertThat(methodNames).contains("postProcessCreateKeyQuotaLayoutValidator"); assertThat(methodNames).contains("postProcessCreateKeyBucketLayoutClientValidator"); - assertThat(methodNames).contains("postProcessCreateKeyECReplicaIndexRequiredClientValidator"); } @Test public void testNoValidatorForRequestsAtAllReturnsEmptyList() { - - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE_WO_VALIDATORS, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - assertTrue(registry.validationsFor(CreateKey, PRE_PROCESS, - ImmutableMap.of(CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.ERASURE_CODING_SUPPORT, - LAYOUT_VERSION_EXTRACTOR.getValidatorClass(), OMLayoutFeature.HSYNC)).isEmpty()); + assertTrue(getValidatorsForRequest(PACKAGE_WO_VALIDATORS, CreateKey, PRE_PROCESS, + ImmutableMap.of(CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT, + LAYOUT_VERSION_EXTRACTOR, OMLayoutFeature.HSYNC)).isEmpty()); } @Test @@ -244,24 +221,14 @@ public void testNoValidatorForConditionReturnsEmptyList() @Test public void testNoDefinedValidationForRequestReturnsEmptyList() { - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - - assertTrue(registry.validationsFor(CreateDirectory, null, CLIENT_VERSION_EXTRACTOR.getValidatorClass(), + assertTrue(getValidatorsForRequest(CreateDirectory, null, CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT).isEmpty()); } @Test public void testFutureVersionForRequestReturnsOnlyFutureVersionValidators() { - ValidatorRegistry registry = new ValidatorRegistry<>( - OzoneManagerProtocolProtos.Type.class, PACKAGE, - Arrays.stream(VersionExtractor.values()).map(VersionExtractor::getValidatorClass).collect(Collectors.toSet()), - REQUEST_PROCESSING_PHASES); - - List validators = registry.validationsFor(CreateKey, PRE_PROCESS, - CLIENT_VERSION_EXTRACTOR.getValidatorClass(), ClientVersion.FUTURE_VERSION); + List validators = getValidatorsForRequest(CreateKey, PRE_PROCESS, + CLIENT_VERSION_EXTRACTOR, ClientVersion.FUTURE_VERSION); assertEquals(1, validators.size()); List methodNames = From d4b9b336eb10124bb91aef5ab118748e60594a2e Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 20 May 2025 11:22:49 -0400 Subject: [PATCH 5/9] HDDS-12983. Address review comments Change-Id: Idf26bbc7e83877a71f46bafdf0216d70733a92ee --- .../org/apache/hadoop/ozone/Versioned.java | 8 ++ .../validation/RequestValidations.java | 3 +- .../request/validation/ValidatorRegistry.java | 125 +++++++++--------- .../om/request/validation/package-info.java | 4 +- .../validation/TestValidatorRegistry.java | 5 + 5 files changed, 78 insertions(+), 67 deletions(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java index 136edeaf2a0a..33cb16104b21 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java @@ -17,9 +17,17 @@ package org.apache.hadoop.ozone; +import java.util.Comparator; + /** * Base class defining the version in the entire system. */ public interface Versioned { + static final Comparator VERSIONED_COMPARATOR = Comparator.comparingInt(Versioned::version); + int version(); + + static Comparator versionComparator() { + return VERSIONED_COMPARATOR; + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java index 866b623d2043..721913a2ebcd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/RequestValidations.java @@ -75,8 +75,7 @@ public synchronized RequestValidations load() { public OMRequest validateRequest(OMRequest request) throws Exception { - List validations = registry.validationsFor(request.getCmdType(), PRE_PROCESS, - this.getVersions(request)); + List validations = registry.validationsFor(request.getCmdType(), PRE_PROCESS, getVersions(request)); OMRequest validatedRequest = request; try { for (Method m : validations) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index 27a06a0f3f2c..7ca6e636884f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -27,9 +27,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.NavigableMap; import java.util.Optional; import java.util.Set; import java.util.TreeMap; @@ -62,7 +64,7 @@ public class ValidatorRegistry> { * {@link #validationsFor(Enum, RequestProcessingPhase, Class, Versioned)} */ private final Map, EnumMap>>> indexedValidatorMap; + EnumMap>>> indexedValidatorMap; /** * Creates a {@link ValidatorRegistry} instance that discovers validation @@ -70,18 +72,16 @@ public class ValidatorRegistry> { * A validation method is recognized by all the annotations classes which * are annotated by {@link RegisterValidator} annotation that contains * important information about how and when to use the validator. - * @param requestType class of request type enum. - * @param validatorPackage the main package inside which validatiors should - * be discovered. - * @param allowedValidators a set containing the various types of version allowed to be registered. + * + * @param requestType class of request type enum. + * @param validatorPackage the main package inside which validatiors should + * be discovered. + * @param allowedValidators a set containing the various types of version allowed to be registered. * @param allowedProcessingPhases set of request processing phases which would be allowed to be registered to * registry. - * */ - public ValidatorRegistry(Class requestType, - String validatorPackage, - Set> allowedValidators, - Set allowedProcessingPhases) { + public ValidatorRegistry(Class requestType, String validatorPackage, + Set> allowedValidators, Set allowedProcessingPhases) { this(requestType, ClasspathHelper.forPackage(validatorPackage), allowedValidators, allowedProcessingPhases); } @@ -91,16 +91,16 @@ public ValidatorRegistry(Class requestType, * A validation method is recognized by all annotations annotated by the {@link RegisterValidator} * annotation that contains important information about how and when to use * the validator. - * @param requestType class of request type enum. - * @param searchUrls the path in which the annotated methods are searched. - * @param allowedValidators a set containing the various types of validator annotation allowed to be registered. + * + * @param requestType class of request type enum. + * @param searchUrls the path in which the annotated methods are searched. + * @param allowedValidators a set containing the various types of validator annotation allowed to be registered. * @param allowedProcessingPhases set of request processing phases which would be allowed to be registered to - * registry. + * the registry. */ - public ValidatorRegistry(Class requestType, - Collection searchUrls, - Set> allowedValidators, - Set allowedProcessingPhases) { + ValidatorRegistry(Class requestType, Collection searchUrls, + Set> allowedValidators, + Set allowedProcessingPhases) { Class requestArrayClass = (Class) Array.newInstance(requestType, 0) .getClass(); Set> validatorsToBeRegistered = @@ -128,14 +128,13 @@ public ValidatorRegistry(Class requestType, * for the given requestType and for the given request versions. * {@link RequestProcessingPhase}. * - * @param requestType the type of the protocol message - * @param phase the request processing phase + * @param requestType the type of the protocol message + * @param phase the request processing phase * @param requestVersions different versions extracted from the request. * @return the list of validation methods that has to run. */ - public List validationsFor(RequestType requestType, - RequestProcessingPhase phase, - Map, ? extends Versioned> requestVersions) { + public List validationsFor(RequestType requestType, RequestProcessingPhase phase, + Map, ? extends Versioned> requestVersions) { return requestVersions.entrySet().stream() .flatMap(requestVersion -> this.validationsFor(requestType, phase, requestVersion.getKey(), requestVersion.getValue()).stream()) @@ -147,34 +146,33 @@ public List validationsFor(RequestType requestType, * for the given requestType and for the given request versions. * {@link RequestProcessingPhase}. * - * @param requestType the type of the protocol message - * @param phase the request processing phase + * @param requestType the type of the protocol message + * @param phase the request processing phase + * @param validatorClass annotation class of the validator * @param requestVersion version extracted corresponding to the request. * @return the list of validation methods that has to run. */ public List validationsFor(RequestType requestType, - RequestProcessingPhase phase, - Class validatorClass, - V requestVersion) { + RequestProcessingPhase phase, Class validatorClass, V requestVersion) { return Optional.ofNullable(this.indexedValidatorMap.get(validatorClass)) .map(requestTypeMap -> requestTypeMap.get(requestType)) .map(phaseMap -> phaseMap.get(phase)) .map(indexedMethods -> requestVersion.version() < 0 ? - indexedMethods.getItemsEqualToIdx(requestVersion.version()) : - indexedMethods.getItemsGreaterThanIdx(requestVersion.version())) + indexedMethods.getItemsEqualToIdx(requestVersion) : + indexedMethods.getItemsGreaterThanIdx(requestVersion)) .orElse(Collections.emptyList()); } /** * Calls a specified method on the validator. - * @Throws IllegalArgumentException when the specified method in the validator is invalid. + * @throws IllegalArgumentException when the specified method in the validator is invalid. */ - private ReturnValue callAnnotationMethod( + private static ReturnValue callAnnotationMethod( Validator validator, String methodName, Class returnValueType) { try { - return (ReturnValue) validator.getClass().getMethod(methodName).invoke(validator); + return returnValueType.cast(validator.getClass().getMethod(methodName).invoke(validator)); } catch (NoSuchMethodException e) { throw new IllegalArgumentException("Method " + methodName + " not found in class:" + validator.getClass().getCanonicalName(), e); @@ -184,7 +182,7 @@ private ReturnValue callAnnotationMe } } - private Class getReturnTypeOfAnnotationMethod(Class clzz, String methodName) { + private static Class getReturnTypeOfAnnotationMethod(Class clzz, String methodName) { try { return clzz.getMethod(methodName).getReturnType(); } catch (NoSuchMethodException e) { @@ -192,25 +190,25 @@ private Class getReturnTypeOfAnnotationMethod(Class clz } } - private Versioned getApplyBeforeVersion(Validator validator) { + private static Versioned getApplyBeforeVersion(Validator validator) { return callAnnotationMethod(validator, RegisterValidator.APPLY_BEFORE_METHOD_NAME, Versioned.class); } - private RequestProcessingPhase getRequestPhase(Validator validator) { + private static RequestProcessingPhase getRequestPhase(Validator validator) { return callAnnotationMethod(validator, RegisterValidator.PROCESSING_PHASE_METHOD_NAME, RequestProcessingPhase.class); } private RequestType[] getRequestType(Validator validator, - Class requestType) { + Class requestType) { return callAnnotationMethod(validator, RegisterValidator.REQUEST_TYPE_METHOD_NAME, requestType); } - private void checkAllowedAnnotationValues(Set values, V value, String valueName, String methodName) { + private static void checkAllowedAnnotationValues(Set values, V value, String valueName, String methodName) { if (!values.contains(value)) { throw new IllegalArgumentException( String.format("Invalid %1$s defined at annotation defined for method : %2$s, Annotation value : %3$s " + - "Allowed versionType: %4$s", valueName, methodName, value.toString(), values)); + "Allowed versionType: %4$s", valueName, methodName, value.toString(), values)); } } @@ -218,30 +216,29 @@ private void checkAllowedAnnotationValues(Set values, V value, String val * Initializes the internal request validator store. * The requests are stored in the following structure: * - An EnumMap with the RequestType as the key, and in which - * - values are an EnumMap with the request processing phase as the key, and in which - * - values is an {@link IndexedItems } containing the validation list + * - values are an EnumMap with the request processing phase as the key, and in which + * - values is an {@link IndexedItems } containing the validation list + * * @param validatorsToBeRegistered collection of the annotated validtors to process. */ private void initMaps(Class requestType, - Set allowedPhases, - Collection> validatorsToBeRegistered, - Reflections reflections) { + Set allowedPhases, + Collection> validatorsToBeRegistered, + Reflections reflections) { for (Class validator : validatorsToBeRegistered) { registerValidator(requestType, allowedPhases, validator, reflections); } } private void registerValidator(Class requestType, - Set allowedPhases, - Class validatorToBeRegistered, - Reflections reflections) { - Collection methods = reflections.getMethodsAnnotatedWith(validatorToBeRegistered); + Set allowedPhases, + Class validatorToBeRegistered, + Reflections reflections) { + Collection methods = reflections.getMethodsAnnotatedWith(validatorToBeRegistered); List> sortedMethodsByApplyBeforeVersion = methods.stream() .map(method -> Pair.of(method.getAnnotation(validatorToBeRegistered), method)) - .sorted((validatorMethodPair1, validatorMethodPair2) -> - Integer.compare( - this.getApplyBeforeVersion(validatorMethodPair1.getKey()).version(), - this.getApplyBeforeVersion(validatorMethodPair2.getKey()).version())) + .sorted(Comparator.comparing(validatorMethodPair -> getApplyBeforeVersion(validatorMethodPair.getKey()), + Versioned.versionComparator())) .collect(Collectors.toList()); for (Pair validatorMethodPair : sortedMethodsByApplyBeforeVersion) { Annotation validator = validatorMethodPair.getKey(); @@ -253,11 +250,12 @@ private void registerValidator(Class requestType, Set types = Sets.newHashSet(this.getRequestType(validator, requestType)); method.setAccessible(true); for (RequestType type : types) { - EnumMap>> requestMap = + EnumMap>> requestMap = this.indexedValidatorMap.get(validatorToBeRegistered); - EnumMap> phaseMap = + EnumMap> phaseMap = requestMap.computeIfAbsent(type, k -> new EnumMap<>(RequestProcessingPhase.class)); - phaseMap.computeIfAbsent(phase, k -> new IndexedItems<>()).add(method, applyBeforeVersion.version()); + phaseMap.computeIfAbsent(phase, k -> new IndexedItems<>(Versioned.versionComparator())) + .add(method, applyBeforeVersion); } } } @@ -265,22 +263,24 @@ private void registerValidator(Class requestType, /** * Class responsible for maintaining indexs of items. Here each item should have an index corresponding to it. * The class implements functions for efficiently fetching range gets on the items added to the data structure. - * @param Refers to the Type of the item in the data structure + * + * @param Refers to the Type of the item in the data structure * @param Type of the index of an item added in the data structure. It is important that the index is - * comparable to each other. + * comparable to each other. */ - private static final class IndexedItems> { + private static final class IndexedItems { private final List items; - private final TreeMap indexMap; + private final NavigableMap indexMap; - private IndexedItems() { + private IndexedItems(Comparator comparator) { this.items = new ArrayList<>(); - this.indexMap = new TreeMap<>(); + this.indexMap = new TreeMap<>(comparator); } /** * Add an item to the collection and update index if required. The order of items added should have their index * sorted in increasing order. + * * @param item * @param idx */ @@ -301,7 +301,7 @@ public List getItemsGreaterThanIdx(IDX indexValue) { /** * @param indexValue Given index value. - * @return All the items which has an index value greater than given index value. + * @return All the items that have an index value equal to the given index value. */ public List getItemsEqualToIdx(IDX indexValue) { return Optional.ofNullable(indexMap.get(indexValue)) @@ -309,7 +309,6 @@ public List getItemsEqualToIdx(IDX indexValue) { .map(Map.Entry::getValue).orElse(items.size()))) .orElse(Collections.emptyList()); } - } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java index cd3e65389b91..a2fc73da167f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/package-info.java @@ -47,8 +47,8 @@ * and the request processing phase in which we apply the validation and the maxVersion corresponding to which this * is supposed to run. * - * One validator can be applied in multiple, E.g. - * {@link org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator}, + * One validator can be applied based on multiple trigger conditions, E.g. + * A validator registered can have both {@link org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator}, * {@link org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator} * * The main reason to avoid validating multiple request types with the same diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java index 9f6b14b74509..280046280f70 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/TestValidatorRegistry.java @@ -173,12 +173,17 @@ public void testRegistryHasTheMultiPurposePostProcessCreateVolumeValidator() { OMLayoutFeature.HSYNC); List oldClientValidators = getValidatorsForRequest(CreateVolume, POST_PROCESS, CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT); + List combinedValidators = getValidatorsForRequest(CreateVolume, POST_PROCESS, + ImmutableMap.of(LAYOUT_VERSION_EXTRACTOR, OMLayoutFeature.HSYNC, + CLIENT_VERSION_EXTRACTOR, ClientVersion.ERASURE_CODING_SUPPORT)); assertEquals(1, preFinalizeValidators.size()); assertEquals(1, oldClientValidators.size()); + assertEquals(1, combinedValidators.size()); String expectedMethodName = "multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"; assertEquals(expectedMethodName, preFinalizeValidators.get(0).getName()); assertEquals(expectedMethodName, oldClientValidators.get(0).getName()); + assertEquals(expectedMethodName, combinedValidators.get(0).getName()); } @Test From 64e0f58958e3ae6aa00abeee82bd697092b4a4a3 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 20 May 2025 11:41:01 -0400 Subject: [PATCH 6/9] HDDS-12983. Fix checkstyle issue Change-Id: Idecefb392dbf5c01227d7c3702db1781b9edb073 --- .../common/src/main/java/org/apache/hadoop/ozone/Versioned.java | 2 +- .../hadoop/ozone/om/request/validation/ValidatorRegistry.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java index 33cb16104b21..bffb418403a3 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/Versioned.java @@ -23,7 +23,7 @@ * Base class defining the version in the entire system. */ public interface Versioned { - static final Comparator VERSIONED_COMPARATOR = Comparator.comparingInt(Versioned::version); + Comparator VERSIONED_COMPARATOR = Comparator.comparingInt(Versioned::version); int version(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java index 7ca6e636884f..473314e0c8c2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/validation/ValidatorRegistry.java @@ -98,7 +98,7 @@ public ValidatorRegistry(Class requestType, String validatorPackage * @param allowedProcessingPhases set of request processing phases which would be allowed to be registered to * the registry. */ - ValidatorRegistry(Class requestType, Collection searchUrls, + ValidatorRegistry(Class requestType, Collection searchUrls, Set> allowedValidators, Set allowedProcessingPhases) { Class requestArrayClass = (Class) Array.newInstance(requestType, 0) From 3ffac6c2b70d4a52d46d041727a2a1c94b957b03 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Thu, 22 May 2025 14:54:41 -0400 Subject: [PATCH 7/9] Resolve merge conflicts Change-Id: I132006b2b5a638e7f19d9ec1beb33b332d105e98 --- hadoop-ozone/cli-shell/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/cli-shell/pom.xml b/hadoop-ozone/cli-shell/pom.xml index 488d9162e477..7521480de7ce 100644 --- a/hadoop-ozone/cli-shell/pom.xml +++ b/hadoop-ozone/cli-shell/pom.xml @@ -177,7 +177,8 @@ org.apache.hadoop.hdds.conf.Config org.apache.hadoop.hdds.conf.ConfigGroup org.apache.hadoop.hdds.scm.metadata.Replicate - org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator + org.apache.hadoop.ozone.om.request.validation.OMClientVersionValidator + org.apache.hadoop.ozone.om.request.validation.OMLayoutVersionValidator From 374351543ad1244beaf8ea502972fd69b6986020 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Wed, 17 Dec 2025 02:39:14 -0500 Subject: [PATCH 8/9] HDDS-12983. Fix checkstyle Change-Id: I461d46461905d041a613b101182d24e18a143d5c --- .../hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java | 2 +- .../hadoop/ozone/om/request/file/OMFileCreateRequest.java | 1 - .../apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java | 3 +-- 3 files changed, 2 insertions(+), 4 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 81be084202b8..02d5c684a853 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,8 +31,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java index ea973699ccef..2221b06b1294 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java @@ -36,7 +36,6 @@ import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList; import org.apache.hadoop.hdds.utils.UniqueId; import org.apache.hadoop.ozone.ClientVersion; -import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OMMetadataManager; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java index a236cae11518..ff9156e42c14 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java @@ -34,9 +34,8 @@ import java.util.Map; import java.util.Objects; import org.apache.commons.lang3.tuple.Pair; -import org.apache.hadoop.ozone.OmUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.ozone.ClientVersion; +import org.apache.hadoop.ozone.OmUtils; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.OzoneManagerVersion; import org.apache.hadoop.ozone.audit.AuditLogger; From a3a696c36c5fea791001205d99947386546d67a7 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Mon, 29 Dec 2025 07:49:17 -0500 Subject: [PATCH 9/9] HDDS-12983. Address review comments Change-Id: Ia2f6792669628c67088b8b5a273fb271476e8848 --- .../request/bucket/OMBucketCreateRequest.java | 12 +++--- .../request/bucket/OMBucketDeleteRequest.java | 4 +- .../bucket/OMBucketSetPropertyRequest.java | 4 +- .../file/OMDirectoryCreateRequest.java | 8 ++-- .../om/request/file/OMFileCreateRequest.java | 8 ++-- .../request/key/OMAllocateBlockRequest.java | 8 ++-- .../om/request/key/OMKeyCommitRequest.java | 12 +++--- .../om/request/key/OMKeyCreateRequest.java | 8 ++-- .../om/request/key/OMKeyDeleteRequest.java | 4 +- .../om/request/key/OMKeyRenameRequest.java | 4 +- .../om/request/key/OMKeysDeleteRequest.java | 4 +- .../om/request/key/OMKeysRenameRequest.java | 4 +- .../request/key/acl/OMKeyAddAclRequest.java | 4 +- .../key/acl/OMKeyRemoveAclRequest.java | 4 +- .../request/key/acl/OMKeySetAclRequest.java | 4 +- .../S3InitiateMultipartUploadRequest.java | 8 ++-- .../S3MultipartUploadAbortRequest.java | 8 ++-- .../S3MultipartUploadCommitPartRequest.java | 8 ++-- .../S3MultipartUploadCompleteRequest.java | 8 ++-- .../OzoneManagerRequestHandler.java | 40 +++++++++---------- .../GeneralValidatorsForTesting.java | 34 ++++++++-------- ...ValidatorsForOnlyOldClientValidations.java | 4 +- 22 files changed, 102 insertions(+), 100 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java index ba6fbedb5135..511ae1263f07 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java @@ -406,9 +406,9 @@ public boolean checkQuotaBytesValid(OMMetadataManager metadataManager, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CreateBucket ) public static OMRequest disallowCreateBucketWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -429,9 +429,9 @@ public static OMRequest disallowCreateBucketWithECReplicationConfig( } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket, - applyBefore = OMLayoutFeature.BUCKET_LAYOUT_SUPPORT + requestType = Type.CreateBucket ) public static OMRequest handleCreateBucketWithBucketLayoutDuringPreFinalize( OMRequest req, ValidationContext ctx) throws OMException { @@ -470,9 +470,9 @@ public static OMRequest handleCreateBucketWithBucketLayoutDuringPreFinalize( * they do not understand. */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateBucket, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CreateBucket ) public static OMRequest setDefaultBucketLayoutForOlderClients(OMRequest req, ValidationContext ctx) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java index ea8016ef949b..5d0b0083d478 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java @@ -276,9 +276,9 @@ private boolean bucketContainsSnapshotInCache( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteBucket, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.DeleteBucket ) public static OMRequest blockBucketDeleteWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java index fa79a9c55073..ce350ad76140 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java @@ -352,9 +352,9 @@ public boolean checkQuotaNamespaceValid(OmVolumeArgs omVolumeArgs, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.SetBucketProperty, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.SetBucketProperty ) public static OMRequest disallowSetBucketPropertyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { 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 02d5c684a853..4fa6b21eef6c 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 @@ -264,9 +264,9 @@ private void logResult(CreateDirectoryRequest createDirectoryRequest, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateDirectory, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CreateDirectory ) public static OMRequest disallowCreateDirectoryWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -297,9 +297,9 @@ public static OMRequest disallowCreateDirectoryWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateDirectory, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CreateDirectory ) public static OMRequest blockCreateDirectoryWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java index 2221b06b1294..fa6dae8685d6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java @@ -382,9 +382,9 @@ protected void checkAllParentsExist(KeyArgs keyArgs, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = CreateFile, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = CreateFile ) public static OMRequest disallowCreateFileWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -414,9 +414,9 @@ public static OMRequest disallowCreateFileWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateFile, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CreateFile ) public static OMRequest blockCreateFileWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java index 262ba853381f..1ad1cf7e8f9a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java @@ -278,9 +278,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AllocateBlock, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.AllocateBlock ) public static OMRequest disallowAllocateBlockWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -308,9 +308,9 @@ public static OMRequest disallowAllocateBlockWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AllocateBlock, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.AllocateBlock ) public static OMRequest blockAllocateBlockWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java index ff9156e42c14..a90b342f6cb0 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java @@ -507,9 +507,9 @@ protected void processResult(CommitKeyRequest commitKeyRequest, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CommitKey ) public static OMRequest disallowCommitKeyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -537,9 +537,9 @@ public static OMRequest disallowCommitKeyWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CommitKey ) public static OMRequest blockCommitKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { @@ -556,9 +556,9 @@ public static OMRequest blockCommitKeyWithBucketLayoutFromOldClient( } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.HBASE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitKey, - applyBefore = OMLayoutFeature.HBASE_SUPPORT + requestType = Type.CommitKey ) public static OMRequest disallowHsync( OMRequest req, ValidationContext ctx) throws OMException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java index 79fb222b36ad..97ff720266af 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java @@ -410,9 +410,9 @@ protected void logResult(CreateKeyRequest createKeyRequest, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateKey, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CreateKey ) public static OMRequest disallowCreateKeyWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -440,9 +440,9 @@ public static OMRequest disallowCreateKeyWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CreateKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CreateKey ) public static OMRequest blockCreateKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java index 76d7f3b73354..3fc06d0a970c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java @@ -248,9 +248,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.DeleteKey ) public static OMRequest blockDeleteKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java index e99d72d7cf45..6ff41120b3b6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java @@ -260,9 +260,9 @@ private Map buildAuditMap( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RenameKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.RenameKey ) public static OMRequest blockRenameKeyWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java index 8d8994c79c02..d64bf86e77e6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java @@ -384,9 +384,9 @@ protected static void addDeletedKeys(Map auditMap, * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.DeleteKeys, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.DeleteKeys ) public static OMRequest blockDeleteKeysWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java index ef472158ce01..08e50801f0d2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java @@ -297,9 +297,9 @@ private Map buildAuditMap(Map auditMap, * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RenameKeys, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.RenameKeys ) public static OMRequest blockRenameKeysWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java index 1ade4d8de269..5f877de8e027 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java @@ -162,9 +162,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AddAcl, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.AddAcl ) public static OMRequest blockAddAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java index 2a151dd21a41..32d8c0454f56 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java @@ -163,9 +163,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.RemoveAcl, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.RemoveAcl ) public static OMRequest blockRemoveAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java index e5542fce149c..79ac89aa7d8b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java @@ -159,9 +159,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, Execut * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.SetAcl, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.SetAcl ) public static OMRequest blockSetAclWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java index 9e7190c9db41..a1a50997d4fd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java @@ -286,9 +286,9 @@ protected void logResult(OzoneManager ozoneManager, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.InitiateMultiPartUpload, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.InitiateMultiPartUpload ) public static OMRequest disallowInitiateMultiPartUploadWithECReplicationConfig( @@ -319,9 +319,9 @@ protected void logResult(OzoneManager ozoneManager, * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.InitiateMultiPartUpload, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.InitiateMultiPartUpload ) public static OMRequest blockInitiateMPUWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java index e9af7a48138d..8a8cfd40f660 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java @@ -257,9 +257,9 @@ protected String getMultipartOpenKey(String multipartUploadID, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AbortMultiPartUpload, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.AbortMultiPartUpload ) public static OMRequest disallowAbortMultiPartUploadWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -288,9 +288,9 @@ public static OMRequest disallowAbortMultiPartUploadWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.AbortMultiPartUpload, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.AbortMultiPartUpload ) public static OMRequest blockMPUAbortWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java index 0ebd20cec3d6..4a7d80600df2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java @@ -372,9 +372,9 @@ private String getMultipartKey(String volumeName, String bucketName, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitMultiPartUpload, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CommitMultiPartUpload ) public static OMRequest disallowCommitMultiPartUploadWithECReplicationConfig( OMRequest req, ValidationContext ctx) throws OMException { @@ -403,9 +403,9 @@ public static OMRequest disallowCommitMultiPartUploadWithECReplicationConfig( * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CommitMultiPartUpload, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CommitMultiPartUpload ) public static OMRequest blockMPUCommitWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java index 9f0c8c17c017..0e2c93d3103b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java @@ -685,9 +685,9 @@ private void updateCache(OMMetadataManager omMetadataManager, } @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CompleteMultiPartUpload, - applyBefore = OMLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT + requestType = Type.CompleteMultiPartUpload ) public static OMRequest disallowCompleteMultiPartUploadWithECReplicationConfig( @@ -717,9 +717,9 @@ private void updateCache(OMMetadataManager omMetadataManager, * @throws OMException if the request is invalid */ @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.PRE_PROCESS, - requestType = Type.CompleteMultiPartUpload, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.CompleteMultiPartUpload ) public static OMRequest blockMPUCompleteWithBucketLayoutFromOldClient( OMRequest req, ValidationContext ctx) throws IOException { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java index f20cbd87bce8..7c7b41e01e24 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java @@ -772,9 +772,9 @@ private ListKeysLightResponse listKeysLight(ListKeysRequest request) } @OMClientVersionValidator( + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListKeys, - applyBefore = ClientVersion.ERASURE_CODING_SUPPORT + requestType = Type.ListKeys ) public static OMResponse disallowListKeysResponseWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -799,9 +799,9 @@ public static OMResponse disallowListKeysResponseWithECReplicationConfig( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListKeys, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.ListKeys ) public static OMResponse disallowListKeysWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -840,9 +840,9 @@ public static OMResponse disallowListKeysWithBucketLayout( } @OMClientVersionValidator( + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListTrash, - applyBefore = ClientVersion.ERASURE_CODING_SUPPORT + requestType = Type.ListTrash ) public static OMResponse disallowListTrashWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -870,9 +870,9 @@ public static OMResponse disallowListTrashWithECReplicationConfig( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListTrash, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.ListTrash ) public static OMResponse disallowListTrashWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1086,9 +1086,9 @@ private RefetchSecretKeyResponse refetchSecretKey() { } @OMClientVersionValidator( + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.GetFileStatus, - applyBefore = ClientVersion.ERASURE_CODING_SUPPORT + requestType = Type.GetFileStatus ) public static OMResponse disallowGetFileStatusWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1115,9 +1115,9 @@ public static OMResponse disallowGetFileStatusWithECReplicationConfig( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.GetFileStatus, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.GetFileStatus ) public static OMResponse disallowGetFileStatusWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1164,9 +1164,9 @@ private LookupFileResponse lookupFile(LookupFileRequest request, } @OMClientVersionValidator( + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupFile, - applyBefore = ClientVersion.ERASURE_CODING_SUPPORT + requestType = Type.LookupFile ) public static OMResponse disallowLookupFileWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1192,9 +1192,9 @@ public static OMResponse disallowLookupFileWithECReplicationConfig( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.LookupFile, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.LookupFile ) public static OMResponse disallowLookupFileWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1274,9 +1274,9 @@ private ListStatusLightResponse listStatusLight( } @OMClientVersionValidator( + applyBefore = ClientVersion.ERASURE_CODING_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListStatus, - applyBefore = ClientVersion.ERASURE_CODING_SUPPORT + requestType = Type.ListStatus ) public static OMResponse disallowListStatusResponseWithECReplicationConfig( OMRequest req, OMResponse resp, ValidationContext ctx) @@ -1302,9 +1302,9 @@ public static OMResponse disallowListStatusResponseWithECReplicationConfig( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = RequestProcessingPhase.POST_PROCESS, - requestType = Type.ListStatus, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = Type.ListStatus ) public static OMResponse disallowListStatusResponseWithBucketLayout( OMRequest req, OMResponse resp, ValidationContext ctx) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java index b0b3ddd514a1..18184196b0fa 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset1/GeneralValidatorsForTesting.java @@ -130,9 +130,9 @@ public static OMRequest preProcessCreateKeyBucketLayoutClientValidator( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = POST_PROCESS, - requestType = CreateKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + requestType = CreateKey) public static OMResponse postProcessCreateKeyBucketLayoutClientValidator( OMRequest req, OMResponse resp, ValidationContext ctx) { fireValidationEvent("postProcessCreateKeyBucketLayoutClientValidator"); @@ -140,12 +140,13 @@ public static OMResponse postProcessCreateKeyBucketLayoutClientValidator( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = PRE_PROCESS, - requestType = CreateVolume, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) - @OMLayoutVersionValidator(processingPhase = PRE_PROCESS, - requestType = CreateVolume, - applyBefore = OMLayoutFeature.QUOTA) + requestType = CreateVolume) + @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.QUOTA, + processingPhase = PRE_PROCESS, + requestType = CreateVolume) public static OMRequest multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( OMRequest req, ValidationContext ctx) { fireValidationEvent("multiPurposePreProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); @@ -153,12 +154,13 @@ public static OMRequest multiPurposePreProcessCreateVolumeBucketLayoutCLientQuot } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = POST_PROCESS, - requestType = CreateVolume, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) - @OMLayoutVersionValidator(processingPhase = POST_PROCESS, - requestType = CreateVolume, - applyBefore = OMLayoutFeature.QUOTA) + requestType = CreateVolume) + @OMLayoutVersionValidator( + applyBefore = OMLayoutFeature.QUOTA, + processingPhase = POST_PROCESS, + requestType = CreateVolume) public static OMResponse multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator( OMRequest req, OMResponse resp, ValidationContext ctx) { fireValidationEvent("multiPurposePostProcessCreateVolumeBucketLayoutCLientQuotaLayoutValidator"); @@ -166,9 +168,9 @@ public static OMResponse multiPurposePostProcessCreateVolumeBucketLayoutCLientQu } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = PRE_PROCESS, - requestType = DeleteKeys, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = DeleteKeys ) public static OMRequest throwingPreProcessDeleteKeyBucketLayoutClientValidator( OMRequest req, ValidationContext ctx) throws IOException { @@ -180,9 +182,9 @@ public static OMRequest throwingPreProcessDeleteKeyBucketLayoutClientValidator( } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = POST_PROCESS, - requestType = DeleteKeys, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT + requestType = DeleteKeys ) public static OMResponse throwingPostProcessDeleteKeyBucketLayoutClientValidator( OMRequest req, OMResponse resp, ValidationContext ctx) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java index 253e4ea45df4..15bfa00ed37b 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/validation/testvalidatorset2/ValidatorsForOnlyOldClientValidations.java @@ -34,9 +34,9 @@ public final class ValidatorsForOnlyOldClientValidations { private ValidatorsForOnlyOldClientValidations() { } @OMClientVersionValidator( + applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT, processingPhase = PRE_PROCESS, - requestType = CreateKey, - applyBefore = ClientVersion.BUCKET_LAYOUT_SUPPORT) + requestType = CreateKey) public static OMRequest preProcessCreateKeyBucketLayoutClientValidator( OMRequest req, ValidationContext ctx) { return req;