diff --git a/changelog.d/7378.misc b/changelog.d/7378.misc
new file mode 100644
index 0000000000000000000000000000000000000000..676f285377f5d1e651c6b0985727493cd571fdff
--- /dev/null
+++ b/changelog.d/7378.misc
@@ -0,0 +1 @@
+Move catchup of replication streams logic to worker.
diff --git a/synapse/replication/tcp/streams/_base.py b/synapse/replication/tcp/streams/_base.py
index 4ae3cffb1e14514effd2a917d7a8cd2ffedf5176..4af1afd119ca0c47736f7892c1dac38d6e65438a 100644
--- a/synapse/replication/tcp/streams/_base.py
+++ b/synapse/replication/tcp/streams/_base.py
@@ -176,10 +176,9 @@ def db_query_to_update_function(
         rows = await query_function(from_token, upto_token, limit)
         updates = [(row[0], row[1:]) for row in rows]
         limited = False
-        if len(updates) == limit:
+        if len(updates) >= limit:
             upto_token = updates[-1][0]
             limited = True
-        assert len(updates) <= limit
 
         return updates, upto_token, limited