Fix background update table-scanning `events` (#14374)

When this background update did its last batch, it would try to update all the
events that had been inserted since the bgupdate started, which could cause a
table-scan. Make sure we limit the update correctly.
This commit is contained in:
Richard van der Hoff 2022-11-07 14:28:00 +00:00 committed by GitHub
parent 42f9d414c2
commit 2193513346
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 8 deletions

1
changelog.d/14374.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a background database update, introduced in Synapse 1.64.0, which could cause poor database performance.

View File

@ -1435,16 +1435,16 @@ class EventsBackgroundUpdatesStore(SQLBaseStore):
), ),
) )
endpoint = None
row = txn.fetchone() row = txn.fetchone()
if row: if row:
endpoint = row[0] endpoint = row[0]
else:
# if the query didn't return a row, we must be almost done. We just
# need to go up to the recorded max_stream_ordering.
endpoint = max_stream_ordering_inclusive
where_clause = "stream_ordering > ?" where_clause = "stream_ordering > ? AND stream_ordering <= ?"
args = [min_stream_ordering_exclusive] args = [min_stream_ordering_exclusive, endpoint]
if endpoint:
where_clause += " AND stream_ordering <= ?"
args.append(endpoint)
# now do the updates. # now do the updates.
txn.execute( txn.execute(
@ -1458,13 +1458,13 @@ class EventsBackgroundUpdatesStore(SQLBaseStore):
) )
logger.info( logger.info(
"populated new `events` columns up to %s/%i: updated %i rows", "populated new `events` columns up to %i/%i: updated %i rows",
endpoint, endpoint,
max_stream_ordering_inclusive, max_stream_ordering_inclusive,
txn.rowcount, txn.rowcount,
) )
if endpoint is None: if endpoint >= max_stream_ordering_inclusive:
# we're done # we're done
return True return True