Skip to content

Commit

Permalink
Fix to empty a socket after sending releaselock.
Browse files Browse the repository at this point in the history
With this, the subsequent part won't receive two messages at a time.
Also changed to use fileobject to read line from socket.
  • Loading branch information
Satoshi Tanimoto committed Jun 5, 2012
1 parent aea133b commit 8beac65
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions ddlockclient/__init__.py
Expand Up @@ -39,7 +39,9 @@ def fail(msg):
sock = self.client.get_sock(addr)
if not sock:
continue
sock.send("releaselock lock=%s\r\n" % eurl(self.name))
sock['socket'].send("releaselock lock=%s\r\n" \
% eurl(self.name))
sock['file'].readline()
raise DDLockError(msg)

for server in servers:
Expand All @@ -52,8 +54,8 @@ def fail(msg):
if not sock:
continue

sock.send("trylock lock=%s\r\n" % eurl(self.name))
data = sock.recv(1024)
sock['socket'].send("trylock lock=%s\r\n" % eurl(self.name))
data = sock['file'].readline()

if not re.search(r'^ok\b', data, re.I):
fail("%s: '%s' %s\n" % (server, self.name, repr(data)))
Expand All @@ -73,13 +75,14 @@ def release(self):
continue
data = None
try:
sock.send("releaselock lock=%s\r\n" % eurl(self.name))
data = sock.recv(1024)
sock['socket'].send("releaselock lock=%s\r\n" \
% eurl(self.name))
data = sock['file'].readline()
except:
pass
if data and not re.search(r'^ok\b', data, re.I):
raise DDLockError("releaselock (%s): %s" % (sock.getpeername(),
repr(data)))
raise DDLockError("releaselock (%s): %s" \
% (sock['socket'].getpeername(), repr(data)))
count += 1

return count
Expand Down Expand Up @@ -117,14 +120,15 @@ def get_sock(self, addr):
port = int(host_port[1]) if len(host_port) > 1 else DEFAULT_PORT

sock = self.sockcache.get("%s:%s" % (host, port))
if sock and sock.getpeername():
if sock and sock['socket'].getpeername():
return sock

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(1)
sock.connect((host, port))

sock = {'socket': sock, 'file': sock.makefile()}
self.sockcache[addr] = sock
return sock

Expand Down

0 comments on commit 8beac65

Please sign in to comment.