You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/09/19 13:31:19 UTC

[03/16] git commit: Support for timeout parameter in the /server/shutdown request

Support for timeout parameter in the /server/shutdown request


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/df789d90
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/df789d90
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/df789d90

Branch: refs/heads/master
Commit: df789d90c2ba4f0837aa36f435b3e60d8e8b416f
Parents: 58d648a
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Fri Sep 12 19:07:50 2014 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Sep 17 15:40:46 2014 +0300

----------------------------------------------------------------------
 .../main/java/brooklyn/rest/api/ServerApi.java  |  7 +++-
 .../brooklyn/rest/resources/ServerResource.java | 36 ++++++++++++++++++--
 2 files changed, 39 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/df789d90/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
----------------------------------------------------------------------
diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
index fb9d3c1..43cc767 100644
--- a/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
+++ b/usage/rest-api/src/main/java/brooklyn/rest/api/ServerApi.java
@@ -33,6 +33,7 @@ import brooklyn.rest.domain.VersionSummary;
 
 import com.google.common.annotations.Beta;
 import com.wordnik.swagger.core.ApiOperation;
+import com.wordnik.swagger.core.ApiParam;
 
 @Path("/v1/server")
 @Apidoc("Server")
@@ -52,8 +53,12 @@ public interface ServerApi {
     @ApiOperation(value = "Terminate this Brooklyn server instance")
     @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
     public void shutdown(
+        @ApiParam(name = "stopAppsFirst", value = "Whether to stop running applications before shutting down")
         @FormParam("stopAppsFirst") @DefaultValue("false") boolean stopAppsFirst,
-        @FormParam("delayMillis") @DefaultValue("250") long delayMillis);
+        @ApiParam(name = "delayMillis", value = "Minimum delay before system.exit")
+        @FormParam("delayMillis") @DefaultValue("250") long delayMillis,
+        @ApiParam(name = "httpReturnTimeout", value = "Maximum time to block the request for the shutdown to finish.")
+        @FormParam("httpReturnTimeout") String httpReturnTimeout);
 
     @GET
     @Path("/version")

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/df789d90/usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java
index 4a52672..c161101 100644
--- a/usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java
+++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java
@@ -23,6 +23,8 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
+import java.util.Timer;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,8 +44,10 @@ import brooklyn.rest.domain.HighAvailabilitySummary;
 import brooklyn.rest.domain.VersionSummary;
 import brooklyn.rest.transform.HighAvailabilityTransformer;
 import brooklyn.util.ResourceUtils;
+import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.time.CountdownTimer;
 import brooklyn.util.time.Duration;
+import brooklyn.util.time.Time;
 
 public class ServerResource extends AbstractBrooklynRestResource implements ServerApi {
 
@@ -58,9 +62,13 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
     }
 
     @Override
-    public void shutdown(final boolean stopAppsFirst, final long delayMillis) {
+    public void shutdown(final boolean stopAppsFirst, final long delayMillis, String httpReturnTimeout) {
         log.info("REST call to shutdown server, stopAppsFirst="+stopAppsFirst+", delayMillis="+delayMillis);
-        
+
+        Duration httpReturnTimeoutDuration = Duration.parse(httpReturnTimeout);
+        final boolean shouldBlock = (httpReturnTimeoutDuration != null);
+        final AtomicBoolean completed = new AtomicBoolean();
+
         new Thread() {
             public void run() {
                 Duration delayBeforeSystemExit = Duration.millis(delayMillis);
@@ -82,10 +90,32 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
 
                 ((ManagementContextInternal)mgmt()).terminate(); 
                 timer.waitForExpiryUnchecked();
-                
+
+                synchronized (completed) {
+                    completed.set(true);
+                    completed.notifyAll();
+                }
+
+                if (shouldBlock) {
+                    //give the http request a chance to complete gracefully
+                    Time.sleep(Duration.FIVE_SECONDS);
+                }
+
                 System.exit(0);
             }
         }.start();
+
+        if (shouldBlock) {
+            synchronized (completed) {
+                if (!completed.get()) {
+                    try {
+                        completed.wait(httpReturnTimeoutDuration.toMilliseconds());
+                    } catch (InterruptedException e) {
+                        throw Exceptions.propagate(e);
+                    }
+                }
+            }
+        }
     }
 
     @Override