[Checkins] SVN: zc.resumelb/trunk/src/zc/resumelb/ Simplify management of worker and pool backlog to, hopefully, avoid

jim cvs-admin at zope.org
Wed Oct 17 20:59:47 UTC 2012


Log message for revision 128040:
  Simplify management of worker and pool backlog to, hopefully, avoid
  backlogs from getting out of whack.
  

Changed:
  U   zc.resumelb/trunk/src/zc/resumelb/lb.py
  U   zc.resumelb/trunk/src/zc/resumelb/pool.test
  U   zc.resumelb/trunk/src/zc/resumelb/single_version.test

-=-
Modified: zc.resumelb/trunk/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.py	2012-10-17 20:28:49 UTC (rev 128039)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.py	2012-10-17 20:59:44 UTC (rev 128040)
@@ -87,20 +87,20 @@
         while 1:
             worker = self.pool.get(rclass)
             try:
-                result = worker.handle(rclass, env, start_response)
-                self.pool.put(worker)
-                return result
+                return worker.handle(rclass, env, start_response)
             except zc.resumelb.util.Disconnected:
                 if (int(env.get('CONTENT_LENGTH', 0)) == 0 and
                     env.get('REQUEST_METHOD') in retry_methods
                     ):
-                    logger.info("retrying %s", env)
+                    logger.info("%s disconnected, retrying %s", worker, env)
                 else:
                     return webob.Response(
                         status = '502 Bad Gateway',
                         content_type= 'text/html',
                         body = self.disconnect_message
                         )(env, start_response)
+            finally:
+                self.pool.put(worker)
 
 class Pool:
 
@@ -240,11 +240,6 @@
             self.event.clear()
 
     def remove(self, worker):
-
-        self.backlog -= worker.backlog
-        assert self.backlog >= 0, self.backlog
-        _decay_backlog(self, self.decay)
-
         if self.single_version:
             self.byversion[worker.version].remove(worker)
             if worker.version == self.version:
@@ -323,10 +318,11 @@
         self.backlog -= 1
         assert self.backlog >= 0, self.backlog
         _decay_backlog(self, self.decay)
-        if worker.backlog > 0:
-            worker.backlog -= 1
-            _decay_backlog(worker, self.worker_decay)
 
+        worker.backlog -= 1
+        assert worker.backlog >= 0
+        _decay_backlog(worker, self.worker_decay)
+
 def _init_backlog(worker):
     worker.backlog  = getattr(worker,  'backlog', 0)
     worker.dbacklog = getattr(worker, 'dbacklog', worker.backlog)

Modified: zc.resumelb/trunk/src/zc/resumelb/pool.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/pool.test	2012-10-17 20:28:49 UTC (rev 128039)
+++ zc.resumelb/trunk/src/zc/resumelb/pool.test	2012-10-17 20:59:44 UTC (rev 128040)
@@ -229,15 +229,12 @@
     >>> pool.put(w1)
     >>> pool.put(w3)
     >>> pool.put(w3)
-    >>> pool.put(w3)
-    >>> pool.put(w3)
-    >>> pool.put(w3)
     >>> pool # doctest: +ELLIPSIS
     Request classes:
       bar: w2(2.0,1.5...)
       foo: w5(0.5,1.5...), w2(2.0,1.5...), w3(3.8,1.2...), w1(5.9,2.7...)
     Backlogs:
-      overall backlog: 4 Decayed: 7.9... Avg: 1.5...
+      overall backlog: 7 Decayed: 8.4... Avg: 1.6...
       0: [w3, w4]
       2: [w2, w5]
       3: [w1]
@@ -251,13 +248,21 @@
 When a worker disconnect, it's removed from the pool:
 
     >>> pool.remove(w1)
+    >>> pool.put(w1)
+    >>> pool.put(w1)
+    >>> pool.put(w1)
+    >>> pool.put(w1)
+    >>> pool.put(w1)
     >>> pool.remove(w3)
+    >>> pool.put(w3)
+    >>> pool.put(w3)
+    >>> pool.put(w3)
     >>> pool # doctest: +ELLIPSIS
     Request classes:
       bar: w2(2.0,1.57...)
       foo: w5(0.5,1.57...), w2(2.0,1.57...)
     Backlogs:
-      overall backlog: 1 Decayed: 7.1... Avg: 2.3...
+      overall backlog: 4 Decayed: 8.2... Avg: 2.7...
       0: [w4]
       2: [w2, w5]
 

Modified: zc.resumelb/trunk/src/zc/resumelb/single_version.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/single_version.test	2012-10-17 20:28:49 UTC (rev 128039)
+++ zc.resumelb/trunk/src/zc/resumelb/single_version.test	2012-10-17 20:59:44 UTC (rev 128040)
@@ -102,6 +102,7 @@
 
     >>> pool.remove(w4)
     >>> pool.remove(w5)
+    >>> pool.put(w5)
     >>> print pool # doctest: +ELLIPSIS
     Version: 1
       Inactive: 2: set([w3])
@@ -110,7 +111,7 @@
       b: w1(1.0,0.48...)
       c: 
     Backlogs:
-      overall backlog: 2 Decayed: 2.58547913529 Avg: 1.29273956765
+      overall backlog: 2 Decayed: 2.5... Avg: 1.2...
       0: [w1]
       1: [w2]
 
@@ -122,6 +123,7 @@
 If we remove the last version 2:
 
     >>> pool.remove(w3)
+    >>> pool.put(w3)
     >>> print pool # doctest: +ELLIPSIS
     Version: 1
     Request classes:
@@ -129,7 +131,7 @@
       b: w1(1.0,0.66...)
       c: 
     Backlogs:
-      overall backlog: 2 Decayed: 2.56315626836 Avg: 1.28157813418
+      overall backlog: 2 Decayed: 2.5... Avg: 1.2...
       1: [w1, w2]
 
 We don't print inactive, since there aren't any.



More information about the checkins mailing list