[Checkins] SVN: zc.resumelb/trunk/src/zc/resumelb/lb. Added support for passing versions to set_worker_addrs.
jim
cvs-admin at zope.org
Wed Jul 4 13:36:38 UTC 2012
Log message for revision 127265:
Added support for passing versions to set_worker_addrs.
Changed:
U zc.resumelb/trunk/src/zc/resumelb/lb.py
U zc.resumelb/trunk/src/zc/resumelb/lb.test
-=-
Modified: zc.resumelb/trunk/src/zc/resumelb/lb.py
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.py 2012-07-04 12:28:53 UTC (rev 127264)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.py 2012-07-04 13:36:34 UTC (rev 127265)
@@ -38,23 +38,27 @@
self.set_worker_addrs(worker_addrs)
def set_worker_addrs(self, addrs):
- addrs = set(addrs)
+ # addrs can be an iterable of addresses, or a dict {addr -> version}
+ if not isinstance(addrs, dict):
+ addrs = dict((addr, None) for addr in addrs)
+
workletts = self.workletts
old = list(workletts)
for addr in addrs:
if addr not in workletts:
- workletts[addr] = gevent.spawn(self.connect, addr, workletts)
+ workletts[addr] = gevent.spawn(
+ self.connect, addr, workletts, addrs[addr])
for addr in old:
if addr not in addrs:
workletts.pop(addr)
connect_sleep = 1.0
- def connect(self, addr, workletts):
+ def connect(self, addr, workletts, version):
while addr in workletts:
try:
socket = gevent.socket.create_connection(addr)
- Worker(self.pool, socket, addr)
+ Worker(self.pool, socket, addr, version)
except gevent.GreenletExit, v:
try:
socket.close()
@@ -277,11 +281,12 @@
maxrno = (1<<32) - 1
- def __init__(self, pool, socket, addr):
+ def __init__(self, pool, socket, addr, version):
self.pool = pool
self.nrequest = 0
self.requests = {}
self.__name__ = '%s:%s' % addr
+ self.version = version
readers = self.connected(socket, addr)
Modified: zc.resumelb/trunk/src/zc/resumelb/lb.test
===================================================================
--- zc.resumelb/trunk/src/zc/resumelb/lb.test 2012-07-04 12:28:53 UTC (rev 127264)
+++ zc.resumelb/trunk/src/zc/resumelb/lb.test 2012-07-04 13:36:34 UTC (rev 127265)
@@ -480,6 +480,24 @@
Typically, by the time we remove an address, the worker will already
have gone away.
+By default, workers don't have versions:
+
+ >>> [w.version for w in lb.pool.workers]
+ [None, None]
+
+When adding workers, however, we can supply a dictionary, mapping
+addresses to versions, rather than a list.
+
+ >>> workers.append(Worker())
+ >>> lb.set_worker_addrs(dict((w.addr, 1) for w in workers))
+ >>> wait(lambda : hasattr(workers[-1], 'socket'))
+ >>> write_message(workers[-1].socket, 0, {'h4.com': 10})
+ >>> gevent.sleep(.01)
+ >>> sorted(str(w.version) for w in lb.pool.workers)
+ ['1', 'None', 'None']
+
+(only new workers are affected.)
+
Graceful shutdown
=================
More information about the checkins
mailing list