summaryrefslogtreecommitdiff
path: root/tooz/drivers/pgsql.py
diff options
context:
space:
mode:
authorJulien Danjou <julien@danjou.info>2014-10-26 18:30:47 +0100
committerJulien Danjou <julien@danjou.info>2014-11-06 12:16:42 +0100
commit33f5d3f497fa031a9282caa6f59c0ddd5a94d6d0 (patch)
treec0dd696a186fd3bd4f5bbbbf3def5c4acbc5a105 /tooz/drivers/pgsql.py
parent455111284f483c52e9e1875175ece84bca76e583 (diff)
downloadtooz-33f5d3f497fa031a9282caa6f59c0ddd5a94d6d0.tar.gz
Implement non-blocking locks with PostgreSQL
Change-Id: Id0f2f10bf9d284343c19ba395a90aea7b9233124
Diffstat (limited to 'tooz/drivers/pgsql.py')
-rw-r--r--tooz/drivers/pgsql.py26
1 files changed, 20 insertions, 6 deletions
diff --git a/tooz/drivers/pgsql.py b/tooz/drivers/pgsql.py
index 6cd7d6e..d142137 100644
--- a/tooz/drivers/pgsql.py
+++ b/tooz/drivers/pgsql.py
@@ -22,6 +22,7 @@ import six
import tooz
from tooz import coordination
+from tooz.drivers import _retry
from tooz import locking
@@ -39,12 +40,25 @@ class PostgresLock(locking.Lock):
self.key = h.digest()[0:2]
def acquire(self, blocking=True):
- if blocking is not True:
- raise tooz.NotImplemented(
- "This driver does not support non blocking locks")
- with self._conn.cursor() as cur:
- cur.execute("SELECT pg_advisory_lock(%s, %s);", self.key)
- return True
+ if blocking is True:
+ with self._conn.cursor() as cur:
+ cur.execute("SELECT pg_advisory_lock(%s, %s);", self.key)
+ return True
+ elif blocking is False:
+ with self._conn.cursor() as cur:
+ cur.execute("SELECT pg_try_advisory_lock(%s, %s);", self.key)
+ return cur.fetchone()[0]
+ else:
+ def _acquire():
+ with self._conn.cursor() as cur:
+ cur.execute("SELECT pg_try_advisory_lock(%s, %s);",
+ self.key)
+ if cur.fetchone()[0] is True:
+ return True
+ raise _retry.Retry
+ kwargs = _retry.RETRYING_KWARGS.copy()
+ kwargs['stop_max_delay'] = blocking
+ return _retry.Retrying(**kwargs).call(_acquire)
def release(self):
with self._conn.cursor() as cur: