diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java index f5fd0cb..e32b398 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java @@ -476,9 +476,9 @@ public ReservationDeleteResponse deleteReservation( } @Override - public void updateApplicationPriority(ApplicationId applicationId, + public Priority updateApplicationPriority(ApplicationId applicationId, Priority priority) throws YarnException, IOException { - client.updateApplicationPriority(applicationId, priority); + return client.updateApplicationPriority(applicationId, priority); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/UpdateApplicationPriorityResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/UpdateApplicationPriorityResponse.java index 0fdbe75..86f322a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/UpdateApplicationPriorityResponse.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/UpdateApplicationPriorityResponse.java @@ -21,6 +21,7 @@ import org.apache.hadoop.classification.InterfaceAudience.Public; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.ApplicationClientProtocol; +import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.util.Records; /** @@ -39,9 +40,25 @@ @Unstable public abstract class UpdateApplicationPriorityResponse { - public static UpdateApplicationPriorityResponse newInstance() { + public static UpdateApplicationPriorityResponse newInstance(Priority priority) { UpdateApplicationPriorityResponse response = Records.newRecord(UpdateApplicationPriorityResponse.class); + response.setApplicationPriority(priority); return response; } + + /** + * Get the Priority of the application to be set. + * + * @return Updated Priority of the application. It can be null if + * application is in completing state. + */ + public abstract Priority getApplicationPriority(); + + /** + * Set the Priority of the application. + * + * @param priority Priority of the application + */ + public abstract void setApplicationPriority(Priority priority); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto index 8924eba..115df9a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_service_protos.proto @@ -231,6 +231,7 @@ message UpdateApplicationPriorityRequestProto { } message UpdateApplicationPriorityResponseProto { + optional PriorityProto applicationPriority = 1; } message SignalContainerRequestProto { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java index 523698f..935d2c3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/YarnClient.java @@ -692,12 +692,14 @@ public abstract ReservationDeleteResponse deleteReservation( *

* @param applicationId * @param priority + * @return updated priority if updates application else null * @throws YarnException * @throws IOException */ @Public @Unstable - public abstract void updateApplicationPriority(ApplicationId applicationId, + public abstract Priority updateApplicationPriority( + ApplicationId applicationId, Priority priority) throws YarnException, IOException; /** diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java index 29fd417..f5bbeb4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java @@ -832,11 +832,11 @@ public ReservationDeleteResponse deleteReservation( } @Override - public void updateApplicationPriority(ApplicationId applicationId, + public Priority updateApplicationPriority(ApplicationId applicationId, Priority priority) throws YarnException, IOException { UpdateApplicationPriorityRequest request = UpdateApplicationPriorityRequest.newInstance(applicationId, priority); - rmClient.updateApplicationPriority(request); + return rmClient.updateApplicationPriority(request).getApplicationPriority(); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java index b486074..14821b8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java @@ -713,8 +713,17 @@ private void updateApplicationPriority(String applicationId, String priority) ApplicationId appId = ConverterUtils.toApplicationId(applicationId); Priority newAppPriority = Priority.newInstance(Integer.parseInt(priority)); sysout.println("Updating priority of an aplication " + applicationId); - client.updateApplicationPriority(appId, newAppPriority); - sysout.println("Successfully updated the application with id " - + applicationId + " with priority '" + priority + "'"); + Priority updateApplicationPriority = + client.updateApplicationPriority(appId, newAppPriority); + if (null == updateApplicationPriority) { + sysout + .println("Application is in either completed or completing states."); + } else if (newAppPriority.equals(updateApplicationPriority)) { + sysout.println("Successfully updated the application with id " + + applicationId + " with priority '" + priority + "'"); + } else { + sysout.println("Updated the application " + applicationId + + " to cluster max priority '" + updateApplicationPriority + "'"); + } } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/UpdateApplicationPriorityResponsePBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/UpdateApplicationPriorityResponsePBImpl.java index 0898e5a..2b26412 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/UpdateApplicationPriorityResponsePBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/UpdateApplicationPriorityResponsePBImpl.java @@ -19,7 +19,11 @@ package org.apache.hadoop.yarn.api.protocolrecords.impl.pb; import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityResponse; +import org.apache.hadoop.yarn.api.records.Priority; +import org.apache.hadoop.yarn.api.records.impl.pb.PriorityPBImpl; +import org.apache.hadoop.yarn.proto.YarnProtos.PriorityProto; import org.apache.hadoop.yarn.proto.YarnServiceProtos.UpdateApplicationPriorityResponseProto; +import org.apache.hadoop.yarn.proto.YarnServiceProtos.UpdateApplicationPriorityResponseProtoOrBuilder; import com.google.protobuf.TextFormat; @@ -31,6 +35,8 @@ UpdateApplicationPriorityResponseProto.Builder builder = null; boolean viaProto = false; + private Priority updatedAppPriority = null; + public UpdateApplicationPriorityResponsePBImpl() { builder = UpdateApplicationPriorityResponseProto.newBuilder(); } @@ -42,11 +48,65 @@ public UpdateApplicationPriorityResponsePBImpl( } public UpdateApplicationPriorityResponseProto getProto() { + mergeLocalToProto(); proto = viaProto ? proto : builder.build(); viaProto = true; return proto; } + private void mergeLocalToProto() { + if (viaProto) + maybeInitBuilder(); + mergeLocalToBuilder(); + proto = builder.build(); + viaProto = true; + } + + private void maybeInitBuilder() { + if (viaProto || builder == null) { + builder = UpdateApplicationPriorityResponseProto.newBuilder(proto); + } + viaProto = false; + } + + private void mergeLocalToBuilder() { + if (this.updatedAppPriority != null) { + builder + .setApplicationPriority(convertToProtoFormat(this.updatedAppPriority)); + } + } + + @Override + public Priority getApplicationPriority() { + UpdateApplicationPriorityResponseProtoOrBuilder p = + viaProto ? proto : builder; + if (this.updatedAppPriority != null) { + return this.updatedAppPriority; + } + if (!p.hasApplicationPriority()) { + return null; + } + this.updatedAppPriority = + convertFromProtoFormat(p.getApplicationPriority()); + return this.updatedAppPriority; + } + + @Override + public void setApplicationPriority(Priority priority) { + maybeInitBuilder(); + if (priority == null) + builder.clearApplicationPriority(); + this.updatedAppPriority = priority; + } + + private PriorityPBImpl convertFromProtoFormat(PriorityProto p) { + return new PriorityPBImpl(p); + } + + private PriorityProto convertToProtoFormat(Priority t) { + return ((PriorityPBImpl) t).getProto(); + } + @Override public int hashCode() { return getProto().hashCode(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java index 812267d..44ffe54 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java @@ -1467,6 +1467,8 @@ public UpdateApplicationPriorityResponse updateApplicationPriority( RMAuditLogger.logSuccess(callerUGI.getShortUserName(), AuditConstants.UPDATE_APP_PRIORITY, "ClientRMService", applicationId); + response.setApplicationPriority(application + .getApplicationSubmissionContext().getPriority()); return response; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java index a7219fa..d0d9d92 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java @@ -81,6 +81,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateResponse; import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest; import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityRequest; +import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationPriorityResponse; import org.apache.hadoop.yarn.api.records.ApplicationAccessType; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; @@ -1330,39 +1331,20 @@ public void testUpdateApplicationPriorityRequest() throws Exception { appPriority, app1.getApplicationSubmissionContext().getPriority() .getPriority()); - appPriority = 9; + appPriority = 11; ClientRMService rmService = rm.getClientRMService(); - UpdateApplicationPriorityRequest updateRequest = - UpdateApplicationPriorityRequest.newInstance(app1.getApplicationId(), - Priority.newInstance(appPriority)); + testAplicationPriorityUpdation(rmService, app1, appPriority, maxPriority); - rmService.updateApplicationPriority(updateRequest); - - Assert.assertEquals("Incorrect priority has been set to application", - appPriority, app1.getApplicationSubmissionContext().getPriority() - .getPriority()); + appPriority = 9; + testAplicationPriorityUpdation(rmService, app1, appPriority, appPriority); rm.killApp(app1.getApplicationId()); rm.waitForState(app1.getApplicationId(), RMAppState.KILLED); - appPriority = 8; - UpdateApplicationPriorityRequest updateRequestNew = - UpdateApplicationPriorityRequest.newInstance(app1.getApplicationId(), - Priority.newInstance(appPriority)); - // Update priority request for application in KILLED state - rmService.updateApplicationPriority(updateRequestNew); - - // Hence new priority should not be updated - Assert.assertNotEquals("Priority should not be updated as app is in KILLED state", - appPriority, app1.getApplicationSubmissionContext().getPriority() - .getPriority()); - Assert.assertEquals("Priority should be same as old one before update", - 9, app1.getApplicationSubmissionContext().getPriority() - .getPriority()); // Update priority request for invalid application id. ApplicationId invalidAppId = ApplicationId.newInstance(123456789L, 3); - updateRequest = + UpdateApplicationPriorityRequest updateRequest = UpdateApplicationPriorityRequest.newInstance(invalidAppId, Priority.newInstance(appPriority)); try { @@ -1373,6 +1355,32 @@ public void testUpdateApplicationPriorityRequest() throws Exception { // Expected } + updateRequest = + UpdateApplicationPriorityRequest.newInstance(app1.getApplicationId(), + Priority.newInstance(11)); + Assert.assertEquals("Incorrect priority has been set to application", + appPriority, app1.getApplicationSubmissionContext().getPriority() + .getPriority()); + Assert.assertNull("Priority object should be null", rmService + .updateApplicationPriority(updateRequest).getApplicationPriority()); + rm.stop(); } + + private void testAplicationPriorityUpdation(ClientRMService rmService, + RMApp app1, int tobeUpdatedPriority, int expected) throws YarnException, + IOException { + UpdateApplicationPriorityRequest updateRequest = + UpdateApplicationPriorityRequest.newInstance(app1.getApplicationId(), + Priority.newInstance(tobeUpdatedPriority)); + + UpdateApplicationPriorityResponse updateApplicationPriority = + rmService.updateApplicationPriority(updateRequest); + + Assert.assertEquals("Incorrect priority has been set to application", + expected, app1.getApplicationSubmissionContext().getPriority() + .getPriority()); + Assert.assertEquals("Incorrect priority has been returned", expected, + updateApplicationPriority.getApplicationPriority().getPriority()); + } } -- 1.9.2.msysgit.0