[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