From b8b56d04d14f56686e73ba3e1913ae09b501d48f Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 20 Jan 2022 21:46:01 +0000 Subject: [PATCH 1/2] Add `state_key` and `rejection_reason` to `events` ... and start populating them for new events --- changelog.d/11792.misc | 1 + synapse/storage/databases/main/events.py | 7 ++++- synapse/storage/schema/__init__.py | 4 ++- .../schema/main/delta/67/01event_columns.sql | 26 +++++++++++++++++++ tests/storage/test_event_chain.py | 5 +++- 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 changelog.d/11792.misc create mode 100644 synapse/storage/schema/main/delta/67/01event_columns.sql diff --git a/changelog.d/11792.misc b/changelog.d/11792.misc new file mode 100644 index 000000000000..6aa1cd61c354 --- /dev/null +++ b/changelog.d/11792.misc @@ -0,0 +1 @@ +Preparation for database schema simplifications: add `state_key` and `rejection_reason` columns to `events` table. diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py index 1ae1ebe10879..b7554154ac19 100644 --- a/synapse/storage/databases/main/events.py +++ b/synapse/storage/databases/main/events.py @@ -1389,6 +1389,8 @@ def event_dict(event): "received_ts", "sender", "contains_url", + "state_key", + "rejection_reason", ), values=( ( @@ -1405,8 +1407,10 @@ def event_dict(event): self._clock.time_msec(), event.sender, "url" in event.content and isinstance(event.content["url"], str), + event.get_state_key(), + context.rejected or None, ) - for event, _ in events_and_contexts + for event, context in events_and_contexts ), ) @@ -1456,6 +1460,7 @@ def _store_rejected_events_txn(self, txn, events_and_contexts): for event, context in events_and_contexts: if context.rejected: # Insert the event_id into the rejections table + # (events.rejection_reason has already been done) self._store_rejections_txn(txn, event.event_id, context.rejected) to_remove.add(event) diff --git a/synapse/storage/schema/__init__.py b/synapse/storage/schema/__init__.py index 2a3d47185ae5..955903af857f 100644 --- a/synapse/storage/schema/__init__.py +++ b/synapse/storage/schema/__init__.py @@ -57,7 +57,9 @@ SCHEMA_COMPAT_VERSION = ( - 61 # 61: Remove unused tables `user_stats_historical` and `room_stats_historical` + # the schema no longer support synapse versions with SCHEMA_VERSION < 66, because + # there are multiple state_key columns. + 66 ) """Limit on how far the synapse codebase can be rolled back without breaking db compat diff --git a/synapse/storage/schema/main/delta/67/01event_columns.sql b/synapse/storage/schema/main/delta/67/01event_columns.sql new file mode 100644 index 000000000000..7c072f972ef7 --- /dev/null +++ b/synapse/storage/schema/main/delta/67/01event_columns.sql @@ -0,0 +1,26 @@ +/* Copyright 2022 The Matrix.org Foundation C.I.C + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- Add new colums to the `events` table which will (one day) make the `state_events` +-- and `rejections` tables redundant. + +ALTER TABLE events + -- if this event is a state event, its state key + ADD COLUMN state_key TEXT DEFAULT NULL; + + +ALTER TABLE events + -- if this event was rejected, the reason it was rejected. + ADD COLUMN rejection_reason TEXT DEFAULT NULL; diff --git a/tests/storage/test_event_chain.py b/tests/storage/test_event_chain.py index 7b7f6c349e1c..e3273a93f9a2 100644 --- a/tests/storage/test_event_chain.py +++ b/tests/storage/test_event_chain.py @@ -19,6 +19,7 @@ from synapse.api.constants import EventTypes from synapse.api.room_versions import RoomVersions from synapse.events import EventBase +from synapse.events.snapshot import EventContext from synapse.rest import admin from synapse.rest.client import login, room from synapse.storage.databases.main.events import _LinkMap @@ -391,7 +392,9 @@ def persist( def _persist(txn): # We need to persist the events to the events and state_events # tables. - persist_events_store._store_event_txn(txn, [(e, {}) for e in events]) + persist_events_store._store_event_txn( + txn, [(e, EventContext()) for e in events] + ) # Actually call the function that calculates the auth chain stuff. persist_events_store._persist_event_auth_chain_txn(txn, events) From 7fc8e25f24537db7ca28ff6089aeb96701c3928f Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Fri, 21 Jan 2022 11:29:46 +0000 Subject: [PATCH 2/2] Address review comments --- synapse/storage/schema/__init__.py | 2 ++ .../storage/schema/main/delta/{67 => 68}/01event_columns.sql | 0 2 files changed, 2 insertions(+) rename synapse/storage/schema/main/delta/{67 => 68}/01event_columns.sql (100%) diff --git a/synapse/storage/schema/__init__.py b/synapse/storage/schema/__init__.py index 97014c223b8e..7b21c1b96db9 100644 --- a/synapse/storage/schema/__init__.py +++ b/synapse/storage/schema/__init__.py @@ -56,6 +56,8 @@ Changes in SCHEMA_VERSION = 68: - event_reference_hashes is no longer read. + - `events` has `state_key` and `rejection_reason` columns, which are populated for + new events. """ diff --git a/synapse/storage/schema/main/delta/67/01event_columns.sql b/synapse/storage/schema/main/delta/68/01event_columns.sql similarity index 100% rename from synapse/storage/schema/main/delta/67/01event_columns.sql rename to synapse/storage/schema/main/delta/68/01event_columns.sql