[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