You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by wa...@apache.org on 2017/09/12 16:26:44 UTC

[11/40] hadoop git commit: YARN-5586. Update the Resources class to consider all resource types. Contributed by Varun Vasudev.

YARN-5586. Update the Resources class to consider all resource types. Contributed by Varun Vasudev.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/239c1824
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/239c1824
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/239c1824

Branch: refs/heads/trunk
Commit: 239c1824a07fede71dd751ed2c1f40036b22170e
Parents: 9e4ba6a
Author: Rohith Sharma K S <ro...@apache.org>
Authored: Mon Sep 12 10:44:26 2016 +0530
Committer: Wangda Tan <wa...@apache.org>
Committed: Tue Sep 12 09:19:10 2017 -0700

----------------------------------------------------------------------
 .../api/records/impl/pb/ResourcePBImpl.java     |   4 +-
 .../resource/DominantResourceCalculator.java    |  36 ++--
 .../yarn/util/resource/ResourceUtils.java       |   3 +-
 .../hadoop/yarn/util/resource/Resources.java    | 138 +++++++++++--
 .../yarn/util/resource/TestResourceUtils.java   |  23 +++
 .../yarn/util/resource/TestResources.java       | 207 +++++++++++++++++--
 .../resourcemanager/resource/TestResources.java |  43 ----
 7 files changed, 366 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourcePBImpl.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourcePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourcePBImpl.java
index b51121b..63b466b 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourcePBImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ResourcePBImpl.java
@@ -170,7 +170,9 @@ public class ResourcePBImpl extends Resource {
       resourceInformation.setName(resource);
     }
     initResources();
