Author: challngr Date: Wed Apr 9 19:43:15 2014 New Revision: 1586101 URL: http://svn.apache.org/r1586101 Log: UIMA-3726 Dynamic modification of registration parameters. Also support for process_debug in services.
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java?rev=1586101&r1=1586100&r2=1586101&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java Wed Apr 9 19:43:15 2014 @@ -67,6 +67,7 @@ public class DuccServiceApi UiOption.ProcessExecutable, UiOption.ProcessExecutableArgs, UiOption.ProcessInitializationTimeMax, + UiOption.ProcessDebug, UiOption.ClasspathOrder, // UiOption.Specification // not used for registration @@ -116,28 +117,30 @@ public class DuccServiceApi UiOption.Update, }; - // For use by SM, final to insure no accidental modification - final UiOption[] modify_options = { - UiOption.Help, - UiOption.Debug, - UiOption.Modify, - UiOption.Instances, - UiOption.Autostart, - UiOption.Activate, - - UiOption.ProcessInitializationTimeMax, - - UiOption.ServicePingArguments, - UiOption.ServicePingClass, - UiOption.ServicePingClasspath, - UiOption.ServicePingJvmArgs, - UiOption.ServicePingTimeout, - UiOption.ServicePingDoLog, - - UiOption.InstanceFailureWindow, - UiOption.InstanceFailureLimit, - UiOption.InstanceInitFailureLimit, - }; + // This gets generated from the registratoin_options. + UiOption[] modify_options; + // // For use by SM, final to insure no accidental modification + // UiOption[] modify_options = { + // UiOption.Help, + // UiOption.Debug, + // UiOption.Modify, + // UiOption.Instances, + // UiOption.Autostart, + // UiOption.Activate, + + // UiOption.ProcessInitializationTimeMax, + + // UiOption.ServicePingArguments, + // UiOption.ServicePingClass, + // UiOption.ServicePingClasspath, + // UiOption.ServicePingJvmArgs, + // UiOption.ServicePingTimeout, + // UiOption.ServicePingDoLog, + + // UiOption.InstanceFailureWindow, + // UiOption.InstanceFailureLimit, + // UiOption.InstanceInitFailureLimit, + // }; UiOption[] query_options = { UiOption.Help, @@ -148,6 +151,17 @@ public class DuccServiceApi public DuccServiceApi(IDuccCallback cb) { this.callback = cb; + + // generate modify options, same as registration options, only with the verb + // Modify insteady of Register, and on extra option, Activate. + modify_options = new UiOption[registration_options.length + 1]; + int i = 0; + for ( ; i < registration_options.length; i++ ) { + UiOption o = registration_options[i]; + if ( o == UiOption.Register ) o = UiOption.Modify; + modify_options[i] = o; + } + modify_options[i++] = UiOption.Activate; } private Pair<Integer, String> getId(UiOption opt) @@ -230,6 +244,27 @@ public class DuccServiceApi } } + /** + * Attempt a fast-fail if a bad debug port is specified. + */ + private void enrichPropertiesForDebug() + { + String debug_port = cli_props.getProperty(UiOption.ProcessDebug.pname()); + if ( debug_port == null ) return; + + try { + int port = Integer.parseInt(debug_port); + } catch ( NumberFormatException e ) { + throw new IllegalArgumentException("Invalid debug port specified, not numeric: " + debug_port); + } + + String debug_host = cli_props.getProperty(UiOption.ProcessDebugHost.pname()); + if ( debug_host == null ) { + cli_props.put(UiOption.ProcessDebugHost.pname(), host_address); + } + + } + String extractEndpoint(String jvmargs) { String dd = cli_props.getStringProperty(UiOption.ProcessDD.pname()); // will throw if can't find the prop @@ -299,6 +334,8 @@ public class DuccServiceApi + "\n --service_request_endpoint: " + endpoint + "\n extracted: " + inferred_endpoint ); } + + enrichPropertiesForDebug(); } else if (endpoint.startsWith(ServiceType.Custom.decode())) { Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java?rev=1586101&r1=1586100&r2=1586101&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java Wed Apr 9 19:43:15 2014 @@ -58,6 +58,9 @@ public class DuccServiceSubmit UiOption.ProcessExecutableArgs, UiOption.ProcessInitializationTimeMax, + UiOption.ProcessDebug, + UiOption.ProcessDebugHost, + UiOption.InstanceFailureLimit, UiOption.ClasspathOrder, UiOption.Specification, @@ -106,6 +109,49 @@ public class DuccServiceSubmit { init (this.getClass().getName(), opts, props, requestProperties, null); } + + private void set_debug_parms(Properties props, int port) + { + } + + protected void enrich_parameters_for_debug(Properties props) + throws Exception + { + try { + int debug_port = -1; + String debug_host = null; + + // we allow both jd and jp to debug, but the ports have to differ + String do_debug = UiOption.ProcessDebug.pname(); + if ( props.containsKey(do_debug) ) { + String port_s = props.getProperty(do_debug); + if ( port_s == null ) { + throw new IllegalArgumentException("Missing port for " + do_debug); + } + debug_port = Integer.parseInt(port_s); + debug_host = props.getProperty(UiOption.ProcessDebugHost.pname()); + if ( debug_host == null ) { + throw new IllegalArgumentException("Debug is requested but process_debug_host is missing"); + } + + String debug_jvmargs = "-Xdebug -Xrunjdwp:transport=dt_socket,address=" + debug_host + ":" + debug_port; + String jvmargs = props.getProperty(UiOption.ProcessJvmArgs.pname()); + if (jvmargs == null) { + jvmargs = debug_jvmargs; + } else { + jvmargs += " " + debug_jvmargs; + } + props.put(UiOption.ProcessJvmArgs.pname(), jvmargs); + + // For debugging, if the JP is being debugged, insure these are conservative + props.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1"); + props.setProperty(UiOption.ProcessFailuresLimit.pname(), "1"); + } + + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid debug port (not numeric)"); + } + } /** * Execute collects the service parameters, does basic error and correctness checking, and sends @@ -124,6 +170,8 @@ public class DuccServiceSubmit String endpoint = requestProperties.getProperty(UiOption.ServiceRequestEndpoint.pname()); + boolean isUimaAs = true; + if (endpoint == null || endpoint.startsWith(ServiceType.UimaAs.decode())) { requestProperties.put(UiOption.ServiceTypeUima.pname(), ""); if (uimaDD == null) { @@ -167,6 +215,7 @@ public class DuccServiceSubmit } } else if (endpoint.startsWith(ServiceType.Custom.decode())) { + isUimaAs = false; if (uimaDD != null) { message("WARN: --process_DD is ignored for CUSTOM endpoints"); } @@ -183,7 +232,11 @@ public class DuccServiceSubmit if ( debug ) { requestProperties.dump(); } - + + if ( isUimaAs ) { + enrich_parameters_for_debug(requestProperties); + } + requestProperties.put(UiOption.ProcessThreadCount.pname(), "1"); // enforce this - OR will complain if it's missing SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(requestProperties);