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 1fabae8cc2c..14131cbf563 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 void setResourceValue(int index, long value) } } - 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 674f9de5a69..703f32521ff 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 @@ -266,6 +266,7 @@ public static void initializeResourcesFromResourceInformationMap( 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 793aebfe0d8..e044ea30dba 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 @@ -125,6 +125,65 @@ public void setResourceValue(String resource, long value) 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) {