[Checkins] SVN: zc.zk/trunk/src/zc/zk/ - Fixed: ephemeral *sequence* nodes were restablished on session

jim cvs-admin at zope.org
Wed May 2 17:24:15 UTC 2012


Log message for revision 125622:
  - Fixed: ephemeral *sequence* nodes were restablished on session
    reestablishment and shouldn't have been.
  
  - Fixed: The testing ZooKeeper mock didn't implement sequence nodes
    correctly.
  

Changed:
  U   zc.zk/trunk/src/zc/zk/README.txt
  U   zc.zk/trunk/src/zc/zk/__init__.py
  U   zc.zk/trunk/src/zc/zk/ephemeral_node_recovery_on_session_reestablishment.test
  U   zc.zk/trunk/src/zc/zk/testing.py

-=-
Modified: zc.zk/trunk/src/zc/zk/README.txt
===================================================================
--- zc.zk/trunk/src/zc/zk/README.txt	2012-05-02 16:32:32 UTC (rev 125621)
+++ zc.zk/trunk/src/zc/zk/README.txt	2012-05-02 17:24:12 UTC (rev 125622)
@@ -1165,6 +1165,15 @@
 Change History
 ==============
 
+0.7.1 (2012-05-??)
+------------------
+
+- Fixed: ephemeral *sequence* nodes were restablished on session
+  reestablishment and shouldn't have been.
+
+- Fixed: The testing ZooKeeper mock didn't implement sequence nodes
+  correctly.
+
 0.7.0 (2012-01-27)
 ------------------
 

Modified: zc.zk/trunk/src/zc/zk/__init__.py
===================================================================
--- zc.zk/trunk/src/zc/zk/__init__.py	2012-05-02 16:32:32 UTC (rev 125621)
+++ zc.zk/trunk/src/zc/zk/__init__.py	2012-05-02 17:24:12 UTC (rev 125622)
@@ -268,7 +268,7 @@
     acreate = create
 
     def _post_create(self, path, data, acl, flags):
-        if flags & zookeeper.EPHEMERAL:
+        if (flags & zookeeper.EPHEMERAL) and not (flags & zookeeper.SEQUENCE):
             self.ephemeral[path] = dict(data=data, acl=acl, flags=flags)
 
     def delete(self, path, version=-1, completion=None):

Modified: zc.zk/trunk/src/zc/zk/ephemeral_node_recovery_on_session_reestablishment.test
===================================================================
--- zc.zk/trunk/src/zc/zk/ephemeral_node_recovery_on_session_reestablishment.test	2012-05-02 16:32:32 UTC (rev 125621)
+++ zc.zk/trunk/src/zc/zk/ephemeral_node_recovery_on_session_reestablishment.test	2012-05-02 17:24:12 UTC (rev 125622)
@@ -5,21 +5,40 @@
 
     >>> import zc.zk, zookeeper
     >>> zk = zc.zk.ZooKeeper('zookeeper.example.com:2181')
+
+Create some ephemeral nodes, which should be reestablished on session
+reestablishment:
+
     >>> zk.register_server('/fooservice/providers', 'test')
+    >>> zk.create('/fooservice/providers/test2', '', zc.zk.OPEN_ACL_UNSAFE,
+    ...           zookeeper.EPHEMERAL)
+    '/fooservice/providers/test2'
+
+Create an ephemeral sequence node, which should *not* be restored:
+
+    >>> zk.create('/fooservice/providers/test-', '', zc.zk.OPEN_ACL_UNSAFE,
+    ...           zookeeper.EPHEMERAL | zookeeper.SEQUENCE)
+    '/fooservice/providers/test-0000000001'
+
+So, we have some ephemeral nodes before loosing the session:
+
     >>> zk.get_children('/fooservice/providers')
-    ['test']
+    ['test', 'test2', 'test-0000000001']
 
     >>> ZooKeeper.sessions[zk.handle].disconnect()
     >>> ZooKeeper.sessions[zk.handle].expire()
 
+Now, after creating the new session, we have the non-sequence ephemeral nodes:
+
     >>> zk.get_children('/fooservice/providers')
-    ['test']
+    ['test', 'test2']
 
 Now, some variations.
 
 If the node is deleted, we don't recreate it:
 
     >>> _ = zk.delete('/fooservice/providers/test')
+    >>> _ = zk.delete('/fooservice/providers/test2')
     >>> ZooKeeper.sessions[zk.handle].disconnect()
     >>> ZooKeeper.sessions[zk.handle].expire()
     >>> zk.get_children('/fooservice/providers')

Modified: zc.zk/trunk/src/zc/zk/testing.py
===================================================================
--- zc.zk/trunk/src/zc/zk/testing.py	2012-05-02 16:32:32 UTC (rev 125621)
+++ zc.zk/trunk/src/zc/zk/testing.py	2012-05-02 17:24:12 UTC (rev 125622)
@@ -275,6 +275,7 @@
         self.sessions = {}
         self.lock = threading.RLock()
         self.failed = {}
+        self.sequence_number = 0
 
     def init(self, addr, watch=None, session_timeout=4000):
         with self.lock:
@@ -381,6 +382,10 @@
         with self.lock:
             self._check_handle(handle)
             base, name = path.rsplit('/', 1)
+            if flags & zookeeper.SEQUENCE:
+                self.sequence_number += 1
+                name += "%.10d" % self.sequence_number
+                path = base + '/' + name
             if base.endswith('/'):
                 raise zookeeper.BadArgumentsException('bad arguments')
             node = self._traverse(base)



More information about the checkins mailing list