[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