diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/services/api/impl/ApplicationApiService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/services/api/impl/ApplicationApiService.java index 6db69ac..18f98d4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/services/api/impl/ApplicationApiService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/services/api/impl/ApplicationApiService.java @@ -1398,14 +1398,32 @@ public Response updateApplication(@PathParam("app_name") String appName, } // If new lifetime value specified then update it - if (updateAppData.getLifetime() != null) { - // TODO: Once YARN-3813 and YARN-4205 are available + if (updateAppData.getLifetime() != null + && updateAppData.getLifetime() > 0) { + try { + updateAppLifetime(appName, updateAppData.getLifetime()); + } catch (Exception e) { + logger.error("Failed to update application (" + appName + ") lifetime (" + + updateAppData.getLifetime() + ")", e); + return Response.status(Status.INTERNAL_SERVER_ERROR).build(); + } } // If nothing happens consider it a no-op return Response.status(Status.NO_CONTENT).build(); } + private Void updateAppLifetime(String appName, long lifetime) + throws InterruptedException, YarnException, IOException { + return invokeSliderClientRunnable(new SliderClientContextRunnable() { + @Override public Void run(SliderClient sliderClient) + throws YarnException, IOException, InterruptedException { + sliderClient.actionUpdateLifetime(appName, lifetime); + return null; + } + }); + } + // create default component and initialize with app level global values private List getDefaultComponentAsList(Application app) { List comps = getDefaultComponentAsList(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClient.java index ea10ed0..0dc52f2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClient.java @@ -52,6 +52,7 @@ import org.apache.hadoop.security.alias.CredentialProviderFactory; import org.apache.hadoop.util.Shell; import org.apache.hadoop.yarn.api.ApplicationConstants; +import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationTimeoutsRequest; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationReport; import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType; @@ -65,6 +66,7 @@ import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.util.ConverterUtils; +import org.apache.hadoop.yarn.util.Times; import org.apache.slider.api.ClusterDescription; import org.apache.slider.api.ClusterNode; import org.apache.slider.api.SliderApplicationApi; @@ -1602,7 +1604,20 @@ public int actionUpdate(String clustername, AbstractClusterBuildingActionArgs buildInfo) throws YarnException, IOException { buildInstanceDefinition(clustername, buildInfo, true, true); - return EXIT_SUCCESS; + return EXIT_SUCCESS; + } + + @Override + public int actionUpdateLifetime(String appName, long lifetime) + throws YarnException, IOException { + Map map = new HashMap<>(); + String newTimeout = + Times.formatISO8601(System.currentTimeMillis() + lifetime * 1000); + map.put(ApplicationTimeoutType.LIFETIME, newTimeout); + UpdateApplicationTimeoutsRequest request = + UpdateApplicationTimeoutsRequest.newInstance(applicationId, map); + yarnClient.updateApplicationTimeouts(request); + return EXIT_SUCCESS; } /** diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java index c6cc2d0..756c809 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java @@ -176,7 +176,18 @@ int actionPackage(ActionPackageArgs pkgInfo) */ int actionUpdate(String clustername, AbstractClusterBuildingActionArgs buildInfo) - throws YarnException, IOException; + throws YarnException, IOException; + + /** + * Update the lifetime of the application + * @param appName name of the application + * @param lifetime lifetime of the application + * @return + * @throws YarnException Yarn problems + * @throws IOException other problems + */ + int actionUpdateLifetime(String appName, long lifetime) + throws YarnException, IOException; /** * Upgrade the cluster with a newer version of the application