diff options
author | Eric Eastwood <erice@element.io> | 2023-05-24 23:22:24 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-24 23:22:24 -0500 |
commit | 77156a4bc1f87e98754e3f7f86e52a84a4253a10 (patch) | |
tree | cb1c5f894d6a34b92e6bc2404b0b28f654e6ed8f /synapse/util | |
parent | Add requesting user id parameter to key claim methods in `TransportLayerClien... (diff) | |
download | synapse-77156a4bc1f87e98754e3f7f86e52a84a4253a10.tar.xz |
Process previously failed backfill events in the background (#15585)
Process previously failed backfill events in the background because they are bound to fail again and we don't need to waste time holding up the request for something that is bound to fail again. Fix https://github.com/matrix-org/synapse/issues/13623 Follow-up to https://github.com/matrix-org/synapse/issues/13621 and https://github.com/matrix-org/synapse/issues/13622 Part of making `/messages` faster: https://github.com/matrix-org/synapse/issues/13356
Diffstat (limited to 'synapse/util')
-rw-r--r-- | synapse/util/iterutils.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/synapse/util/iterutils.py b/synapse/util/iterutils.py index 4938ddf703..a0efb96d3b 100644 --- a/synapse/util/iterutils.py +++ b/synapse/util/iterutils.py @@ -15,11 +15,13 @@ import heapq from itertools import islice from typing import ( + Callable, Collection, Dict, Generator, Iterable, Iterator, + List, Mapping, Set, Sized, @@ -71,6 +73,31 @@ def chunk_seq(iseq: S, maxlen: int) -> Iterator[S]: return (iseq[i : i + maxlen] for i in range(0, len(iseq), maxlen)) +def partition( + iterable: Iterable[T], predicate: Callable[[T], bool] +) -> Tuple[List[T], List[T]]: + """ + Separate a given iterable into two lists based on the result of a predicate function. + + Args: + iterable: the iterable to partition (separate) + predicate: a function that takes an item from the iterable and returns a boolean + + Returns: + A tuple of two lists, the first containing all items for which the predicate + returned True, the second containing all items for which the predicate returned + False + """ + true_results = [] + false_results = [] + for item in iterable: + if predicate(item): + true_results.append(item) + else: + false_results.append(item) + return true_results, false_results + + def sorted_topologically( nodes: Iterable[T], graph: Mapping[T, Collection[T]], |