aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-07-17 12:23:31 -0700
committerGravatar MarkKoz <[email protected]>2020-07-31 22:58:06 -0700
commit6e2d3dfaacf03435c18e843fb366758f49e09181 (patch)
tree58794b57d339edf5b4944faae098236d52f533a6
parentDecorators: fix lock creation (diff)
Decorators: add logging for mutually_exclusive
-rw-r--r--bot/decorators.py16
1 files changed, 12 insertions, 4 deletions
diff --git a/bot/decorators.py b/bot/decorators.py
index abf7474ef..91104fc6c 100644
--- a/bot/decorators.py
+++ b/bot/decorators.py
@@ -112,26 +112,34 @@ def mutually_exclusive(namespace: t.Hashable, resource_id: ResourceId) -> t.Call
function's args and kwargs.
"""
def decorator(func: t.Callable) -> t.Callable:
+ name = func.__name__
+
@wraps(func)
async def wrapper(*args, **kwargs) -> t.Any:
+ log.trace(f"{name}: mutually exclusive decorator called")
+
if callable(resource_id):
- # Call to get the ID if a callable was given.
+ log.trace(f"{name}: calling the given callable to get the resource ID")
id_ = resource_id(*args, **kwargs)
if inspect.isawaitable(id_):
- # Await to get the ID if an awaitable was given.
+ log.trace(f"{name}: awaiting to get resource ID")
id_ = await id_
else:
id_ = resource_id
- # Get the lock for the ID. Create a Lock if one doesn't exist yet.
+ log.trace(f"{name}: getting lock for resource {id_!r} under namespace {namespace!r}")
+
+ # Get the lock for the ID. Create a lock if one doesn't exist yet.
locks = __lock_dicts[namespace]
lock = locks.setdefault(id_, asyncio.Lock())
if not lock.locked():
- # Resource is free; acquire it.
+ log.debug(f"{name}: resource {namespace!r}:{id_!r} is free; acquiring it...")
async with lock:
return await func(*args, **kwargs)
+ else:
+ log.info(f"{name}: aborted because resource {namespace!r}:{id_!r} is locked")
return wrapper
return decorator