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

Fix caching behavior for relations push rules. #12859

Merged
merged 2 commits into from
May 25, 2022
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/12859.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Experimental support for [MSC3772](https://github.com/matrix-org/matrix-spec-proposals/pull/3772): Push rule for mutually related events.
5 changes: 3 additions & 2 deletions synapse/storage/databases/main/relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# limitations under the License.

import logging
from collections import defaultdict
from typing import (
Collection,
Dict,
Expand Down Expand Up @@ -810,7 +809,9 @@ def _get_event_relations(
txn: LoggingTransaction,
) -> Dict[str, Set[Tuple[str, str]]]:
txn.execute(sql, [event_id] + rel_type_args)
result = defaultdict(set)
result: Dict[str, Set[Tuple[str, str]]] = {
rel_type: set() for rel_type in relation_types
}
for rel_type, sender, type in txn.fetchall():
result[rel_type].add((sender, type))
return result
Expand Down
15 changes: 8 additions & 7 deletions synapse/util/caches/descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -595,13 +595,14 @@ def cached(
def cachedList(
*, cached_method_name: str, list_name: str, num_args: Optional[int] = None
) -> Callable[[F], _CachedFunction[F]]:
"""Creates a descriptor that wraps a function in a `CacheListDescriptor`.
"""Creates a descriptor that wraps a function in a `DeferredCacheListDescriptor`.

Used to do batch lookups for an already created cache. A single argument
Used to do batch lookups for an already created cache. One of the arguments
is specified as a list that is iterated through to lookup keys in the
original cache. A new tuple consisting of the (deduplicated) keys that weren't in
the cache gets passed to the original function, the result of which is stored in the
cache.
the cache gets passed to the original function, which is expected to results
in a map of key to value for each passed value. THe new results are stored in the
original cache. Note that any missing values are cached as None.

Args:
cached_method_name: The name of the single-item lookup method.
Expand All @@ -614,11 +615,11 @@ def cachedList(
Example:

class Example:
@cached(num_args=2)
def do_something(self, first_arg):
@cached()
def do_something(self, first_arg, second_arg):
...

@cachedList(do_something.cache, list_name="second_args", num_args=2)
@cachedList(cached_method_name="do_something", list_name="second_args")
def batch_do_something(self, first_arg, second_args):
...
"""
Expand Down