Skip to content

Commit aa324b3

Browse files
author
Sergio García Prado
committed
ISSUE #367
* Improve `DatabaseClient`'s lock behavior.
1 parent cc9a55d commit aa324b3

File tree

2 files changed

+30
-16
lines changed
  • packages/core/minos-microservice-common

2 files changed

+30
-16
lines changed

packages/core/minos-microservice-common/minos/common/database/clients/aiopg.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -151,27 +151,33 @@ async def _create_cursor(self, *args, lock: Optional[Hashable] = None, **kwargs)
151151
self._cursor = await self._connection.cursor(*args, **kwargs)
152152

153153
if lock is not None:
154-
if self._lock is not None:
155-
if self._lock.key != lock:
156-
raise ValueError(f"Only one lock per instance is supported. Currently locked with {self._lock!r}")
157-
return
158-
from ..locks import (
159-
DatabaseLock,
160-
)
161-
162-
self._lock = DatabaseLock(self, lock, *args, **kwargs)
163-
await self._lock.acquire()
154+
await self._create_lock(lock)
164155

165156
async def _destroy_cursor(self, **kwargs):
166-
if self._lock is not None:
167-
await self._lock.release()
168-
self._lock = None
169-
157+
await self._destroy_lock()
170158
if self._cursor is not None:
171159
if not self._cursor.closed:
172160
self._cursor.close()
173161
self._cursor = None
174162

163+
async def _create_lock(self, lock: Hashable, *args, **kwargs):
164+
if self._lock is not None and self._lock.key == lock:
165+
return
166+
await self._destroy_lock()
167+
168+
from ..locks import (
169+
DatabaseLock,
170+
)
171+
172+
self._lock = DatabaseLock(self, lock, *args, **kwargs)
173+
await self._lock.acquire()
174+
175+
async def _destroy_lock(self):
176+
if self._lock is not None:
177+
logger.debug(f"Destroying {self.lock!r}...")
178+
await self._lock.release()
179+
self._lock = None
180+
175181
@property
176182
def lock(self) -> Optional[DatabaseLock]:
177183
"""Get the lock.

packages/core/minos-microservice-common/tests/test_common/test_database/test_clients/test_aiopg.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,18 @@ async def test_execute_with_lock(self):
145145

146146
async def test_execute_with_lock_multiple(self):
147147
async with AiopgDatabaseClient.from_config(self.config) as client:
148+
self.assertIsNone(client.lock)
149+
148150
await client.execute(self.sql, lock="foo")
151+
foo_lock = client.lock
152+
self.assertIsInstance(foo_lock, DatabaseLock)
153+
149154
await client.execute(self.sql, lock="foo")
150-
with self.assertRaises(ValueError):
151-
await client.execute(self.sql, lock="bar")
155+
self.assertEqual(foo_lock, client.lock)
156+
157+
await client.execute(self.sql, lock="bar")
158+
self.assertNotEqual(foo_lock, client.lock)
159+
self.assertIsInstance(client.lock, DatabaseLock)
152160

153161
async def test_execute_raises_integrity(self):
154162
async with AiopgDatabaseClient.from_config(self.config) as client:

0 commit comments

Comments
 (0)