-    resources.put(resource, resourceInformation);
+    if (resources.containsKey(resource)) {
+      resources.put(resource, resourceInformation);
+    }
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
index 3c4413c..7db1da4 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
@@ -183,8 +183,10 @@ public class DominantResourceCalculator extends ResourceCalculator {
         Long requiredResourceValue = UnitsConversionUtil
             .convert(requiredResource.getUnits(), availableResource.getUnits(),
                 requiredResource.getValue());
-        Long tmp = availableResource.getValue() / requiredResourceValue;
-        min = min < tmp ? min : tmp;
+        if (requiredResourceValue != 0) {
+          Long tmp = availableResource.getValue() / requiredResourceValue;
+          min = min < tmp ? min : tmp;
+        }
       } catch (YarnException ye) {
         throw new IllegalArgumentException(
             "Error getting resource information for " + resource, ye);
@@ -301,10 +303,11 @@ public class DominantResourceCalculator extends ResourceCalculator {
             .convert(stepFactorResourceInformation.getUnits(),
                 rResourceInformation.getUnits(),
                 stepFactorResourceInformation.getValue());
-
-        tmp.setValue(
-            Math.min(roundUp(Math.max(rValue, minimumValue), stepFactorValue),
-                maximumValue));
+        Long value = Math.max(rValue, minimumValue);
+        if (stepFactorValue != 0) {
+          value = roundUp(value, stepFactorValue);
+        }
+        tmp.setValue(Math.min(value, maximumValue));
         ret.setResourceInformation(resource, tmp);
       } catch (YarnException ye) {
         throw new IllegalArgumentException(
@@ -340,9 +343,11 @@ public class DominantResourceCalculator extends ResourceCalculator {
             .convert(stepFactorResourceInformation.getUnits(),
                 rResourceInformation.getUnits(),
                 stepFactorResourceInformation.getValue());
-
-        Long value = roundUp ? roundUp(rValue, stepFactorValue) :
-            roundDown(rValue, stepFactorValue);
+        Long value = rValue;
+        if (stepFactorValue != 0) {
+          value = roundUp ? roundUp(rValue, stepFactorValue) :
+              roundDown(rValue, stepFactorValue);
+        }
         tmp.setValue(value);
         ret.setResourceInformation(resource, tmp);
       } catch (YarnException ye) {
@@ -382,10 +387,15 @@ public class DominantResourceCalculator extends ResourceCalculator {
             .convert(stepFactorResourceInformation.getUnits(),
                 rResourceInformation.getUnits(),
                 stepFactorResourceInformation.getValue());
-
-        Long value =
-            roundUp ? roundUp((long) Math.ceil(rValue * by), stepFactorValue) :
-                roundDown((long) (rValue * by), stepFactorValue);
+        Long value;
+        if (stepFactorValue != 0) {
+          value = roundUp ?
+              roundUp((long) Math.ceil(rValue * by), stepFactorValue) :
+              roundDown((long) (rValue * by), stepFactorValue);
+        } else {
+          value =
+              roundUp ? (long) Math.ceil(rValue * by) : (long) (rValue * by);
+        }
         tmp.setValue(value);
         ret.setResourceInformation(resource, tmp);
       } catch (YarnException ye) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java
index 109287a..938e462 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java
@@ -241,7 +241,7 @@ public class ResourceUtils {
     lock = null;
   }
 
-  private static String getUnits(String resourceValue) {
+  public static String getUnits(String resourceValue) {
     String units;
     for (int i = 0; i < resourceValue.length(); i++) {
       if (Character.isAlphabetic(resourceValue.charAt(i))) {
@@ -325,4 +325,5 @@ public class ResourceUtils {
   synchronized public static void resetNodeResources() {
     nodeLock = null;
   }
+
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java
----------------------------------------------------------------------
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 73776e7..a591be9 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
@@ -25,6 +25,7 @@ import org.apache.hadoop.yarn.api.records.ResourceInformation;
 import org.apache.hadoop.yarn.exceptions.ResourceNotFoundException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.util.Records;
+import org.apache.hadoop.yarn.util.UnitsConversionUtil;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -142,6 +143,11 @@ public class Resources {
           tmp.get(entry.getKey()).setValue(resourceValue);
         }
       }
+      // this is a fix for getVirtualCores returning an int
+      if (resourceValue > Integer.MAX_VALUE) {
+        tmp.get(ResourceInformation.VCORES.getName())
+            .setValue((long) Integer.MAX_VALUE);
+      }
       return tmp;
     }
 
@@ -187,12 +193,30 @@ public class Resources {
   }
 
   public static Resource clone(Resource res) {
-    return createResource(res.getMemorySize(), res.getVirtualCores());
+    Resource ret = Resource.newInstance(0, 0);
+    for (Map.Entry<String, ResourceInformation> entry : res.getResources()
+        .entrySet()) {
+      ret.setResourceInformation(entry.getKey(),
+          ResourceInformation.newInstance(entry.getValue()));
+    }
+    return ret;
   }
 
   public static Resource addTo(Resource lhs, Resource rhs) {
-    lhs.setMemorySize(lhs.getMemorySize() + rhs.getMemorySize());
-    lhs.setVirtualCores(lhs.getVirtualCores() + rhs.getVirtualCores());
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = rhs.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue());
+        lhs.setResourceValue(name, lhsValue.getValue() + convertedRhs);
+      } catch (YarnException ye) {
+        continue;
+      }
+    }
     return lhs;
   }
 
@@ -201,8 +225,20 @@ public class Resources {
   }
 
   public static Resource subtractFrom(Resource lhs, Resource rhs) {
-    lhs.setMemorySize(lhs.getMemorySize() - rhs.getMemorySize());
-    lhs.setVirtualCores(lhs.getVirtualCores() - rhs.getVirtualCores());
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = rhs.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue());
+        lhs.setResourceValue(name, lhsValue.getValue() - convertedRhs);
+      } catch (YarnException ye) {
+        continue;
+      }
+    }
     return lhs;
   }
 
@@ -233,8 +269,12 @@ public class Resources {
   }
 
   public static Resource multiplyTo(Resource lhs, double by) {
-    lhs.setMemorySize((long)(lhs.getMemorySize() * by));
-    lhs.setVirtualCores((int)(lhs.getVirtualCores() * by));
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      ResourceInformation lhsValue = entry.getValue();
+      lhs.setResourceValue(name, (long) (lhsValue.getValue() * by));
+    }
     return lhs;
   }
 
