|
@@ -93,6 +93,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionResponse;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse;
|
|
|
|
+import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityRequest;
|
|
|
|
+import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityResponse;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
|
|
@@ -105,6 +107,7 @@ import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
import org.apache.hadoop.yarn.api.records.ContainerReport;
|
|
import org.apache.hadoop.yarn.api.records.ContainerReport;
|
|
import org.apache.hadoop.yarn.api.records.NodeReport;
|
|
import org.apache.hadoop.yarn.api.records.NodeReport;
|
|
import org.apache.hadoop.yarn.api.records.NodeState;
|
|
import org.apache.hadoop.yarn.api.records.NodeState;
|
|
|
|
+import org.apache.hadoop.yarn.api.records.Priority;
|
|
import org.apache.hadoop.yarn.api.records.QueueACL;
|
|
import org.apache.hadoop.yarn.api.records.QueueACL;
|
|
import org.apache.hadoop.yarn.api.records.QueueInfo;
|
|
import org.apache.hadoop.yarn.api.records.QueueInfo;
|
|
import org.apache.hadoop.yarn.api.records.ReservationDefinition;
|
|
import org.apache.hadoop.yarn.api.records.ReservationDefinition;
|
|
@@ -1304,4 +1307,74 @@ public class ClientRMService extends AbstractService implements
|
|
}
|
|
}
|
|
return callerUGI.getShortUserName();
|
|
return callerUGI.getShortUserName();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public UpdateApplicationPriorityResponse updateApplicationPriority(
|
|
|
|
+ UpdateApplicationPriorityRequest request) throws YarnException,
|
|
|
|
+ IOException {
|
|
|
|
+
|
|
|
|
+ ApplicationId applicationId = request.getApplicationId();
|
|
|
|
+ Priority newAppPriority = request.getApplicationPriority();
|
|
|
|
+ UserGroupInformation callerUGI;
|
|
|
|
+ try {
|
|
|
|
+ callerUGI = UserGroupInformation.getCurrentUser();
|
|
|
|
+ } catch (IOException ie) {
|
|
|
|
+ LOG.info("Error getting UGI ", ie);
|
|
|
|
+ RMAuditLogger.logFailure("UNKNOWN", AuditConstants.UPDATE_APP_PRIORITY,
|
|
|
|
+ "UNKNOWN", "ClientRMService", "Error getting UGI", applicationId);
|
|
|
|
+ throw RPCUtil.getRemoteException(ie);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ RMApp application = this.rmContext.getRMApps().get(applicationId);
|
|
|
|
+ if (application == null) {
|
|
|
|
+ RMAuditLogger.logFailure(callerUGI.getUserName(),
|
|
|
|
+ AuditConstants.UPDATE_APP_PRIORITY, "UNKNOWN", "ClientRMService",
|
|
|
|
+ "Trying to update priority of an absent application", applicationId);
|
|
|
|
+ throw new ApplicationNotFoundException(
|
|
|
|
+ "Trying to update priority o an absent application " + applicationId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!checkAccess(callerUGI, application.getUser(),
|
|
|
|
+ ApplicationAccessType.MODIFY_APP, application)) {
|
|
|
|
+ RMAuditLogger.logFailure(callerUGI.getShortUserName(),
|
|
|
|
+ AuditConstants.UPDATE_APP_PRIORITY,
|
|
|
|
+ "User doesn't have permissions to "
|
|
|
|
+ + ApplicationAccessType.MODIFY_APP.toString(), "ClientRMService",
|
|
|
|
+ AuditConstants.UNAUTHORIZED_USER, applicationId);
|
|
|
|
+ throw RPCUtil.getRemoteException(new AccessControlException("User "
|
|
|
|
+ + callerUGI.getShortUserName() + " cannot perform operation "
|
|
|
|
+ + ApplicationAccessType.MODIFY_APP.name() + " on " + applicationId));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Update priority only when app is tracked by the scheduler
|
|
|
|
+ if (!EnumSet.of(RMAppState.ACCEPTED, RMAppState.RUNNING).contains(
|
|
|
|
+ application.getState())) {
|
|
|
|
+ String msg =
|
|
|
|
+ "Application in " + application.getState()
|
|
|
|
+ + " state cannot be update priority.";
|
|
|
|
+ RMAuditLogger
|
|
|
|
+ .logFailure(callerUGI.getShortUserName(),
|
|
|
|
+ AuditConstants.UPDATE_APP_PRIORITY, "UNKNOWN", "ClientRMService",
|
|
|
|
+ msg);
|
|
|
|
+ throw new YarnException(msg);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ rmContext.getScheduler().updateApplicationPriority(newAppPriority,
|
|
|
|
+ applicationId);
|
|
|
|
+ } catch (YarnException ex) {
|
|
|
|
+ RMAuditLogger.logFailure(callerUGI.getShortUserName(),
|
|
|
|
+ AuditConstants.UPDATE_APP_PRIORITY, "UNKNOWN", "ClientRMService",
|
|
|
|
+ ex.getMessage());
|
|
|
|
+ throw ex;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ RMAuditLogger.logSuccess(callerUGI.getShortUserName(),
|
|
|
|
+ AuditConstants.UPDATE_APP_PRIORITY, "ClientRMService", applicationId);
|
|
|
|
+ UpdateApplicationPriorityResponse response =
|
|
|
|
+ recordFactory
|
|
|
|
+ .newRecordInstance(UpdateApplicationPriorityResponse.class);
|
|
|
|
+ return response;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|