From: Steve L. <st...@us...> - 2004-03-29 15:49:05
|
Update of /cvsroot/smartfrog/core/extras/ant/src/org/smartfrog/tools/ant In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15674/extras/ant/src/org/smartfrog/tools/ant Modified Files: RunApplicationTask.java SmartFrogTask.java Log Message: added timeout support to kill hanging. All tasks but run have a default timeout now. Also trying the idea reformat and optimise on commit options to make the diff bigger. Index: RunApplicationTask.java =================================================================== RCS file: /cvsroot/smartfrog/core/extras/ant/src/org/smartfrog/tools/ant/RunApplicationTask.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** RunApplicationTask.java 29 Mar 2004 14:31:44 -0000 1.8 --- RunApplicationTask.java 29 Mar 2004 15:37:34 -0000 1.9 *************** *** 26,29 **** --- 26,31 ---- /** * Run an application by deploying it locally; only return from ant after it has finished. + * The default timeout of this task is zero; it only exits when finished. + * * @ant.task category="SmartFrog" name="sf-run" */ *************** *** 36,39 **** --- 38,42 ---- super.init(); setFailOnError(true); + setTaskTimeout(0); } *************** *** 49,52 **** --- 52,56 ---- /** * run a task + * * @throws org.apache.tools.ant.BuildException * if something goes wrong with the build Index: SmartFrogTask.java =================================================================== RCS file: /cvsroot/smartfrog/core/extras/ant/src/org/smartfrog/tools/ant/SmartFrogTask.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** SmartFrogTask.java 29 Mar 2004 14:53:59 -0000 1.15 --- SmartFrogTask.java 29 Mar 2004 15:37:34 -0000 1.16 *************** *** 24,30 **** import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Java; import org.apache.tools.ant.types.Environment; import org.apache.tools.ant.types.PropertySet; - import org.apache.tools.ant.types.Assertions; import java.io.File; --- 24,30 ---- import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Java; + import org.apache.tools.ant.types.Assertions; import org.apache.tools.ant.types.Environment; import org.apache.tools.ant.types.PropertySet; import java.io.File; *************** *** 40,44 **** * What is not a detail is that the combined classpath of ant+ any classpath parameters must include * all the relevant smartfrog JAR files. ! * * Smartfrog can be configured via system properties, an ini file, or the explicit * properties of this task. All the attributes of this task that configure SmartFrog --- 40,44 ---- * What is not a detail is that the combined classpath of ant+ any classpath parameters must include * all the relevant smartfrog JAR files. ! * <p/> * Smartfrog can be configured via system properties, an ini file, or the explicit * properties of this task. All the attributes of this task that configure SmartFrog *************** *** 46,50 **** * SmartFrog apply, not any hard coded in the task. This also permits one to override smartfrog * by setting system properties inline, or in a property set. - * */ public abstract class SmartFrogTask extends TaskBase { --- 46,49 ---- *************** *** 63,67 **** * name of host */ ! private String host=null; --- 62,66 ---- * name of host */ ! private String host = null; *************** *** 82,106 **** /** ! SmartFrog daemon connection port. ! org.smartfrog.ProcessCompound.sfRootLocatorPort=3800; ! */ protected Integer port; // = 3800; /** ! Liveness check period (in seconds); default=15. ! org.smartfrog.ProcessCompound.sfLivenessDelay=15; ! */ protected Integer livenessCheckPeriod; // = 15; /** ! * Liveness check retries * org.smartfrog.ProcessCompound.sfLivenessFactor=5; ! */ ! protected Integer livenessCheckRetries; // = 5; /** * Allow spawning of subprocess ! *# org.smartfrog.ProcessCompound.sfProcessAllow=true; ! */ protected Boolean allowSpawning; // = true; --- 81,105 ---- /** ! * SmartFrog daemon connection port. ! * org.smartfrog.ProcessCompound.sfRootLocatorPort=3800; ! */ protected Integer port; // = 3800; /** ! * Liveness check period (in seconds); default=15. ! * org.smartfrog.ProcessCompound.sfLivenessDelay=15; ! */ protected Integer livenessCheckPeriod; // = 15; /** ! * Liveness check retries * org.smartfrog.ProcessCompound.sfLivenessFactor=5; ! */ ! protected Integer livenessCheckRetries; // = 5; /** * Allow spawning of subprocess ! * # org.smartfrog.ProcessCompound.sfProcessAllow=true; ! */ protected Boolean allowSpawning; // = true; *************** *** 108,120 **** * Subprocess creation/failure timeout - default=60 seconds * (slower machines might need longer periods to start a new subprocess) ! * org.smartfrog.ProcessCompound.sfProcessTimeout=60; */ ! protected Integer spawnTimeout; // = 60; /** ! * stack tracing ! * map to org.smartfrog.logger.logStrackTrace ! */ protected Boolean logStackTraces; //= false; --- 107,119 ---- * Subprocess creation/failure timeout - default=60 seconds * (slower machines might need longer periods to start a new subprocess) ! * org.smartfrog.ProcessCompound.sfProcessTimeout=60; */ ! protected Integer spawnTimeout; // = 60; /** ! * stack tracing ! * map to org.smartfrog.logger.logStrackTrace ! */ protected Boolean logStackTraces; //= false; *************** *** 136,149 **** */ ! int taskTimeout; /** * codebase string - * */ ! protected List codebase=new LinkedList(); /** * add a file to the list * @param filename */ --- 135,150 ---- */ ! private int taskTimeout = DEFAULT_TIMEOUT_VALUE; ! ! public static final int DEFAULT_TIMEOUT_VALUE = 60; /** * codebase string */ ! protected List codebase = new LinkedList(); /** * add a file to the list + * * @param filename */ *************** *** 154,157 **** --- 155,159 ---- /** * add a URL to the list. + * * @param url URL (or file) to add */ *************** *** 162,165 **** --- 164,168 ---- /** * set the hostname to deploy to (optional) + * * @param host */ *************** *** 170,173 **** --- 173,177 ---- /** * port of daemon; optional -default is 3800 + * * @param port */ *************** *** 178,181 **** --- 182,186 ---- /** * liveness check in seconds; optional + * * @param livenessCheckPeriod */ *************** *** 186,189 **** --- 191,195 ---- /** * retry count for liveness checks. + * * @param livenessCheckRetries */ *************** *** 194,197 **** --- 200,204 ---- /** * can this process spawn new processes? + * * @param allowSpawning */ *************** *** 202,205 **** --- 209,213 ---- /** * when to assume a spawn failed -in seconds. + * * @param spawnTimeout */ *************** *** 211,222 **** /** * the name of a smartfrog file to load on startupe * @param initialSmartfrogFile */ public void setInitialSmartfrogFile(File initialSmartfrogFile) { ! if(!initialSmartfrogFile.exists()) { ! throw new BuildException("Not found: "+initialSmartfrogFile); } ! if(!initialSmartfrogFile.isFile()) { ! throw new BuildException("Unexpected file type: " + initialSmartfrogFile); } --- 219,232 ---- /** * the name of a smartfrog file to load on startupe + * * @param initialSmartfrogFile */ public void setInitialSmartfrogFile(File initialSmartfrogFile) { ! if (!initialSmartfrogFile.exists()) { ! throw new BuildException("Not found: " + initialSmartfrogFile); } ! if (!initialSmartfrogFile.isFile()) { ! throw new BuildException( ! "Unexpected file type: " + initialSmartfrogFile); } *************** *** 227,230 **** --- 237,241 ---- /** * get the current host + * * @return */ *************** *** 234,240 **** - /** * Name an ini file can contain data that overrides the basic settings. * @param iniFile */ --- 245,251 ---- /** * Name an ini file can contain data that overrides the basic settings. + * * @param iniFile */ *************** *** 254,273 **** /** ! * get the base java task ! * @return a java task set up with forking, the entry point set to SFSystem * */ protected Java getBaseJavaTask() { ! Java java =createJavaTask("org.smartfrog.SFSystem", getTaskTitle()); java.setFork(true); - - java.setDir(getProject().getBaseDir()); ! return java; } /** * get the title string used to name a task * @return the name of the task */ --- 265,294 ---- /** ! * get the base java task with common config options * + * @return a java task set up with forking, the entry point set to SFSystem, timeout maybe enabled */ protected Java getBaseJavaTask() { ! Java java = createJavaTask("org.smartfrog.SFSystem", getTaskTitle()); java.setFork(true); java.setDir(getProject().getBaseDir()); ! applyTimeout(java); return java; } + + /** + * apply any defined timeout; do nothing if there is none + */ + protected void applyTimeout(Java jvm) { + if (getTaskTimeout() > 0) { + long timeoutMS = getTaskTimeout() * 1000L; + jvm.setTimeout(new Long(timeoutMS)); + } + } + /** * get the title string used to name a task + * * @return the name of the task */ *************** *** 305,308 **** --- 326,330 ---- /** * set the fail on error flag. + * * @param failOnError */ *************** *** 315,322 **** --- 337,355 ---- * set the timeout of a task, in seconds. After this time it will be * killed. + * * @param taskTimeout */ public void setTaskTimeout(int taskTimeout) { this.taskTimeout = taskTimeout; + applyTimeout(smartfrog); + } + + /** + * get the task timeout (in seconds) + * + * @return + */ + public int getTaskTimeout() { + return taskTimeout; } *************** *** 329,332 **** --- 362,366 ---- smartfrog.addAssertions(asserts); } + /** * adds the ini file by setting the appropriate system property *************** *** 334,338 **** protected void addIniFile() { if (iniFile != null && iniFile.exists()) { ! addSmartfrogProperty("org.smartfrog.iniFile",iniFile.toString()); } } --- 368,372 ---- protected void addIniFile() { if (iniFile != null && iniFile.exists()) { ! addSmartfrogProperty("org.smartfrog.iniFile", iniFile.toString()); } } *************** *** 340,361 **** protected void setStandardSmartfrogProperties() { addSmartfrogPropertyIfDefined("org.smartfrog.logger.logStackTrace", ! logStackTraces); ! addSmartfrogPropertyIfDefined("org.smartfrog.ProcessCompound.sfRootLocatorPort", ! port); ! addSmartfrogPropertyIfDefined("org.smartfrog.ProcessCompound.sfLivenessDelay", ! livenessCheckPeriod); ! addSmartfrogPropertyIfDefined("org.smartfrog.ProcessCompound.sfLivenessFactor", ! livenessCheckRetries); ! addSmartfrogPropertyIfDefined("org.smartfrog.ProcessCompound.sfProcessAllow", ! allowSpawning); ! addSmartfrogPropertyIfDefined("org.smartfrog.ProcessCompound.sfProcessTimeout", ! spawnTimeout); ! if(codebase!=null && !codebase.isEmpty()) { //add the codebase for extra stuff ! String codelist=Codebase.getCodebaseString(codebase); ! // if(codelist.length()>0) { ! log("Codebase set to "+codelist,Project.MSG_VERBOSE); ! addSmartfrogProperty("org.smartfrog.codebase",codelist); } } --- 374,400 ---- protected void setStandardSmartfrogProperties() { addSmartfrogPropertyIfDefined("org.smartfrog.logger.logStackTrace", ! logStackTraces); ! addSmartfrogPropertyIfDefined( ! "org.smartfrog.ProcessCompound.sfRootLocatorPort", ! port); ! addSmartfrogPropertyIfDefined( ! "org.smartfrog.ProcessCompound.sfLivenessDelay", ! livenessCheckPeriod); ! addSmartfrogPropertyIfDefined( ! "org.smartfrog.ProcessCompound.sfLivenessFactor", ! livenessCheckRetries); ! addSmartfrogPropertyIfDefined( ! "org.smartfrog.ProcessCompound.sfProcessAllow", ! allowSpawning); ! addSmartfrogPropertyIfDefined( ! "org.smartfrog.ProcessCompound.sfProcessTimeout", ! spawnTimeout); ! if (codebase != null && !codebase.isEmpty()) { //add the codebase for extra stuff ! String codelist = Codebase.getCodebaseString(codebase); ! // if(codelist.length()>0) { ! log("Codebase set to " + codelist, Project.MSG_VERBOSE); ! addSmartfrogProperty("org.smartfrog.codebase", codelist); } } *************** *** 365,369 **** /** ! * add a command * * @param command --- 404,408 ---- /** ! * add a command * * @param command *************** *** 371,375 **** * @throws BuildException if there is no app name */ ! protected void addApplicationCommand(String command, String name) { verifyApplicationName(name); addArg(command); --- 410,414 ---- * @throws BuildException if there is no app name */ ! protected void addApplicationCommand(String command, String name) { verifyApplicationName(name); addArg(command); *************** *** 380,390 **** * verify the app name is valid by whatever logic we have * current asserts that it is non null * @param application * @throws BuildException when unhappy - * */ protected void verifyApplicationName(String application) ! throws BuildException{ ! if(application==null || application.length()==0) { throw new BuildException("Missing application name"); } --- 419,429 ---- * verify the app name is valid by whatever logic we have * current asserts that it is non null + * * @param application * @throws BuildException when unhappy */ protected void verifyApplicationName(String application) ! throws BuildException { ! if (application == null || application.length() == 0) { throw new BuildException("Missing application name"); } *************** *** 405,409 **** * * @param sysp set of properties to add - * * @since Ant 1.6 */ --- 444,447 ---- *************** *** 411,420 **** smartfrog.addSyspropertyset(sysp); } /** * set a sys property on the smartfrog JVM * @param name * @param value */ ! protected void addSmartfrogProperty(String name,String value) { Environment.Variable property = new Environment.Variable(); property.setKey(name); --- 449,460 ---- smartfrog.addSyspropertyset(sysp); } + /** * set a sys property on the smartfrog JVM + * * @param name * @param value */ ! protected void addSmartfrogProperty(String name, String value) { Environment.Variable property = new Environment.Variable(); property.setKey(name); *************** *** 426,434 **** /** * set a sys property on the smartfrog JVM if the object used to set the property value is defined * @param name * @param object: if defined the toString() value is used */ protected void addSmartfrogPropertyIfDefined(String name, Object object) { ! if(object!=null) { addSmartfrogProperty(name, object.toString()); } --- 466,475 ---- /** * set a sys property on the smartfrog JVM if the object used to set the property value is defined + * * @param name * @param object: if defined the toString() value is used */ protected void addSmartfrogPropertyIfDefined(String name, Object object) { ! if (object != null) { addSmartfrogProperty(name, object.toString()); } *************** *** 437,446 **** /** - * * run smartfrog and throw an exception if something went awry. * failure texts are for when smartfrog ran and failed; errorTexts when * smartfrog wouldnt run. * @param failureText text when return value==-1 ! * @param errorText text when return value!=0 && !=1- * @throws BuildException if the return value from java!=0 */ --- 478,487 ---- /** * run smartfrog and throw an exception if something went awry. * failure texts are for when smartfrog ran and failed; errorTexts when * smartfrog wouldnt run. + * * @param failureText text when return value==-1 ! * @param errorText text when return value!=0 && !=1- * @throws BuildException if the return value from java!=0 */ *************** *** 451,462 **** //this is because pre Ant1.7, even setting this to false stops spawn working //delayed setting only when the flag is true reduces the need to flip the bit ! if(failOnError) { smartfrog.setFailonerror(failOnError); } ! int err= smartfrog.executeJava(); ! if(!failOnError) { return; } ! switch(err) { case 0: return; --- 492,503 ---- //this is because pre Ant1.7, even setting this to false stops spawn working //delayed setting only when the flag is true reduces the need to flip the bit ! if (failOnError) { smartfrog.setFailonerror(failOnError); } ! int err = smartfrog.executeJava(); ! if (!failOnError) { return; } ! switch (err) { case 0: return; *************** *** 468,472 **** throw new BuildException(failureText); default: ! throw new BuildException(errorText+" - error code "+err); } } --- 509,513 ---- throw new BuildException(failureText); default: ! throw new BuildException(errorText + " - error code " + err); } } *************** *** 474,489 **** /** * simpler entry point with a set message on errors * @param failureText text when smartfrog returns '1' */ protected void execSmartfrog(String failureText) { ! execSmartfrog(failureText,"Problems running smartfrog JVM"); } /** * check no host; ! * @throws org.apache.tools.ant.BuildException if a host is defined */ protected void checkNoHost() { ! if(host!=null && host.length()>0) { throw new BuildException("host cannot be set on this task"); } --- 515,533 ---- /** * simpler entry point with a set message on errors + * * @param failureText text when smartfrog returns '1' */ protected void execSmartfrog(String failureText) { ! execSmartfrog(failureText, "Problems running smartfrog JVM"); } /** * check no host; ! * ! * @throws org.apache.tools.ant.BuildException ! * if a host is defined */ protected void checkNoHost() { ! if (host != null && host.length() > 0) { throw new BuildException("host cannot be set on this task"); } *************** *** 503,510 **** /** * the URL of the JAR file * @param url */ public void setURL(String url) { ! location=url; } --- 547,555 ---- /** * the URL of the JAR file + * * @param url */ public void setURL(String url) { ! location = url; } *************** *** 512,515 **** --- 557,561 ---- * provide a URL. This is for the convenience of programmatic access, not * ant build files + * * @param url */ *************** *** 520,531 **** /** * name a JAR file for addition to the path * @param file */ public void setFile(File file) { ! if(!file.exists()) { ! throw new BuildException("Not found :"+file); } ! if(file.isDirectory()) { ! throw new BuildException("Not a JAR file :"+file); } try { --- 566,578 ---- /** * name a JAR file for addition to the path + * * @param file */ public void setFile(File file) { ! if (!file.exists()) { ! throw new BuildException("Not found :" + file); } ! if (file.isDirectory()) { ! throw new BuildException("Not a JAR file :" + file); } try { *************** *** 538,541 **** --- 585,589 ---- /** * get the location + * * @return */ *************** *** 546,559 **** /** * take a list of codebase elements and then turn them into a string * @param codebases * @return */ public static String getCodebaseString(List codebases) { ! StringBuffer results=new StringBuffer(); ! Iterator it=codebases.iterator(); while (it.hasNext()) { Codebase codebase = (Codebase) it.next(); ! String l= codebase.getLocation(); ! if(l==null) { throw new BuildException("Undefined codebase"); } --- 594,608 ---- /** * take a list of codebase elements and then turn them into a string + * * @param codebases * @return */ public static String getCodebaseString(List codebases) { ! StringBuffer results = new StringBuffer(); ! Iterator it = codebases.iterator(); while (it.hasNext()) { Codebase codebase = (Codebase) it.next(); ! String l = codebase.getLocation(); ! if (l == null) { throw new BuildException("Undefined codebase"); } |