summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy McCurdy <andy@andymccurdy.com>2014-06-05 19:43:34 -0400
committerAndy McCurdy <andy@andymccurdy.com>2014-06-05 19:43:34 -0400
commitd6fc144c8db08d087b67c919a49fdc1f87bb3cb5 (patch)
treed83325f032431b04392252cc932923b94e143418
parente7589d76a20b577bbc65fbfcdb270435b24af444 (diff)
parent643d76d9af708f3dc5718be16b72f8a911e26d4f (diff)
downloadredis-py-d6fc144c8db08d087b67c919a49fdc1f87bb3cb5.tar.gz
Merge pull request #489 from dystedium/fixlock2
Lock.release(): reorder code to avoid token overwrite
-rw-r--r--redis/lock.py16
1 files changed, 7 insertions, 9 deletions
diff --git a/redis/lock.py b/redis/lock.py
index 8008d22..e6070c4 100644
--- a/redis/lock.py
+++ b/redis/lock.py
@@ -100,18 +100,16 @@ class Lock(object):
"Releases the already acquired lock"
if self.token is None:
raise LockError("Cannot release an unlocked lock")
- try:
- self.do_release()
- finally:
- self.token = None
+ expected_token = self.token
+ self.token = None
+ self.do_release(expected_token)
- def do_release(self):
+ def do_release(self, expected_token):
name = self.name
- token = self.token
def execute_release(pipe):
lock_value = pipe.get(name)
- if lock_value != token:
+ if lock_value != expected_token:
raise LockError("Cannot release a lock that's no longer owned")
pipe.delete(name)
@@ -229,9 +227,9 @@ class LuaLock(Lock):
args=[token, timeout],
client=self.redis))
- def do_release(self):
+ def do_release(self, expected_token):
if not bool(self.lua_release(keys=[self.name],
- args=[self.token],
+ args=[expected_token],
client=self.redis)):
raise LockError("Cannot release a lock that's no longer owned")