From bf0370162f63136d3eebf8c3a9e6b71b83925bda Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 9 Jul 2025 11:48:06 +0100 Subject: [PATCH] Speed up inserting into stream_positions (#18672) By ensuring we don't do a no-op `UPDATE`, as this causes new tuples to be written in postgres. --- changelog.d/18672.misc | 1 + synapse/storage/util/id_generators.py | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 changelog.d/18672.misc diff --git a/changelog.d/18672.misc b/changelog.d/18672.misc new file mode 100644 index 000000000..8d7be17fb --- /dev/null +++ b/changelog.d/18672.misc @@ -0,0 +1 @@ +Minor speed up of insertion into `stream_positions` table. diff --git a/synapse/storage/util/id_generators.py b/synapse/storage/util/id_generators.py index e8588f33c..fe6b6579e 100644 --- a/synapse/storage/util/id_generators.py +++ b/synapse/storage/util/id_generators.py @@ -794,20 +794,16 @@ class MultiWriterIdGenerator(AbstractStreamIdGenerator): # We upsert the value, ensuring on conflict that we always increase the # value (or decrease if stream goes backwards). - if isinstance(self._db.engine, PostgresEngine): - agg = "GREATEST" if self._positive else "LEAST" - else: - agg = "MAX" if self._positive else "MIN" + cmp = "<" if self._positive else ">" - sql = """ + sql = f""" INSERT INTO stream_positions (stream_name, instance_name, stream_id) VALUES (?, ?, ?) ON CONFLICT (stream_name, instance_name) DO UPDATE SET - stream_id = %(agg)s(stream_positions.stream_id, EXCLUDED.stream_id) - """ % { - "agg": agg, - } + stream_id = EXCLUDED.stream_id + WHERE stream_positions.stream_id {cmp} EXCLUDED.stream_id + """ pos = self.get_current_token_for_writer(self._instance_name) txn.execute(sql, (self._stream_name, self._instance_name, pos))