diff options
| author | Julien Danjou <julien@danjou.info> | 2014-10-26 18:30:47 +0100 |
|---|---|---|
| committer | Julien Danjou <julien@danjou.info> | 2014-11-06 12:16:42 +0100 |
| commit | 33f5d3f497fa031a9282caa6f59c0ddd5a94d6d0 (patch) | |
| tree | c0dd696a186fd3bd4f5bbbbf3def5c4acbc5a105 /tooz/drivers/pgsql.py | |
| parent | 455111284f483c52e9e1875175ece84bca76e583 (diff) | |
| download | tooz-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.py | 26 |
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: |
