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 47641475455..1993b0c47e4 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 @@ -368,7 +368,6 @@ public static Resource multiplyAndRoundDown(Resource lhs, double by) { out.setResourceValue(i, (long) (lhsValue.getValue() * by)); } catch (ResourceNotFoundException ye) { LOG.warn("Resource is missing:" + ye.getMessage()); - continue; } } return out; @@ -376,8 +375,15 @@ public static Resource multiplyAndRoundDown(Resource lhs, double by) { public static Resource multiplyAndRoundUp(Resource lhs, double by) { Resource out = clone(lhs); - out.setMemorySize((long)Math.ceil(lhs.getMemorySize() * by)); - out.setVirtualCores((int)Math.ceil(lhs.getVirtualCores() * by)); + int maxLength = ResourceUtils.getNumberOfKnownResourceTypes(); + for (int i = 0; i < maxLength; i++) { + try { + ResourceInformation lhsValue = lhs.getResourceInformation(i); + out.setResourceValue(i, (long) Math.ceil(lhsValue.getValue() * by)); + } catch (ResourceNotFoundException ye) { + LOG.warn("Resource is missing:" + ye.getMessage()); + } + } return out; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResources.java index ecd940ea98b..58005b9ac54 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResources.java @@ -31,6 +31,7 @@ import static org.apache.hadoop.yarn.util.resource.Resources.componentwiseMin; import static org.apache.hadoop.yarn.util.resource.Resources.componentwiseMax; import static org.apache.hadoop.yarn.util.resource.Resources.add; +import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndRoundUp; import static org.apache.hadoop.yarn.util.resource.Resources.subtract; import static org.apache.hadoop.yarn.util.resource.Resources.multiply; import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndAddTo; @@ -116,27 +117,6 @@ public void testCompareToWithNoneResource() { assertTrue(Resources.none().compareTo(createResource(0, 0, 1)) < 0); } - @Test(timeout=10000) - public void testMultipleRoundUp() { - final double by = 0.5; - final String memoryErrorMsg = "Invalid memory size."; - final String vcoreErrorMsg = "Invalid virtual core number."; - Resource resource = Resources.createResource(1, 1); - Resource result = Resources.multiplyAndRoundUp(resource, by); - assertEquals(memoryErrorMsg, result.getMemorySize(), 1); - assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1); - - resource = Resources.createResource(2, 2); - result = Resources.multiplyAndRoundUp(resource, by); - assertEquals(memoryErrorMsg, result.getMemorySize(), 1); - assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1); - - resource = Resources.createResource(0, 0); - result = Resources.multiplyAndRoundUp(resource, by); - assertEquals(memoryErrorMsg, result.getMemorySize(), 0); - assertEquals(vcoreErrorMsg, result.getVirtualCores(), 0); - } - @Test(timeout = 1000) public void testFitsIn() { assertTrue(fitsIn(createResource(1, 1), createResource(2, 2))); @@ -228,6 +208,43 @@ public void testMultiply() { assertEquals(createResource(4, 4, 6), multiply(createResource(2, 2, 3), 2)); } + @Test(timeout=10000) + public void testMultipleRoundUp() { + final double by = 0.5; + final String memoryErrorMsg = "Invalid memory size."; + final String vcoreErrorMsg = "Invalid virtual core number."; + Resource resource = Resources.createResource(1, 1); + Resource result = Resources.multiplyAndRoundUp(resource, by); + assertEquals(memoryErrorMsg, result.getMemorySize(), 1); + assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1); + + resource = Resources.createResource(2, 2); + result = Resources.multiplyAndRoundUp(resource, by); + assertEquals(memoryErrorMsg, result.getMemorySize(), 1); + assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1); + + resource = Resources.createResource(0, 0); + result = Resources.multiplyAndRoundUp(resource, by); + assertEquals(memoryErrorMsg, result.getMemorySize(), 0); + assertEquals(vcoreErrorMsg, result.getVirtualCores(), 0); + } + + @Test + public void testMultiplyAndRoundUpCustomResources() { + assertEquals(createResource(5, 2, 8), + multiplyAndRoundUp(createResource(3, 1, 5), 1.5)); + assertEquals(createResource(5, 2, 0), + multiplyAndRoundUp(createResource(3, 1, 0), 1.5)); + assertEquals(createResource(5, 5, 0), + multiplyAndRoundUp(createResource(3, 3, 0), 1.5)); + assertEquals(createResource(8, 3, 13), + multiplyAndRoundUp(createResource(3, 1, 5), 2.5)); + assertEquals(createResource(8, 3, 0), + multiplyAndRoundUp(createResource(3, 1, 0), 2.5)); + assertEquals(createResource(8, 8, 0), + multiplyAndRoundUp(createResource(3, 3, 0), 2.5)); + } + @Test public void testMultiplyAndRoundDown() { assertEquals(createResource(4, 1),