You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by ch...@apache.org on 2013/01/29 21:40:05 UTC

svn commit: r1440108 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm: IServiceMeta.java PingDriver.java ServiceSet.java

Author: challngr
Date: Tue Jan 29 20:40:05 2013
New Revision: 1440108

URL: http://svn.apache.org/viewvc?rev=1440108&view=rev
Log:
UIMA-2615
DUCC Exponential backoff of service pingers.

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=1440108&r1=1440107&r2=1440108&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 Tue Jan 29 20:40:05 2013
@@ -27,4 +27,5 @@ 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=1440108&r1=1440107&r2=1440108&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 Tue Jan 29 20:40:05 2013
@@ -68,9 +68,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;
     ServiceStatistics service_statistics = null;
 
     String user;
@@ -129,6 +133,21 @@ class PingDriver
         return service_statistics;
     }
 
+    public void reference()
+    {
+        synchronized(ping_rate_sync) {
+            meta_ping_rate = 500;
+        }
+        if ( ping_thread != null ) {
+            ping_thread.interrupt();
+        }
+    }
+
+    synchronized int getMetaPingRate()
+    {
+        return meta_ping_rate;
+    }
+
     public void run() 
     {
         String methodName = "run";
@@ -141,7 +160,7 @@ class PingDriver
         }
         int port = pinger.getPort();
 
-        Thread ping_thread = new Thread(pinger);
+        ping_thread = new Thread(pinger);
         ping_thread.start();                            // sets up the listener, before we start the the external process
 
         ArrayList<String> arglist = new ArrayList<String>();
@@ -283,13 +302,6 @@ class PingDriver
                         logger.error(methodName, sset.getId(), e1);
                         errors++;
                     }
-
-                    // Wait a bit
-                    try {
-                        Thread.sleep(meta_ping_rate);
-                    } catch (InterruptedException e) {
-                        // nothing
-                    }
                     
                     // Try to read the response
                     // TODO: set the socket timeout on this
@@ -316,6 +328,27 @@ class PingDriver
                             }                
                         }
                     }
+
+                    // 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 ) {
+                            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);
+                        logger.info(methodName, sset.getId(), "SLEEP returns", sset.toString());
+                    } catch (InterruptedException e) {
+                        // nothing
+                    }
+
                 }
 			} catch (IOException e) {
                 logger.error(methodName, sset.getId(), "Error receiving ping", e);

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=1440108&r1=1440107&r2=1440108&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 Tue Jan 29 20:40:05 2013
@@ -565,6 +565,9 @@ public class ServiceSet
             linger = null;
         }
         references.put(id, id);
+        if ( serviceMeta != null ) {
+            serviceMeta.reference();
+        }
         return references.size();
     }