Backfill in the background if we're doing it "just because" (#15710)
Fix https://github.com/matrix-org/synapse/issues/15702
2 files changed, 15 insertions, 4 deletions
diff --git a/changelog.d/15710.feature b/changelog.d/15710.feature
new file mode 100644
index 0000000000..fe77a2fef6
--- /dev/null
+++ b/changelog.d/15710.feature
@@ -0,0 +1 @@
+Speed up `/messages` by backfilling in the background when there are no backward extremities where we are directly paginating.
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 57d6b70cff..b7b5e21020 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -320,14 +320,21 @@ class FederationHandler:
str(len(sorted_backfill_points)),
)
- # If we have no backfill points lower than the `current_depth` then
- # either we can a) bail or b) still attempt to backfill. We opt to try
- # backfilling anyway just in case we do get relevant events.
+ # If we have no backfill points lower than the `current_depth` then either we
+ # can a) bail or b) still attempt to backfill. We opt to try backfilling anyway
+ # just in case we do get relevant events. This is good for eventual consistency
+ # sake but we don't need to block the client for something that is just as
+ # likely not to return anything relevant so we backfill in the background. The
+ # only way, this could return something relevant is if we discover a new branch
+ # of history that extends all the way back to where we are currently paginating
+ # and it's within the 100 events that are returned from `/backfill`.
if not sorted_backfill_points and current_depth != MAX_DEPTH:
logger.debug(
"_maybe_backfill_inner: all backfill points are *after* current depth. Trying again with later backfill points."
)
- return await self._maybe_backfill_inner(
+ run_as_background_process(
+ "_maybe_backfill_inner_anyway_with_max_depth",
+ self._maybe_backfill_inner,
room_id=room_id,
# We use `MAX_DEPTH` so that we find all backfill points next
# time (all events are below the `MAX_DEPTH`)
@@ -338,6 +345,9 @@ class FederationHandler:
# overall otherwise the smaller one will throw off the results.
processing_start_time=None,
)
+ # We return `False` because we're backfilling in the background and there is
+ # no new events immediately for the caller to know about yet.
+ return False
# Even after recursing with `MAX_DEPTH`, we didn't find any
# backward extremities to backfill from.
|