It turns out kazoo always uses async: http://kazoo.readthedocs.org/en/latest/_modules/kazoo/client.html#KazooClient.get I tried calling "sync(path)", but it didn't help. I believe that is used only to sync data between zookeeper servers anyway (and I am trying it all on a single, local server) J. On 05/13/2014 09:25 PM, Jacek Becla wrote: > Serge at al, > > I am trying to implement code to avoid race conditions in zookeeper. > I figured I'd create an ephemeral node "/LOCKS/<dbName>" and proceed > with sensitive things only after creating such node successfully. > However, I have the impression zookeeper will allow multiple jobs > to create the same node, even in synchronous mode. Here is a test > I'm using (see below), if I run it concurrently (just two instances), > I'm typically seeing a collision (pasted below). > > Can you have a look, think about it, and let's discuss tomorrow. > Thanks! > > > =================================== > > import os > import socket > import time > from random import randint > > > from kazoo.client import KazooClient > from kazoo.exceptions import NodeExistsError, NoNodeError > > def sleepABit(): > v = randint(1,100) / 1000.0 > print "sleep ", v > time.sleep(v) > > > def createIt(zk, k, v): > while True: > try: > print "create ", v > zk.create(k, v, ephemeral=True, makepath=True) > except: > print "create failed" > sleepABit() > finally: > print "create ok" > return > > > k = "/LOCKS/x" > zk = KazooClient(hosts="127.0.0.1:12181") > zk.start() > > for i in range(0,100): > v = str(socket.gethostbyname(socket.gethostname())) + '_' + > str(os.getpid()) + '_' + str(i) > > createIt(zk, k, v) > > sleepABit() > > d, s = zk.get(k) > print "got ", d > > print "delete" > zk.delete(k) > > print "---" > > > ===================== > > create 141.142.225.179_8831_29 > create ok > sleep 0.04 > got 141.142.225.179_8839_16 > delete > Traceback (most recent call last): > File "quickTest.py", line 45, in <module> > zk.delete(k) > File > "/usr/local/home/becla/qserv/1/stack/Linux64/kazoo/1.3.1/lib/python/kazoo-1.3.1-py2.6.egg/kazoo/client.py", > line 1159, in delete > return self.delete_async(path, version).get() > File > "/usr/local/home/becla/qserv/1/stack/Linux64/kazoo/1.3.1/lib/python/kazoo-1.3.1-py2.6.egg/kazoo/handlers/threading.py", > line 107, in get > raise self._exception > kazoo.exceptions.NoNodeError: ((), {}) > > > See? the node has pid 8831 and successfully created the node, > but the other job (pid 8839) managed to create it OK as well > before job with pid 8831 deleted it. > > ######################################################################## > Use REPLY-ALL to reply to list > > To unsubscribe from the QSERV-L list, click the following link: > https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=QSERV-L&A=1 > ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the QSERV-L list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=QSERV-L&A=1