This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Database schema updates for faster join support
- Loading branch information
Showing
2 changed files
with
113 additions
and
0 deletions.
There are no files selected for viewing
41 changes: 41 additions & 0 deletions
41
synapse/storage/schema/main/delta/68/04partial_state_rooms.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* 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. | ||
*/ | ||
|
||
-- rooms which we have done a partial-state-style join to | ||
CREATE TABLE IF NOT EXISTS partial_state_rooms ( | ||
room_id TEXT PRIMARY KEY, | ||
FOREIGN KEY(room_id) REFERENCES rooms(room_id) | ||
); | ||
|
||
-- a list of remote servers we believe are in the room | ||
CREATE TABLE IF NOT EXISTS partial_state_rooms_servers ( | ||
room_id TEXT NOT NULL REFERENCES partial_state_rooms(room_id), | ||
server_name TEXT NOT NULL, | ||
UNIQUE(room_id, server_name) | ||
); | ||
|
||
-- a list of events with partial state. We can't store this in the `events` table | ||
-- itself, because `events` is meant to be append-only. | ||
CREATE TABLE IF NOT EXISTS partial_state_events ( | ||
-- the room_id is denormalised for efficient indexing (the canonical source is `events`) | ||
room_id TEXT NOT NULL REFERENCES partial_state_rooms(room_id), | ||
event_id TEXT NOT NULL REFERENCES events(event_id), | ||
UNIQUE(event_id) | ||
); | ||
|
||
CREATE INDEX IF NOT EXISTS partial_state_events_room_id_idx | ||
ON partial_state_events (room_id); | ||
|
||
|
72 changes: 72 additions & 0 deletions
72
synapse/storage/schema/main/delta/68/05lazy_joining_rooms_triggers.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
# 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. | ||
|
||
|
||
""" | ||
This migration adds triggers to the partial_state_events tables to enforce uniqueness | ||
Triggers cannot be expressed in .sql files, so we have to use a separate file. | ||
""" | ||
from synapse.storage.engines import BaseDatabaseEngine, PostgresEngine, Sqlite3Engine | ||
from synapse.storage.types import Cursor | ||
|
||
|
||
def run_create(cur: Cursor, database_engine: BaseDatabaseEngine, *args, **kwargs): | ||
# complain if the room_id in partial_state_events doesn't match | ||
# that in `events`. We already have a fk constraint which ensures that the event | ||
# exists in `events`, so all we have to do is raise if there is a row with a | ||
# matching stream_ordering but not a matching room_id. | ||
if isinstance(database_engine, Sqlite3Engine): | ||
cur.execute( | ||
""" | ||
CREATE TRIGGER IF NOT EXISTS partial_state_events_bad_room_id | ||
BEFORE INSERT ON partial_state_events | ||
FOR EACH ROW | ||
BEGIN | ||
SELECT RAISE(ABORT, 'Incorrect room_id in partial_state_events') | ||
WHERE EXISTS ( | ||
SELECT 1 FROM events | ||
WHERE events.event_id = NEW.event_id | ||
AND events.room_id != NEW.room_id | ||
); | ||
END; | ||
""" | ||
) | ||
elif isinstance(database_engine, PostgresEngine): | ||
cur.execute( | ||
""" | ||
CREATE OR REPLACE FUNCTION check_partial_state_events() RETURNS trigger AS $BODY$ | ||
BEGIN | ||
IF EXISTS ( | ||
SELECT 1 FROM events | ||
WHERE events.event_id = NEW.event_id | ||
AND events.room_id != NEW.room_id | ||
) THEN | ||
RAISE EXCEPTION 'Incorrect room_id in partial_state_events'; | ||
END IF; | ||
RETURN NEW; | ||
END; | ||
$BODY$ LANGUAGE plpgsql; | ||
""" | ||
) | ||
|
||
cur.execute( | ||
""" | ||
CREATE TRIGGER check_partial_state_events BEFORE INSERT OR UPDATE ON partial_state_events | ||
FOR EACH ROW | ||
EXECUTE PROCEDURE check_partial_state_events() | ||
""" | ||
) | ||
else: | ||
raise NotImplementedError("Unknown database engine") |