[Checkins] SVN: zc.resumelb/trunk/src/zc/resumelb/ - Fixed: When using single-version mode, flapping between versions

jim cvs-admin at zope.org
Wed Oct 17 20:28:53 UTC 2012


Log message for revision 128039:
  - Fixed: When using single-version mode, flapping between versions
    could cause worker and book backlogs to be computed concorrectly,
    causing assertion errors.
  

Changed:
  U   zc.resumelb/trunk/src/zc/resumelb/README.txt
  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
  U   zc.resumelb/trunk/src/zc/resumelb/tests.py

-=-
Modified: zc.resumelb/trunk/src/zc/resumelb/README.txt
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/README.txt	2012-10-17 20:21:36 UTC (rev 128038)
+++ zc.resumelb/trunk/src/zc/resumelb/README.txt	2012-10-17 20:28:49 UTC (rev 128039)
@@ -250,6 +250,10 @@
   "flapping".  (ZooKeeper might report that workers had gone away and
   come back without the workers actually going away.)
 
+- Fixed: When using single-version mode, flapping between versions
+  could cause worker and book backlogs to be computed concorrectly,
+  causing assertion errors.
+
 0.7.0 (2012-07-05)
 ------------------
 

Modified: zc.resumelb/trunk/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.py	2012-10-17 20:21:36 UTC (rev 128038)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.py	2012-10-17 20:28:49 UTC (rev 128039)
@@ -328,7 +328,10 @@
             _decay_backlog(worker, self.worker_decay)
 
 def _init_backlog(worker):
-    worker.backlog = worker.nbacklog = worker.dbacklog = worker.mbacklog = 0
+    worker.backlog  = getattr(worker,  'backlog', 0)
+    worker.dbacklog = getattr(worker, 'dbacklog', worker.backlog)
+    worker.nbacklog = getattr(worker, 'nbacklog', 0)
+    worker.mbacklog = getattr(worker, 'mbacklog', worker.backlog)
 
 def _decay_backlog(worker, decay):
     worker.dbacklog = worker.dbacklog*decay + worker.backlog

Modified: zc.resumelb/trunk/src/zc/resumelb/pool.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/pool.test	2012-10-17 20:21:36 UTC (rev 128038)
+++ zc.resumelb/trunk/src/zc/resumelb/pool.test	2012-10-17 20:28:49 UTC (rev 128039)
@@ -313,6 +313,12 @@
 used immediately.
 
     >>> pool.update_settings(dict(variance=1))
+
+    >>> def zero_workers(*workers):
+    ...     for worker in workers:
+    ...         worker.backlog=worker.nbacklog=worker.dbacklog=worker.mbacklog=0
+    >>> zero_workers(w1, w2, w3)
+
     >>> pool.new_resume(w1, {'bar': 2.0})
     >>> pool.new_resume(w2, {'bar': 2.0})
     >>> pool.new_resume(w3, {'bar': 2.0})

Modified: zc.resumelb/trunk/src/zc/resumelb/single_version.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/single_version.test	2012-10-17 20:21:36 UTC (rev 128038)
+++ zc.resumelb/trunk/src/zc/resumelb/single_version.test	2012-10-17 20:28:49 UTC (rev 128039)
@@ -106,12 +106,13 @@
     Version: 1
       Inactive: 2: set([w3])
     Request classes:
-      a: w2(1.0,0)
-      b: w1(1.0,0)
+      a: w2(1.0,1.0)
+      b: w1(1.0,0.48...)
       c: 
     Backlogs:
       overall backlog: 2 Decayed: 2.58547913529 Avg: 1.29273956765
-      0: [w1, w2]
+      0: [w1]
+      1: [w2]
 
 If we make a request, it'll be handled by the bew quorum:
 
@@ -124,12 +125,11 @@
     >>> print pool # doctest: +ELLIPSIS
     Version: 1
     Request classes:
-      a: w2(1.0,0)
-      b: w1(1.0,1.0)
+      a: w2(1.0,1.0)
+      b: w1(1.0,0.66...)
       c: 
     Backlogs:
       overall backlog: 2 Decayed: 2.56315626836 Avg: 1.28157813418
-      0: [w2]
-      1: [w1]
+      1: [w1, w2]
 
 We don't print inactive, since there aren't any.

Modified: zc.resumelb/trunk/src/zc/resumelb/tests.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/tests.py	2012-10-17 20:21:36 UTC (rev 128038)
+++ zc.resumelb/trunk/src/zc/resumelb/tests.py	2012-10-17 20:28:49 UTC (rev 128039)
@@ -156,8 +156,9 @@
         socket.close()
 
 class FauxPoolWorker:
-    def __init__(self, name):
+    def __init__(self, name, version=None):
         self.name = name
+        self.version = version
     def __repr__(self):
         return self.name
     def __cmp__(self, other):
@@ -365,6 +366,41 @@
     >>> lb.stop()
     """
 
+def dont_reset_worker_backlogs_if_they_already_have_them():
+    """
+    >>> pool = zc.resumelb.lb.Pool(single_version=True)
+
+We have a pool at version 1:
+
+    >>> w1 = FauxPoolWorker('1', '1')
+    >>> pool.new_resume(w1, {})
+    >>> for i in range(9):
+    ...    _ = pool.get('')
+
+    >>> pool.backlog
+    9
+
+We switch to version 2:
+
+    >>> w2 = FauxPoolWorker('2', '2')
+    >>> w3 = FauxPoolWorker('3', '2')
+    >>> pool.new_resume(w2, {})
+    >>> pool.new_resume(w3, {})
+
+    >>> pool.backlog
+    9
+    >>> pool.version
+    '2'
+
+Now, somehow, we switch back to version 1.  Not sure how:
+
+    >>> pool.remove(w2)
+    >>> pool.remove(w3)
+
+    >>> w1.backlog
+    9
+    """
+
 def test_classifier(env):
     return "yup, it's a test"
 



More information about the checkins mailing list