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

Commit

Permalink
Fix caching behavior for relations push rules. (#12859)
Browse files Browse the repository at this point in the history
By always returning all requested values from the function
wrapped by cachedList. Otherwise implicit None values get
added into the cache, which are unexpected.
  • Loading branch information
clokep authored May 25, 2022
1 parent 4cbcd4a commit 759f9c0
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 9 deletions.
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

0 comments on commit 759f9c0

Please sign in to comment.