updating server force stop to have kill commands at unix level

Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/9b4dedf0
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/9b4dedf0
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/9b4dedf0

Branch: refs/heads/master
Commit: 9b4dedf0307687eef408f557c27bda56d76eb021
Parents: f9b95c9
Author: Saminda Wijeratne <[email protected]>
Authored: Wed Mar 12 10:24:24 2014 -0400
Committer: Saminda Wijeratne <[email protected]>
Committed: Wed Mar 12 10:24:24 2014 -0400

----------------------------------------------------------------------
 .../src/main/resources/bin/airavata-server.sh   | 63 ++++++++++----
 .../org/apache/airavata/server/ServerMain.java  | 88 +++++++++-----------
 2 files changed, 85 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/9b4dedf0/modules/distribution/airavata-server/src/main/resources/bin/airavata-server.sh
----------------------------------------------------------------------
diff --git 
a/modules/distribution/airavata-server/src/main/resources/bin/airavata-server.sh
 
b/modules/distribution/airavata-server/src/main/resources/bin/airavata-server.sh
index 9247d68..e7ed1be 100755
--- 
a/modules/distribution/airavata-server/src/main/resources/bin/airavata-server.sh
+++ 
b/modules/distribution/airavata-server/src/main/resources/bin/airavata-server.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements. See the NOTICE file
@@ -25,6 +25,8 @@ JAVA_OPTS=""
 AIRAVATA_COMMAND=""
 IS_DAEMON_MODE=false
 LOGO=true
+STOP=false
+FORCE=false
 for var in "$@"
 do
     case $var in
@@ -42,9 +44,14 @@ do
         ;;
        stop)
            LOGO=false
+           STOP=true
            AIRAVATA_COMMAND="$AIRAVATA_COMMAND $var"
             shift
         ;;
+       --force)
+           FORCE=true
+            shift
+        ;;
        -nologo)
            LOGO=false
             shift
@@ -52,13 +59,13 @@ do
         -h)
             echo "Usage: airavata-server.sh [command-options]"
             echo "command options:"
-           echo "  start                            Start server in daemon 
mode"
-           echo "  stop [--serverIndex n] [--force] Stop all airavata servers. 
Specify serverIndex stop a particular instance"
-           echo "  --<key>[=<value>]                Server setting(s) to 
override or introduce (overrides values in airavata-server.properties)"
-            echo "  -nologo                         Do not show airavata logo"
-            echo "  -xdebug                         Start Airavata Server 
under JPDA debugger"
-            echo "  -security                       Enable Java 2 security"
-            echo "  -h                               Display this help and 
exit"
+           echo "  start              Start server in daemon mode"
+           echo "  stop [--force]     Stop all airavata servers."
+           echo "  --<key>[=<value>]  Server setting(s) to override or 
introduce (overrides values in airavata-server.properties)"
+            echo "  -nologo            Do not show airavata logo"
+            echo "  -xdebug            Start Airavata Server under JPDA 
debugger"
+            echo "  -security          Enable Java 2 security"
+            echo "  -h                 Display this help and exit"
             shift
             exit 0
         ;;
@@ -73,16 +80,36 @@ if $LOGO ; then
                cat $LOGO_FILE
        fi
 fi
-if $IS_DAEMON_MODE ; then
-       echo "Starting airavata server in daemon mode..."
-       nohup java $JAVA_OPTS -classpath "$XBAYA_CLASSPATH" \
-           
-Djava.endorsed.dirs="$AIRAVATA_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed"
 \
