Author: challngr Date: Sat May 18 13:54:32 2013 New Revision: 1484119 URL: http://svn.apache.org/r1484119 Log: UIMA-2919 Service Manager tweaks 1. Use same ping interval logic for external and internal pingers (Was different for a while to bypass AMQ OOM issues) 2. Set ping-active and ping-only status in the meta file for use by web server 3. Take ping-only status into account for autotstarted services
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/IServiceMeta.java uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/PingDriver.java uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/IServiceMeta.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/IServiceMeta.java?rev=1484119&r1=1484118&r2=1484119&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/IServiceMeta.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/IServiceMeta.java Sat May 18 13:54:32 2013 @@ -27,5 +27,4 @@ interface IServiceMeta ServiceStatistics getServiceStatistics(); public void run(); public void stop(); - public void reference(); } Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/PingDriver.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/PingDriver.java?rev=1484119&r1=1484118&r2=1484119&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/PingDriver.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/PingDriver.java Sat May 18 13:54:32 2013 @@ -49,7 +49,7 @@ import org.apache.uima.ducc.common.utils */ class PingDriver - implements IServiceMeta, + implements IServiceMeta, // (extends runnable ) SmConstants { /** @@ -78,14 +78,13 @@ class PingDriver StdioListener ser_listener = null; PingThread pinger = null; - int META_PING_MAX = 32*60*1000; // 32 minutes ( a shade over 30 ...) - int meta_ping_rate; - Object ping_rate_sync = new Object(); - - int meta_ping_stability; - String meta_ping_timeout; - Thread ping_thread; - boolean internal_ping = true; + int meta_ping_rate; // ducc.properties configured ping rate + int meta_ping_stability; // ducc.properties number of missed pings before setting service unresponive + String meta_ping_timeout; // job.properties configured time to wait for ping to return in ms + Thread ping_thread; // thread to manage external process pingers + boolean internal_ping = true; // if true, use default UIMA-AS pinger in thread inside SM propert + AServicePing internal_pinger = null; // pinger used if internal_ping is true + ServiceStatistics service_statistics = null; String user; @@ -95,7 +94,6 @@ class PingDriver boolean shutdown = false; - AServicePing internal_pinger = null; PingDriver(ServiceSet sset) { @@ -107,9 +105,7 @@ class PingDriver this.user = meta_props.getStringProperty("user"); String jvm_args_str = job_props.getStringProperty("service_ping_jvm_args", ""); this.ping_class = job_props.getStringProperty("service_ping_class", null); - - if ( (ping_class == null) || ping_class.equals(UimaAsPing.class.getName()) ) { internal_ping = true; } else { @@ -154,18 +150,6 @@ class PingDriver { return service_statistics; } - - public void reference() - { - if ( internal_ping ) return; // internal ping, doesn't need this kludge - - synchronized(ping_rate_sync) { - meta_ping_rate = 500; - } - if ( ping_thread != null ) { - ping_thread.interrupt(); - } - } synchronized int getMetaPingRate() { @@ -422,22 +406,10 @@ class PingDriver // Try to read the response handleStatistics((ServiceStatistics) ois.readObject()); - // This kliudge is required because we have to insure that pings aren't too frequent or ActiveMQ will get OutOfMemory errors. - // So we do exponential backoff. If a new job references the service we set the ping rate to something frequent for a while - // to insure waiting jobs don't have to wait too long ( done in PingDriver object ). - int my_ping_rate; - synchronized(ping_rate_sync) { - my_ping_rate = meta_ping_rate; - if ( (meta_ping_rate < META_PING_MAX) && ( missed_pings == 0) ) { - // double, if not at max rate, and pinging is working - meta_ping_rate = Math.min(META_PING_MAX, meta_ping_rate * 2); - } - } - // Wait a bit for the next one try { // logger.info(methodName, sset.getId(), "SLEEPING", my_ping_rate, "ms", sset.toString()); - Thread.sleep(my_ping_rate); + Thread.sleep(meta_ping_rate); // logger.info(methodName, sset.getId(), "SLEEP returns", sset.toString()); } catch (InterruptedException e) { // nothing Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java?rev=1484119&r1=1484118&r2=1484119&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceSet.java Sat May 18 13:54:32 2013 @@ -174,6 +174,8 @@ public class ServiceSet meta_props.put("service-alive", "false"); meta_props.put("service-healthy", "false"); meta_props.put("service-statistics", "N/A"); + meta_props.put("ping-only", "true"); + meta_filename = state_dir + "/services/" + id.toString() + ".meta"; saveMetaProperties(); } @@ -216,6 +218,8 @@ public class ServiceSet meta_props.put("service-healthy", "false"); meta_props.put("service-statistics", "N/A"); meta_props.put("implementors", ""+id.getFriendly()); + meta_props.put("ping-only", "false"); + meta_filename = state_dir + "/services/" + id.toString() + ".meta"; saveMetaProperties(); } @@ -273,7 +277,14 @@ public class ServiceSet meta_props.put("service-alive", "false"); meta_props.put("service-healthy", "false"); meta_props.put("service-statistics", "N/A"); - + + if ( isStartable() ) { + meta_props.put("ping-only", "true"); + } else { + meta_props.put("ping-only", "false"); + } + saveMetaProperties(); + //UIMAFramework.getLogger(BaseUIMAAsynchronousEngineCommon_impl.class).setLevel(Level.OFF); //UIMAFramework.getLogger(BaseUIMAAsynchronousEngine_impl.class).setLevel(Level.OFF); // there are a couple junky messages that slip by the above configurations. turn the whole danged thing off. @@ -464,6 +475,11 @@ public class ServiceSet if ( stopped ) return; // doing auto, but we've been manually stopped if ( failure_run >= failure_max ) return; // too many failures, no more enforcement + if ( (!isStartable()) && (serviceMeta == null) ) { // ping-only and pinger not alive + start(); // ... then it needs to be started + return; + } + // could have more implementors than instances if some were started dynamically but the count not persisted int needed = Math.max(0, instances - countImplementors()); @@ -758,6 +774,7 @@ public class ServiceSet "ping_class", job_props.getStringProperty("service_ping_class", UimaAsPing.class.getName()) ); + // This block is to clear the service queue from ActiveMq if it's no longer being used. if ( implementors.size() == 0 ) { // Went to 0 and there was a pinger? if ( ( (service_class == ServiceClass.Registered) && isStartable()) || isSubmitted() ) { // Is one of our happy cases (not ping-only, we don't know much about it.) if ( service_type == ServiceType.UimaAs ) { @@ -803,9 +820,7 @@ public class ServiceSet linger = null; } references.put(id, id); - if ( serviceMeta != null ) { - serviceMeta.reference(); - } + persistReferences(); return references.size(); }