private static void throwInvalidResourceException(Resource reqResource, Resource maxAllowedAllocation, String reqResourceName, InvalidResourceType invalidResourceType) throws InvalidResourceRequestException { final String message; if (invalidResourceType == InvalidResourceType.LESS_THAN_ZERO) { message = String.format(LESS_THAN_ZERO_RESOURCE_MESSAGE_TEMPLATE, reqResourceName, reqResource); } else if (invalidResourceType == InvalidResourceType.GREATER_THEN_MAX_ALLOCATION) { message = String.format(GREATER_THAN_MAX_RESOURCE_MESSAGE_TEMPLATE, reqResourceName, reqResource, maxAllowedAllocation, ResourceUtils.getResourceTypesMaximumAllocation()); } else if (invalidResourceType == InvalidResourceType.UNKNOWN) { message = String.format(UNKNOWN_REASON_MESSAGE_TEMPLATE, reqResourceName, reqResource); } else { throw new IllegalArgumentException(String.format( "InvalidResourceType argument should be either " + "%s, %s or %s", InvalidResourceType.LESS_THAN_ZERO, InvalidResourceType.GREATER_THEN_MAX_ALLOCATION, InvalidResourceType.UNKNOWN)); } throw new InvalidResourceRequestException(message, invalidResourceType); }
private void handleInvalidResourceException(InvalidResourceRequestException e, RMAppAttempt rmAppAttempt) throws InvalidResourceRequestException { if (e.getInvalidResourceType() == LESS_THAN_ZERO || e.getInvalidResourceType() == GREATER_THEN_MAX_ALLOCATION) { rmAppAttempt.updateAMLaunchDiagnostics(e.getMessage()); } LOG.warn("Invalid resource ask by application " + rmAppAttempt.getAppAttemptId(), e); throw e; }
scheduler, rmContext, maxResource); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is a subset of queue labels"); } finally { scheduler, rmContext, maxResource); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is empty"); scheduler, rmContext, maxResource); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when queue can access any labels"); } finally { } catch (InvalidResourceRequestException e) { assertEquals("Invalid label resource request, cluster do not contain , " + "label= x", e.getMessage()); } catch (InvalidResourceRequestException e) { assertEquals("Invalid resource request, node label not enabled but " + "request contains label expression", e.getMessage());
@Test public void testRMAppSubmitNoResourceRequests() throws Exception { asContext.setResource(null); asContext.setAMContainerResourceRequests(null); try { testRMAppSubmit(); Assert.fail("Should have failed due to no ResourceRequest"); } catch (InvalidResourceRequestException e) { Assert.assertEquals( "Invalid resource request, no resources requested", e.getMessage()); } }
fail("Negative memory should not be accepted"); } catch (InvalidResourceRequestException e) { assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType()); fail("Negative vcores should not be accepted"); } catch (InvalidResourceRequestException e) { assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType()); fail("More than max memory should not be accepted"); } catch (InvalidResourceRequestException e) { assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType()); fail("More than max vcores should not be accepted"); } catch (InvalidResourceRequestException e) { assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
Assert.assertTrue(resReq.getNodeLabelExpression().equals("y")); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is a subset of queue labels"); } finally {
@Test public void testRMAppSubmitAMContainerResourceRequestsTwoManyAny() throws Exception { asContext.setResource(null); List<ResourceRequest> reqs = new ArrayList<>(); reqs.add(ResourceRequest.newInstance(Priority.newInstance(1), ResourceRequest.ANY, Resources.createResource(1025), 1, false)); reqs.add(ResourceRequest.newInstance(Priority.newInstance(1), ResourceRequest.ANY, Resources.createResource(1025), 1, false)); asContext.setAMContainerResourceRequests(cloneResourceRequests(reqs)); // getAMContainerResourceRequest uses the first entry of // getAMContainerResourceRequests Assert.assertEquals(reqs, asContext.getAMContainerResourceRequests()); try { testRMAppSubmit(); Assert.fail("Should have failed due to too many ANY ResourceRequests"); } catch (InvalidResourceRequestException e) { Assert.assertEquals( "Invalid resource request, only one resource request with * is " + "allowed", e.getMessage()); } }
} catch (InvalidResourceRequestException e) { Assert.assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
Assert.assertEquals("y", resReq.getNodeLabelExpression()); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is a subset of queue labels"); } finally {
if (resReq.getCapability().getMemory() < 0 || resReq.getCapability().getMemory() > maximumResource.getMemory()) { throw new InvalidResourceRequestException("Invalid resource request" + ", requested memory < 0" + ", or requested memory > max configured" resReq.getCapability().getVirtualCores() > maximumResource.getVirtualCores()) { throw new InvalidResourceRequestException("Invalid resource request" + ", requested virtual cores < 0" + ", or requested virtual cores > max configured" throw new InvalidResourceRequestException( "Invailid resource request, queue=" + queueInfo.getQueueName() + " specified node label expression in a " throw new InvalidResourceRequestException( "Invailid resource request, queue=" + queueInfo.getQueueName() + " specified more than one node label " if (!checkQueueLabelExpression(queueInfo.getAccessibleNodeLabels(), labelExp, rmContext)) { throw new InvalidResourceRequestException("Invalid resource request" + ", queue=" + queueInfo.getQueueName()
@Test public void testRMAppSubmitAMContainerResourceRequestsNoAny() throws Exception { asContext.setResource(null); List<ResourceRequest> reqs = new ArrayList<>(); reqs.add(ResourceRequest.newInstance(Priority.newInstance(1), "/rack", Resources.createResource(1025), 1, false)); reqs.add(ResourceRequest.newInstance(Priority.newInstance(1), "/rack/node", Resources.createResource(1025), 1, true)); asContext.setAMContainerResourceRequests(cloneResourceRequests(reqs)); // getAMContainerResourceRequest uses the first entry of // getAMContainerResourceRequests Assert.assertEquals(reqs, asContext.getAMContainerResourceRequests()); try { testRMAppSubmit(); Assert.fail("Should have failed due to missing ANY ResourceRequest"); } catch (InvalidResourceRequestException e) { Assert.assertEquals( "Invalid resource request, no resource request specified with *", e.getMessage()); } }
@Test(timeout = 3000000) public void testQueueLevelContainerAllocationFail() throws Exception { MockRM rm = new MockRM(configuration); rm.start(); // Register node1 MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB); // Submit an application RMApp app1 = rm.submitApp(2 * GB, "queueA"); // kick the scheduling nm1.nodeHeartbeat(true); RMAppAttempt attempt1 = app1.getCurrentAppAttempt(); MockAM am1 = rm.sendAMLaunched(attempt1.getAppAttemptId()); am1.registerAppAttempt(); am1.addRequests(new String[] { "127.0.0.1" }, MEMORY_ALLOCATION, 1, 1); try { allocateResponse = am1.schedule(); // send the request Assert.fail(); } catch (Exception e) { Assert.assertTrue(e instanceof InvalidResourceRequestException); Assert.assertEquals( InvalidResourceRequestException.InvalidResourceType.GREATER_THEN_MAX_ALLOCATION, ((InvalidResourceRequestException) e).getInvalidResourceType()); } finally { rm.stop(); } }
scheduler, rmContext); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is a subset of queue labels"); } finally { scheduler, rmContext); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when request labels is empty"); scheduler, rmContext); } catch (InvalidResourceRequestException e) { e.printStackTrace(); fail("Should be valid when queue can access any labels"); } finally {
if (resReq.getCapability().getMemory() < 0 || resReq.getCapability().getMemory() > maximumResource.getMemory()) { throw new InvalidResourceRequestException("Invalid resource request" + ", requested memory < 0" + ", or requested memory > max configured" resReq.getCapability().getVirtualCores() > maximumResource.getVirtualCores()) { throw new InvalidResourceRequestException("Invalid resource request" + ", requested virtual cores < 0" + ", or requested virtual cores > max configured" throw new InvalidResourceRequestException( "Invailid resource request, queue=" + queueInfo.getQueueName() + " specified node label expression in a " throw new InvalidResourceRequestException( "Invailid resource request, queue=" + queueInfo.getQueueName() + " specified more than one node label " if (!checkQueueLabelExpression(queueInfo.getAccessibleNodeLabels(), labelExp, rmContext)) { throw new InvalidResourceRequestException("Invalid resource request" + ", queue=" + queueInfo.getQueueName()
ResourceRequest.ANY, submissionContext.getResource(), 1)); } else { throw new InvalidResourceRequestException("Invalid resource request, " + "no resources requested"); anyReq = amReq; } else { throw new InvalidResourceRequestException("Invalid resource " + "request, only one resource request with " + ResourceRequest.ANY + " is allowed"); throw new InvalidResourceRequestException("Invalid resource request, " + "no resource request specified with " + ResourceRequest.ANY);
/** * Sanity check increase/decrease request, and return * SchedulerContainerResourceChangeRequest according to given * UpdateContainerRequest. * * <pre> * - Returns non-null value means validation succeeded * - Throw exception when any other error happens * </pre> */ private SchedContainerChangeRequest createSchedContainerChangeRequest( UpdateContainerRequest request, boolean increase) throws YarnException { ContainerId containerId = request.getContainerId(); RMContainer rmContainer = getRMContainer(containerId); if (null == rmContainer) { String msg = "Failed to get rmContainer for " + (increase ? "increase" : "decrease") + " request, with container-id=" + containerId; throw new InvalidResourceRequestException(msg); } SchedulerNode schedulerNode = getSchedulerNode(rmContainer.getAllocatedNode()); return new SchedContainerChangeRequest( this.rmContext, schedulerNode, rmContainer, request.getCapability()); }
+ " original=" + originalResource + " containerId=" + containerId; throw new InvalidResourceRequestException(msg); + " original=" + originalResource + " containerId=" + containerId; throw new InvalidResourceRequestException(msg); + containerId + " is more than node's total resource=" + rmNode.getTotalCapability(); throw new InvalidResourceRequestException(msg);