diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/LocalityMulticastAMRMProxyPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/LocalityMulticastAMRMProxyPolicy.java index 6f97a51693..454962f63f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/LocalityMulticastAMRMProxyPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/LocalityMulticastAMRMProxyPolicy.java @@ -261,7 +261,11 @@ public Map> splitResourceRequests( // If home-subcluster is not active, ignore node/rack request if (bookkeeper.isActiveAndEnabled(homeSubcluster)) { - bookkeeper.addLocalizedNodeRR(homeSubcluster, rr); + if (targetIds != null && targetIds.size() > 0) { + bookkeeper.addRackRR(homeSubcluster, rr); + } else { + bookkeeper.addLocalizedNodeRR(homeSubcluster, rr); + } } else { if (LOG.isDebugEnabled()) { LOG.debug("The homeSubCluster (" + homeSubcluster + ") we are " diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/TestLocalityMulticastAMRMProxyPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/TestLocalityMulticastAMRMProxyPolicy.java index 5b3cf74d9a..6e3a2f14ef 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/TestLocalityMulticastAMRMProxyPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/TestLocalityMulticastAMRMProxyPolicy.java @@ -339,19 +339,20 @@ public void testSplitAllocateRequest() throws Exception { validateSplit(response, resourceRequests); prettyPrintRequests(response); - // we expect 4 entry for home subcluster (3 for request-id 4, and a part - // of the broadcast of request-id 2 - checkExpectedAllocation(response, getHomeSubCluster().getId(), 4, 23); + // we expect 7 entries for home subcluster (2 for request-id 4, 3 for + // request-id 5, and a part of the broadcast of request-id 2 + checkExpectedAllocation(response, getHomeSubCluster().getId(), 7, 29); - // for subcluster0 we expect 3 entry from request-id 0, and 3 from - // request-id 3, as well as part of the request-id 2 broadast - checkExpectedAllocation(response, "subcluster0", 7, 26); + // for subcluster0 we expect 10 entries, 3 from request-id 0, and 3 from + // request-id 3, 3 entries from request-id 5, as well as part of the + // request-id 2 broadast + checkExpectedAllocation(response, "subcluster0", 10, 32); - // we expect 5 entry for subcluster1 (4 from request-id 1, and part + // we expect 5 entries for subcluster1 (4 from request-id 1, and part // of the broadcast of request-id 2 checkExpectedAllocation(response, "subcluster1", 5, 26); - // sub-cluster 2 should contain 3 entry from request-id 1 and 1 from the + // sub-cluster 2 should contain 3 entries from request-id 1 and 1 from the // broadcast of request-id 2, and no request-id 0 checkExpectedAllocation(response, "subcluster2", 4, 23); @@ -364,28 +365,33 @@ public void testSplitAllocateRequest() throws Exception { // check that the allocations that show up are what expected for (ResourceRequest rr : response.get(getHomeSubCluster())) { - Assert.assertTrue(rr.getAllocationRequestId() == 4L - || rr.getAllocationRequestId() == 2L); - } - - for (ResourceRequest rr : response.get(getHomeSubCluster())) { - Assert.assertTrue(rr.getAllocationRequestId() != 1L); + Assert.assertTrue( + rr.getAllocationRequestId() == 2L || rr.getAllocationRequestId() == 4L + || rr.getAllocationRequestId() == 5L); } List rrs = response.get(SubClusterId.newInstance("subcluster0")); for (ResourceRequest rr : rrs) { Assert.assertTrue(rr.getAllocationRequestId() != 1L); + Assert.assertTrue(rr.getAllocationRequestId() != 4L); + } + + for (ResourceRequest rr : response + .get(SubClusterId.newInstance("subcluster1"))) { + Assert.assertTrue(rr.getAllocationRequestId() == 1L + || rr.getAllocationRequestId() == 2L); } for (ResourceRequest rr : response .get(SubClusterId.newInstance("subcluster2"))) { - Assert.assertTrue(rr.getAllocationRequestId() != 0L); + Assert.assertTrue(rr.getAllocationRequestId() == 1L + || rr.getAllocationRequestId() == 2L); } for (ResourceRequest rr : response .get(SubClusterId.newInstance("subcluster5"))) { - Assert.assertTrue(rr.getAllocationRequestId() >= 2); + Assert.assertTrue(rr.getAllocationRequestId() == 2); Assert.assertTrue(rr.getRelaxLocality()); } } @@ -555,7 +561,7 @@ private List createComplexRequest() throws Exception { out.add(FederationPoliciesTestUtil.createResourceRequest(1L, "subcluster2-rack3", 1024, 1, 1, 1, null, false)); out.add(FederationPoliciesTestUtil.createResourceRequest(1L, - ResourceRequest.ANY, 1024, 1, 1, 2, null, false)); + ResourceRequest.ANY, 1024, 1, 1, 3, null, false)); // create a non-local ANY request that can span anything out.add(FederationPoliciesTestUtil.createResourceRequest(2L, @@ -578,6 +584,19 @@ private List createComplexRequest() throws Exception { out.add(FederationPoliciesTestUtil.createResourceRequest(4L, ResourceRequest.ANY, 1024, 1, 1, 1, null, false)); + // create a request of two hosts, an unknown node and a known node, both in + // a known rack, and expect the unknown node to show up in homesubcluster + out.add(FederationPoliciesTestUtil.createResourceRequest(5L, + "subcluster0-rack0-host0", 1024, 1, 1, 2, null, false)); + out.add(FederationPoliciesTestUtil.createResourceRequest(5L, + "subcluster0-rack0", 1024, 1, 1, 2, null, false)); + out.add(FederationPoliciesTestUtil.createResourceRequest(5L, "node4", 1024, + 1, 1, 2, null, false)); + out.add(FederationPoliciesTestUtil.createResourceRequest(5L, "rack2", 1024, + 1, 1, 2, null, false)); + out.add(FederationPoliciesTestUtil.createResourceRequest(5L, + ResourceRequest.ANY, 1024, 1, 1, 4, null, false)); + return out; } } \ No newline at end of file