Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Remove the unused inlineCallbacks code-paths in the caching code #8119

Merged
merged 4 commits into from
Aug 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/8119.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Convert various parts of the codebase to async/await.
54 changes: 8 additions & 46 deletions synapse/util/caches/descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,16 +285,9 @@ def invalidate_all(self):


class _CacheDescriptorBase(object):
def __init__(
self, orig: _CachedFunction, num_args, inlineCallbacks, cache_context=False
):
def __init__(self, orig: _CachedFunction, num_args, cache_context=False):
self.orig = orig

if inlineCallbacks:
self.function_to_call = defer.inlineCallbacks(orig)
else:
self.function_to_call = orig

arg_spec = inspect.getfullargspec(orig)
all_args = arg_spec.args

Expand Down Expand Up @@ -364,7 +357,7 @@ class CacheDescriptor(_CacheDescriptorBase):
invalidated) by adding a special "cache_context" argument to the function
and passing that as a kwarg to all caches called. For example::

@cachedInlineCallbacks(cache_context=True)
@cached(cache_context=True)
def foo(self, key, cache_context):
r1 = yield self.bar1(key, on_invalidate=cache_context.invalidate)
r2 = yield self.bar2(key, on_invalidate=cache_context.invalidate)
Expand All @@ -382,17 +375,11 @@ def __init__(
max_entries=1000,
num_args=None,
tree=False,
inlineCallbacks=False,
cache_context=False,
iterable=False,
):

super(CacheDescriptor, self).__init__(
orig,
num_args=num_args,
inlineCallbacks=inlineCallbacks,
cache_context=cache_context,
)
super().__init__(orig, num_args=num_args, cache_context=cache_context)

self.max_entries = max_entries
self.tree = tree
Expand Down Expand Up @@ -465,9 +452,7 @@ def _wrapped(*args, **kwargs):
observer = defer.succeed(cached_result_d)

except KeyError:
ret = defer.maybeDeferred(
preserve_fn(self.function_to_call), obj, *args, **kwargs
)
ret = defer.maybeDeferred(preserve_fn(self.orig), obj, *args, **kwargs)

def onErr(f):
cache.invalidate(cache_key)
Expand Down Expand Up @@ -510,9 +495,7 @@ class CacheListDescriptor(_CacheDescriptorBase):
of results.
"""

def __init__(
self, orig, cached_method_name, list_name, num_args=None, inlineCallbacks=False
):
def __init__(self, orig, cached_method_name, list_name, num_args=None):
"""
Args:
orig (function)
Expand All @@ -521,12 +504,8 @@ def __init__(
num_args (int): number of positional arguments (excluding ``self``,
but including list_name) to use as cache keys. Defaults to all
named args of the function.
inlineCallbacks (bool): Whether orig is a generator that should
be wrapped by defer.inlineCallbacks
"""
super(CacheListDescriptor, self).__init__(
orig, num_args=num_args, inlineCallbacks=inlineCallbacks
)
super().__init__(orig, num_args=num_args)

self.list_name = list_name

Expand Down Expand Up @@ -631,7 +610,7 @@ def errback(f):

cached_defers.append(
defer.maybeDeferred(
preserve_fn(self.function_to_call), **args_to_call
preserve_fn(self.orig), **args_to_call
).addCallbacks(complete_all, errback)
)

Expand Down Expand Up @@ -695,21 +674,7 @@ def cached(
)


def cachedInlineCallbacks(
max_entries=1000, num_args=None, tree=False, cache_context=False, iterable=False
):
return lambda orig: CacheDescriptor(
orig,
max_entries=max_entries,
num_args=num_args,
tree=tree,
inlineCallbacks=True,
cache_context=cache_context,
iterable=iterable,
)


def cachedList(cached_method_name, list_name, num_args=None, inlineCallbacks=False):
def cachedList(cached_method_name, list_name, num_args=None):
"""Creates a descriptor that wraps a function in a `CacheListDescriptor`.

Used to do batch lookups for an already created cache. A single argument
Expand All @@ -725,8 +690,6 @@ def cachedList(cached_method_name, list_name, num_args=None, inlineCallbacks=Fal
do batch lookups in the cache.
num_args (int): Number of arguments to use as the key in the cache
(including list_name). Defaults to all named parameters.
inlineCallbacks (bool): Should the function be wrapped in an
`defer.inlineCallbacks`?

Example:

Expand All @@ -744,5 +707,4 @@ def batch_do_something(self, first_arg, second_args):
cached_method_name=cached_method_name,
list_name=list_name,
num_args=num_args,
inlineCallbacks=inlineCallbacks,
)
12 changes: 6 additions & 6 deletions tests/util/caches/test_descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,11 +366,11 @@ def __init__(self):
def fn(self, arg1, arg2):
pass

@descriptors.cachedList("fn", "args1", inlineCallbacks=True)
def list_fn(self, args1, arg2):
@descriptors.cachedList("fn", "args1")
async def list_fn(self, args1, arg2):
assert current_context().request == "c1"
# we want this to behave like an asynchronous function
yield run_on_reactor()
await run_on_reactor()
assert current_context().request == "c1"
return self.mock(args1, arg2)

Expand Down Expand Up @@ -416,10 +416,10 @@ def __init__(self):
def fn(self, arg1, arg2):
pass

@descriptors.cachedList("fn", "args1", inlineCallbacks=True)
def list_fn(self, args1, arg2):
@descriptors.cachedList("fn", "args1")
async def list_fn(self, args1, arg2):
# we want this to behave like an asynchronous function
yield run_on_reactor()
await run_on_reactor()
return self.mock(args1, arg2)

obj = Cls()
Expand Down