YARN-6370. Properly handle rack requests for non-active subclusters in LocalityMulticastAMRMProxyPolicy. (Contributed by Botong Huang via curino).

(cherry picked from commit ce419881c32b178c48c3a01b5a15e4e3a3e750f5)
This commit is contained in:
Carlo Curino 2017-03-22 13:53:47 -07:00
parent 86b2bec56e
commit 1c64e1709b
2 changed files with 41 additions and 18 deletions

View File

@ -261,7 +261,11 @@ public Map<SubClusterId, List<ResourceRequest>> splitResourceRequests(
// If home-subcluster is not active, ignore node/rack request
if (bookkeeper.isActiveAndEnabled(homeSubcluster)) {
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 "

View File

@ -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<ResourceRequest> 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<ResourceRequest> 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<ResourceRequest> 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;
}
}