@@ -248,9 +288,20 @@ public class Resources {
    */
   public static Resource multiplyAndAddTo(
       Resource lhs, Resource rhs, double by) {
-    lhs.setMemorySize(lhs.getMemorySize() + (long)(rhs.getMemorySize() * by));
-    lhs.setVirtualCores(lhs.getVirtualCores()
-        + (int)(rhs.getVirtualCores() * by));
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = rhs.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = (long) (UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue()) * by);
+        lhs.setResourceValue(name, lhsValue.getValue() + convertedRhs);
+      } catch (YarnException ye) {
+        continue;
+      }
+    }
     return lhs;
   }
 
@@ -266,8 +317,12 @@ public class Resources {
   
   public static Resource multiplyAndRoundDown(Resource lhs, double by) {
     Resource out = clone(lhs);
-    out.setMemorySize((long)(lhs.getMemorySize() * by));
-    out.setVirtualCores((int)(lhs.getVirtualCores() * by));
+    for (Map.Entry<String, ResourceInformation> entry : out.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      ResourceInformation lhsValue = entry.getValue();
+      out.setResourceValue(name, (long) (lhsValue.getValue() * by));
+    }
     return out;
   }
 
@@ -367,8 +422,23 @@ public class Resources {
   }
   
   public static boolean fitsIn(Resource smaller, Resource bigger) {
-    return smaller.getMemorySize() <= bigger.getMemorySize() &&
-        smaller.getVirtualCores() <= bigger.getVirtualCores();
+    for (Map.Entry<String, ResourceInformation> entry : smaller.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = bigger.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue());
+        if(lhsValue.getValue() > convertedRhs) {
+          return false;
+        }
+      } catch (YarnException ye) {
+        return false;
+      }
+    }
+    return true;
   }
 
   public static boolean fitsIn(ResourceCalculator rc, Resource cluster,
@@ -377,13 +447,45 @@ public class Resources {
   }
   
   public static Resource componentwiseMin(Resource lhs, Resource rhs) {
-    return createResource(Math.min(lhs.getMemorySize(), rhs.getMemorySize()),
-        Math.min(lhs.getVirtualCores(), rhs.getVirtualCores()));
+    Resource ret = createResource(0);
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = rhs.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue());
+        ResourceInformation outInfo =
+            lhsValue.getValue() < convertedRhs ? lhsValue : rhsValue;
+        ret.setResourceInformation(name, outInfo);
+      } catch (YarnException ye) {
+        continue;
+      }
+    }
+    return ret;
   }
   
   public static Resource componentwiseMax(Resource lhs, Resource rhs) {
-    return createResource(Math.max(lhs.getMemorySize(), rhs.getMemorySize()),
-        Math.max(lhs.getVirtualCores(), rhs.getVirtualCores()));
+    Resource ret = createResource(0);
+    for (Map.Entry<String, ResourceInformation> entry : lhs.getResources()
+        .entrySet()) {
+      String name = entry.getKey();
+      try {
+        ResourceInformation rhsValue = rhs.getResourceInformation(name);
+        ResourceInformation lhsValue = entry.getValue();
+        Long convertedRhs = UnitsConversionUtil
+            .convert(rhsValue.getUnits(), lhsValue.getUnits(),
+                rhsValue.getValue());
+        ResourceInformation outInfo =
+            lhsValue.getValue() > convertedRhs ? lhsValue : rhsValue;
+        ret.setResourceInformation(name, outInfo);
+      } catch (YarnException ye) {
+        continue;
+      }
+    }
+    return ret;
   }
 
   public static boolean isAnyMajorResourceZero(ResourceCalculator rc,

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java
index ab014dd..6f17659 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.ResourceTypes;
 import org.apache.hadoop.yarn.api.records.Resource;
 import org.apache.hadoop.yarn.api.records.ResourceInformation;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -51,6 +52,17 @@ public class TestResourceUtils {
     ResourceUtils.resetResourceTypes();
   }
 
+  @After
+  public void teardown() {
+    Configuration conf = new YarnConfiguration();
+    File source = new File(
+        conf.getClassLoader().getResource("resource-types-1.xml").getFile());
+    File dest = new File(source.getParent(), "resource-types.xml");
+    if (dest.exists()) {
+      dest.delete();
+    }
+  }
+
   private void testMemoryAndVcores(Map<String, ResourceInformation> res) {
     String memory = ResourceInformation.MEMORY_MB.getName();
     String vcores = ResourceInformation.VCORES.getName();
@@ -251,6 +263,7 @@ public class TestResourceUtils {
 
     Configuration conf = new YarnConfiguration();
     Map<String, Resource> testRun = new HashMap<>();
+    setupResourceTypes(conf, "resource-types-4.xml");
     // testRun.put("node-resources-1.xml", Resource.newInstance(1024, 1));
     Resource test3Resources = Resource.newInstance(1024, 1);
     test3Resources.setResourceInformation("resource1",
@@ -272,4 +285,14 @@ public class TestResourceUtils {
       Assert.assertEquals(entry.getValue().getResources(), actual);
     }
   }
+
+  public static String setupResourceTypes(Configuration conf, String filename)
+      throws Exception {
+    File source = new File(
+        conf.getClassLoader().getResource(filename).getFile());
+    File dest = new File(source.getParent(), "resource-types.xml");
+    FileUtils.copyFile(source, dest);
+    ResourceUtils.getResourceTypes();
+    return dest.getAbsolutePath();
+  }
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResources.java
----------------------------------------------------------------------
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 d79179a..d81dcdb 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
@@ -18,35 +18,93 @@
 
 package org.apache.hadoop.yarn.util.resource;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceInformation;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
+import java.io.File;
+
+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.subtract;
+import static org.apache.hadoop.yarn.util.resource.Resources.multiply;
+import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndAddTo;
+import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndRoundDown;
+import static org.apache.hadoop.yarn.util.resource.Resources.fitsIn;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class TestResources {
-  
+
+  private static final String EXTRA_RESOURCE_TYPE = "resource2";
+  private String resourceTypesFile;
+
+  private void setupExtraResourceType() throws Exception {
+    Configuration conf = new YarnConfiguration();
+    resourceTypesFile =
+        TestResourceUtils.setupResourceTypes(conf, "resource-types-3.xml");
+  }
+
+  private void unsetExtraResourceType() {
+    deleteResourceTypesFile();
+    ResourceUtils.resetResourceTypes();
+  }
+
+  private void deleteResourceTypesFile() {
+    if (resourceTypesFile != null && !resourceTypesFile.isEmpty()) {
+      File resourceFile = new File(resourceTypesFile);
+      resourceFile.delete();
+    }
+  }
+
+  @Before
+  public void setup() throws Exception {
+    setupExtraResourceType();
+  }
+
+  @After
+  public void teardown() {
+    deleteResourceTypesFile();
+  }
+
   public Resource createResource(long memory, int vCores) {
     return Resource.newInstance(memory, vCores);
   }
 
-  @Test(timeout=10000)
+  public Resource createResource(long memory, int vCores, long resource2) {
+    Resource ret = Resource.newInstance(memory, vCores);
+    ret.setResourceInformation(EXTRA_RESOURCE_TYPE,
+        ResourceInformation.newInstance(EXTRA_RESOURCE_TYPE, resource2));
+    return ret;
+  }
+
+  @Test(timeout = 10000)
   public void testCompareToWithUnboundedResource() {
-    assertTrue(Resources.unbounded().compareTo(
-            createResource(Long.MAX_VALUE, Integer.MAX_VALUE)) == 0);
-    assertTrue(Resources.unbounded().compareTo(
-        createResource(Long.MAX_VALUE, 0)) > 0);
-    assertTrue(Resources.unbounded().compareTo(
-        createResource(0, Integer.MAX_VALUE)) > 0);
+    unsetExtraResourceType();
+    Resource unboundedClone = Resources.clone(Resources.unbounded());
+    assertTrue(unboundedClone
+        .compareTo(createResource(Long.MAX_VALUE, Integer.MAX_VALUE)) == 0);
+    assertTrue(unboundedClone.compareTo(createResource(Long.MAX_VALUE, 0)) > 0);
+    assertTrue(
+        unboundedClone.compareTo(createResource(0, Integer.MAX_VALUE)) > 0);
   }
 
   @Test(timeout=10000)
   public void testCompareToWithNoneResource() {
     assertTrue(Resources.none().compareTo(createResource(0, 0)) == 0);
-    assertTrue(Resources.none().compareTo(
-        createResource(1, 0)) < 0);
-    assertTrue(Resources.none().compareTo(
-        createResource(0, 1)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(1, 0)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(0, 1)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(0, 0, 0)) == 0);
+    assertTrue(Resources.none().compareTo(createResource(1, 0, 0)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(0, 1, 0)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(0, 0, 1)) < 0);
+    assertTrue(Resources.none().compareTo(createResource(0, 0, 1)) < 0);
   }
 
   @Test(timeout=10000)
@@ -69,4 +127,129 @@ public class TestResources {
     assertEquals(memoryErrorMsg, result.getMemorySize(), 0);
     assertEquals(vcoreErrorMsg, result.getVirtualCores(), 0);
   }
+
+  @Test(timeout = 1000)
+  public void testFitsIn() {
+    assertTrue(fitsIn(createResource(1, 1), createResource(2, 2)));
+    assertTrue(fitsIn(createResource(2, 2), createResource(2, 2)));
+    assertFalse(fitsIn(createResource(2, 2), createResource(1, 1)));
+    assertFalse(fitsIn(createResource(1, 2), createResource(2, 1)));
+    assertFalse(fitsIn(createResource(2, 1), createResource(1, 2)));
+    assertTrue(fitsIn(createResource(1, 1, 1), createResource(2, 2, 2)));
+    assertTrue(fitsIn(createResource(1, 1, 0), createResource(2, 2, 0)));
+    assertTrue(fitsIn(createResource(1, 1, 1), createResource(2, 2, 2)));
+  }
+
+  @Test(timeout = 1000)
+  public void testComponentwiseMin() {
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(1, 1), createResource(2, 2)));
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(2, 2), createResource(1, 1)));
+    assertEquals(createResource(1, 1),
+        componentwiseMin(createResource(1, 2), createResource(2, 1)));
+    assertEquals(createResource(1, 1, 1),
+        componentwiseMin(createResource(1, 1, 1), createResource(2, 2, 2)));
+    assertEquals(createResource(1, 1, 0),
+        componentwiseMin(createResource(2, 2, 2), createResource(1, 1)));
+    assertEquals(createResource(1, 1, 2),
+        componentwiseMin(createResource(1, 2, 2), createResource(2, 1, 3)));
+  }
+
+  @Test
+  public void testComponentwiseMax() {
+    assertEquals(createResource(2, 2),
+        componentwiseMax(createResource(1, 1), createResource(2, 2)));
+    assertEquals(createResource(2, 2),
+        componentwiseMax(createResource(2, 2), createResource(1, 1)));
+    assertEquals(createResource(2, 2),
+        componentwiseMax(createResource(1, 2), createResource(2, 1)));
+    assertEquals(createResource(2, 2, 2),
+        componentwiseMax(createResource(1, 1, 1), createResource(2, 2, 2)));
+    assertEquals(createResource(2, 2, 2),
+        componentwiseMax(createResource(2, 2, 2), createResource(1, 1)));
+    assertEquals(createResource(2, 2, 3),
+        componentwiseMax(createResource(1, 2, 2), createResource(2, 1, 3)));
+    assertEquals(createResource(2, 2, 1),
+        componentwiseMax(createResource(2, 2, 0), createResource(2, 1, 1)));
+  }
+
+  @Test
+  public void testAdd() {
+    assertEquals(createResource(2, 3),
+        add(createResource(1, 1), createResource(1, 2)));
+    assertEquals(createResource(3, 2),
+        add(createResource(1, 1), createResource(2, 1)));
+    assertEquals(createResource(2, 2, 0),
+        add(createResource(1, 1, 0), createResource(1, 1, 0)));
+    assertEquals(createResource(2, 2, 3),
+        add(createResource(1, 1, 1), createResource(1, 1, 2)));
+  }
+
+  @Test
+  public void testSubtract() {
+    assertEquals(createResource(1, 0),
+        subtract(createResource(2, 1), createResource(1, 1)));
+    assertEquals(createResource(0, 1),
+        subtract(createResource(1, 2), createResource(1, 1)));
+    assertEquals(createResource(2, 2, 0),
+        subtract(createResource(3, 3, 0), createResource(1, 1, 0)));
+    assertEquals(createResource(1, 1, 2),
+        subtract(createResource(2, 2, 3), createResource(1, 1, 1)));
+  }
+
+  @Test
+  public void testClone() {
+    assertEquals(createResource(1, 1), Resources.clone(createResource(1, 1)));
+    assertEquals(createResource(1, 1, 0),
+        Resources.clone(createResource(1, 1)));
+    assertEquals(createResource(1, 1),
+        Resources.clone(createResource(1, 1, 0)));
+    assertEquals(createResource(1, 1, 2),
+        Resources.clone(createResource(1, 1, 2)));
+  }
+
+  @Test
+  public void testMultiply() {
+    assertEquals(createResource(4, 2), multiply(createResource(2, 1), 2));
+    assertEquals(createResource(4, 2, 0), multiply(createResource(2, 1), 2));
+    assertEquals(createResource(2, 4), multiply(createResource(1, 2), 2));
+    assertEquals(createResource(2, 4, 0), multiply(createResource(1, 2), 2));
+    assertEquals(createResource(6, 6, 0), multiply(createResource(3, 3, 0), 2));
+    assertEquals(createResource(4, 4, 6), multiply(createResource(2, 2, 3), 2));
+  }
+
+  @Test
+  public void testMultiplyAndRoundDown() {
+    assertEquals(createResource(4, 1),
+        multiplyAndRoundDown(createResource(3, 1), 1.5));
+    assertEquals(createResource(4, 1, 0),
+        multiplyAndRoundDown(createResource(3, 1), 1.5));
+    assertEquals(createResource(1, 4),
+        multiplyAndRoundDown(createResource(1, 3), 1.5));
+    assertEquals(createResource(1, 4, 0),
+        multiplyAndRoundDown(createResource(1, 3), 1.5));
+    assertEquals(createResource(7, 7, 0),
+        multiplyAndRoundDown(createResource(3, 3, 0), 2.5));
+    assertEquals(createResource(2, 2, 7),
+        multiplyAndRoundDown(createResource(1, 1, 3), 2.5));
+  }
+
+  @Test
+  public void testMultiplyAndAddTo() {
+    assertEquals(createResource(6, 4),
+        multiplyAndAddTo(createResource(3, 1), createResource(2, 2), 1.5));
+    assertEquals(createResource(6, 4, 0),
+        multiplyAndAddTo(createResource(3, 1), createResource(2, 2), 1.5));
+    assertEquals(createResource(4, 7),
+        multiplyAndAddTo(createResource(1, 1), createResource(2, 4), 1.5));
+    assertEquals(createResource(4, 7, 0),
+        multiplyAndAddTo(createResource(1, 1), createResource(2, 4), 1.5));
+    assertEquals(createResource(6, 4, 0),
+        multiplyAndAddTo(createResource(3, 1, 0), createResource(2, 2, 0),
+            1.5));
+    assertEquals(createResource(6, 4, 6),
+        multiplyAndAddTo(createResource(3, 1, 2), createResource(2, 2, 3),
+            1.5));
+  }
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/239c1824/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResources.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResources.java
deleted file mode 100644
index 2a10747..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResources.java
+++ /dev/null
@@ -1,43 +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.yarn.server.resourcemanager.resource;
-
-import static org.apache.hadoop.yarn.util.resource.Resources.*;
-import static org.junit.Assert.*;
-import org.junit.Test;
-
-public class TestResources {
-  @Test(timeout=10000)
-  public void testFitsIn() {
-    assertTrue(fitsIn(createResource(1, 1), createResource(2, 2)));
-    assertTrue(fitsIn(createResource(2, 2), createResource(2, 2)));
-    assertFalse(fitsIn(createResource(2, 2), createResource(1, 1)));
-    assertFalse(fitsIn(createResource(1, 2), createResource(2, 1)));
-    assertFalse(fitsIn(createResource(2, 1), createResource(1, 2)));
-  }
-  
-  @Test(timeout=10000)
-  public void testComponentwiseMin() {
-    assertEquals(createResource(1, 1),
-        componentwiseMin(createResource(1, 1), createResource(2, 2)));
-    assertEquals(createResource(1, 1),
-        componentwiseMin(createResource(2, 2), createResource(1, 1)));
-    assertEquals(createResource(1, 1),
-        componentwiseMin(createResource(1, 2), createResource(2, 1)));
-  }
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org