-           org.apache.airavata.server.ServerMain $AIRAVATA_COMMAND $* > 
airavata-server.out & 
-       echo
-       echo
+if $STOP && $FORCE ; 
+then
+       for f in `find . -name "server-start_*"`; do 
+               f_split=(${f//_/ });
+               echo "Found process file : $f" 
+               echo -n "    Sending kill signals to process ${f_split[1]}..."
+               out=`kill -9 ${f_split[1]} 2>&1`
+               if [ -z "$out" ]; then
+                   echo "done"
+               else
+                   echo "failed (REASON: $out)"
+               fi
+               echo -n "    Removing process file..."
+               out=`rm $f 2>&1`
+               if [ -z "$out" ]; then
+                   echo "done"
+               else
+                   echo "failed (REASON: $out)"
+               fi
+       done
 else
-       java $JAVA_OPTS -classpath "$XBAYA_CLASSPATH" \
-           
-Djava.endorsed.dirs="$AIRAVATA_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed"
 \
-           org.apache.airavata.server.ServerMain $AIRAVATA_COMMAND $*
+       if $IS_DAEMON_MODE ; then
+               echo "Starting airavata server in daemon mode..."
+               nohup java $JAVA_OPTS -classpath "$XBAYA_CLASSPATH" \
+                   
-Djava.endorsed.dirs="$AIRAVATA_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed"
 \
+                   org.apache.airavata.server.ServerMain $AIRAVATA_COMMAND $* 
> airavata-server.out & 
+       else
+               java $JAVA_OPTS -classpath "$XBAYA_CLASSPATH" \
+                   
-Djava.endorsed.dirs="$AIRAVATA_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed"
 \
+                   org.apache.airavata.server.ServerMain $AIRAVATA_COMMAND $*
+       fi
 fi
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/9b4dedf0/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
----------------------------------------------------------------------
diff --git 
a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java 
b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
index 20534fb..8a99013 100644
--- a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
+++ b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java
@@ -22,6 +22,7 @@ package org.apache.airavata.server;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.util.ArrayList;
@@ -44,10 +45,8 @@ public class ServerMain {
     private final static Logger logger = 
LoggerFactory.getLogger(ServerMain.class);
     private static boolean serversLoaded=false;
        private static final String stopFileNamePrefix = "airavata-server-stop";
-       private static final String stopFileNamePrefixForced = 
"airavata-server-stop-forced";
-       private static int serverIndex=-1;
-       private static final String serverStartedFileNamePrefix = 
"airavata-server-start";
-       private static boolean forcedStop=false; 
+       private static int serverPID=-1;
+       private static final String serverStartedFileNamePrefix = 
"server-start";
        private static boolean systemShutDown=false;
     static{
                servers = new ArrayList<IServer>();
@@ -100,7 +99,7 @@ public class ServerMain {
 
        private static void performServerStart(String[] args) {
                setServerStarted();
-               logger.info("Airavata server instance "+serverIndex+" 
starting...");
+               logger.info("Airavata server instance starting...");
                ServerSettings.mergeSettingsCommandLineArgs(args);
                startAllServers();
                while(!hasStopRequested()){
@@ -136,14 +135,10 @@ public class ServerMain {
                deleteOldStartRecords();
                String serverIndexOption = "serverIndex";
                if 
(commandLineParameters.getParameters().containsKey(serverIndexOption)){
-                       
serverIndex=Integer.parseInt(commandLineParameters.getParameters().get(serverIndexOption));
-               }
-               String serverForcedStop = "force";
-               if 
(commandLineParameters.getParameters().containsKey(serverForcedStop)){
-                       forcedStop=true;
+                       
serverPID=Integer.parseInt(commandLineParameters.getParameters().get(serverIndexOption));
                }
                if (isServerRunning()) {
-                       logger.info("Requesting airavata 
server"+(serverIndex==-1? "(s)":" instance "+serverIndex)+" to stop...");
+                       logger.info("Requesting airavata 
server"+(serverPID==-1? "(s)":" instance "+serverPID)+" to stop...");
                        requestStop();
                        while(isServerRunning()){
                                try {
@@ -152,9 +147,9 @@ public class ServerMain {
                                        e.printStackTrace();
                                }
                        }
-                       logger.info("Server"+(serverIndex==-1? "(s)":" instance 
"+serverIndex)+" stopped!!!");
+                       logger.info("Server"+(serverPID==-1? "(s)":" instance 
"+serverPID)+" stopped!!!");
                }else{
-                       logger.error("Server"+(serverIndex==-1? "":" instance 
"+serverIndex)+" is not running!!!");
+                       logger.error("Server"+(serverPID==-1? "":" instance 
"+serverPID)+" is not running!!!");
                }
        }
 
@@ -164,38 +159,21 @@ public class ServerMain {
                file.createNewFile();
                new RandomAccessFile(file, "rw").getChannel().lock();
                file.deleteOnExit();
-               if (forcedStop){ 
-                       // incase a previous attempt of stopping without 
forcing is present, best to delete that file
-                       File f=new File((serverIndex==-1)? 
stopFileNamePrefix:stopFileNamePrefix+serverIndex);
-                       if (f.exists()){
-                               f.deleteOnExit();
-                       }
-               }
        }
        
        private static boolean hasStopRequested(){
-               forcedStop=new File(getServerStopForceFileName()).exists() || 
new File(stopFileNamePrefixForced).exists();
-               return  isSystemShutDown() || forcedStop || new 
File(getServerStopFileName()).exists() || new 
File(stopFileNamePrefix).exists(); 
+               return  isSystemShutDown() || new 
File(getServerStopFileName()).exists() || new 
File(stopFileNamePrefix).exists(); 
        }
 
        private static String getServerStopFileName() {
-               String filePrefix = forcedStop? stopFileNamePrefixForced : 
stopFileNamePrefix;
-               return (serverIndex==-1)? filePrefix:filePrefix+serverIndex;
+               return stopFileNamePrefix;
        }
        
-       private static String getServerStopForceFileName() {
-               return 
(serverIndex==-1)?stopFileNamePrefixForced:stopFileNamePrefixForced+serverIndex;
-       }
-
        private static void deleteOldStopRequests(){
                File[] files = new File(".").listFiles();
                for (File file : files) {
-                       if (file.getName().contains(stopFileNamePrefix) || 
file.getName().contains(stopFileNamePrefixForced)){
-                               try {
-                                       file.delete();
-                               } catch (Exception e) {
-                                       //file is locked which means there's an 
active process using it
-                               }
+                       if (file.getName().contains(stopFileNamePrefix)){
+                               file.delete();
                        }
                }
        }
@@ -205,6 +183,7 @@ public class ServerMain {
                for (File file : files) {
                        if 
(file.getName().contains(serverStartedFileNamePrefix)){
                                try {
+                                       new FileOutputStream(file);
                                        file.delete();
                                } catch (Exception e) {
                                        //file is locked which means there's an 
active process using it
@@ -214,7 +193,7 @@ public class ServerMain {
        }
        
        private static boolean isServerRunning(){
-               if (serverIndex==-1){
+               if (serverPID==-1){
                        String[] files = new File(".").list();
                        for (String file : files) {
                                if (file.contains(serverStartedFileNamePrefix)){
@@ -230,12 +209,10 @@ public class ServerMain {
        @SuppressWarnings({ "resource" })
        private static void setServerStarted(){
                try {
+                       serverPID = getPID();
                        deleteOldStopRequests();
                        File serverStartedFile = null;
-                       while(serverStartedFile==null || 
serverStartedFile.exists()){
-                               serverIndex++;
-                               serverStartedFile = new 
File(getServerStartedFileName());
-                       }
+                       serverStartedFile = new 
File(getServerStartedFileName());
                        serverStartedFile.createNewFile();
                        serverStartedFile.deleteOnExit();
                        new 
RandomAccessFile(serverStartedFile,"rw").getChannel().lock();
@@ -247,20 +224,15 @@ public class ServerMain {
        }
 
        private static String getServerStartedFileName() {
-               return serverStartedFileNamePrefix+serverIndex;
+               return 
serverStartedFileNamePrefix+"_"+Integer.toString(serverPID);
        }
-       
-       private static int DEFAULT_FORCE_STOP_WAIT_INTERVAL=3000;
+
        public static void stopAllServers() {
                //stopping should be done in reverse order of starting the 
servers
                for(int i=servers.size()-1;i>=0;i--){
                        try {
                                servers.get(i).stop();
-                               if (forcedStop) {
-                                       
waitForServerToStop(servers.get(i),DEFAULT_FORCE_STOP_WAIT_INTERVAL);
-                               }else{
-                                       
waitForServerToStop(servers.get(i),null);
-                               }
+                               waitForServerToStop(servers.get(i),null);
                        } catch (Exception e) {
                                logger.error("Server Stop Error:",e);
                        }
@@ -302,7 +274,7 @@ public class ServerMain {
                        logger.info("Waiting for " + server.getName() + " to 
stop...");
                }
                //we are doing hasStopRequested() check because while we are 
stuck in the loop to stop there could be a forceStop request 
-               while(server.getStatus()==ServerStatus.STOPING && 
(maxWait==null || count<maxWait) && hasStopRequested() && (maxWait!=null || 
!forcedStop)){
+               while(server.getStatus()==ServerStatus.STOPING && 
(maxWait==null || count<maxWait)){
                        Thread.sleep(SERVER_STATUS_CHANGE_WAIT_INTERVAL);
                        count+=SERVER_STATUS_CHANGE_WAIT_INTERVAL;
                }
@@ -318,4 +290,24 @@ public class ServerMain {
        private static void setSystemShutDown(boolean systemShutDown) {
                ServerMain.systemShutDown = systemShutDown;
        }
+       
+       private static int getPID(){
+               try {
+                       java.lang.management.RuntimeMXBean runtime = 
java.lang.management.ManagementFactory
+                                       .getRuntimeMXBean();
+                       java.lang.reflect.Field jvm = runtime.getClass()
+                                       .getDeclaredField("jvm");
+                       jvm.setAccessible(true);
+                       sun.management.VMManagement mgmt = 
(sun.management.VMManagement) jvm
+                                       .get(runtime);
+                       java.lang.reflect.Method pid_method = mgmt.getClass()
+                                       .getDeclaredMethod("getProcessId");
+                       pid_method.setAccessible(true);
+
+                       int pid = (Integer) pid_method.invoke(mgmt);
+                       return pid;
+               } catch (Exception e) {
+                       return -1;
+               }
+       }
 }
\ No newline at end of file

Reply via email to