diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Resource.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Resource.java index 6bdde180e64..be292ff9a20 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Resource.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Resource.java @@ -364,7 +364,7 @@ public abstract class Resource implements Comparable { } } - private void throwExceptionWhenArrayOutOfBound(int index) { + protected void throwExceptionWhenArrayOutOfBound(int index) { String exceptionMsg = String.format( "Trying to access ResourceInformation for given index=%d. " + "Acceptable index range is [0,%d), please check double check " diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java index 8f75909cc58..c9cc27b3119 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java @@ -267,6 +267,7 @@ public class ResourceUtils { updateKnownResources(); updateResourceTypeIndex(); initializedResources = true; + numKnownResourceTypes = resourceTypes.size(); } private static void updateKnownResources() { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java index 36909461951..068e7f1cb3e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java @@ -118,6 +118,65 @@ public class Resources { throw new RuntimeException(name + " cannot be modified!"); } + /* + * FixedValueResource cannot be updated when any resource types refresh + * by using approach introduced by YARN-7307 and do operations like + * Resources.compare(resource_x, Resources.none()) will throw exceptions. + * + * That's why we do reinitialize resource maps for following methods. + */ + + @Override + public ResourceInformation getResourceInformation(int index) + throws ResourceNotFoundException { + ResourceInformation ri = null; + try { + ri = super.getResourceInformation(index); + } catch (ResourceNotFoundException e) { + // Retry once to reinitialize resource information. + initResourceMap(); + try { + return super.getResourceInformation(index); + } catch (ResourceNotFoundException ee) { + throwExceptionWhenArrayOutOfBound(index); + } + } + return ri; + } + + @Override + public ResourceInformation getResourceInformation(String resource) + throws ResourceNotFoundException { + ResourceInformation ri; + try { + ri = super.getResourceInformation(resource); + } catch (ResourceNotFoundException e) { + // Retry once to reinitialize resource information. + initResourceMap(); + try { + return super.getResourceInformation(resource); + } catch (ResourceNotFoundException ee) { + throw ee; + } + } + return ri; + } + + @Override + public ResourceInformation[] getResources() { + if (resources.length != ResourceUtils.getNumberOfKnownResourceTypes()) { + // Retry once to reinitialize resource information. + initResourceMap(); + if (resources.length != ResourceUtils.getNumberOfKnownResourceTypes()) { + throw new ResourceNotFoundException("Failed to reinitialize " + + "FixedValueResource to get number of resource types same " + + "as configured"); + } + } + + return resources; + } + private void initResourceMap() { ResourceInformation[] types = ResourceUtils.getResourceTypesArray(); if (types != null) {