summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Eastwood <erice@element.io>2023-06-09 15:39:49 -0500
committerGitHub <noreply@github.com>2023-06-09 15:39:49 -0500
commitfcc3ca37e1b404981d9a0d6f2708e14407775b97 (patch)
tree1468245b6ce6111f64f89bed55d779f05ceccded
parentSpeed up typechecking CI (#15752) (diff)
downloadsynapse-fcc3ca37e1b404981d9a0d6f2708e14407775b97.tar.xz
Backfill in the background if we're doing it "just because" (#15710)
Fix https://github.com/matrix-org/synapse/issues/15702
-rw-r--r--changelog.d/15710.feature1
-rw-r--r--synapse/handlers/federation.py18
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.