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
Faster remote room joins: stream the un-partial-stating of events over replication. [rei:frrj/streams/unpsr] #14545
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
07c7ddd
Add tables for un-partial-stated events stream
reivilibre 1976530
Add an ID generator for un-partial-stated events stream
reivilibre 4f48193
Add update fetch txn for unPS-event stream
reivilibre 1d31fa1
Add un-partial-stated events stream
reivilibre 6ed5253
Write to the un-partial-stated events stream when the event is un-par…
reivilibre b62e941
Newsfile
reivilibre b541001
Add call to notify_replication
reivilibre File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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 @@ | ||
Faster remote room joins: stream the un-partial-stating of events over replication. |
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
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
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
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
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
34 changes: 34 additions & 0 deletions
34
synapse/storage/schema/main/delta/73/22_un_partial_stated_event_stream.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,34 @@ | ||
/* 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. | ||
*/ | ||
|
||
-- Stream for notifying that an event has become un-partial-stated. | ||
CREATE TABLE un_partial_stated_event_stream( | ||
-- Position in the stream | ||
stream_id BIGINT PRIMARY KEY NOT NULL, | ||
|
||
-- Which instance wrote this entry. | ||
instance_name TEXT NOT NULL, | ||
|
||
-- Which event has been un-partial-stated. | ||
event_id TEXT NOT NULL REFERENCES events(event_id) ON DELETE CASCADE, | ||
|
||
-- true iff the `rejected` status of the event changed when it became | ||
-- un-partial-stated. | ||
rejection_status_changed BOOLEAN NOT NULL | ||
); | ||
|
||
-- We want an index here because of the foreign key constraint: | ||
-- upon deleting an event, the database needs to be able to check here. | ||
CREATE UNIQUE INDEX un_partial_stated_event_stream_room_id ON un_partial_stated_event_stream (event_id); | ||
20 changes: 20 additions & 0 deletions
20
synapse/storage/schema/main/delta/73/23_un_partial_stated_room_stream_seq.sql.postgres
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,20 @@ | ||
/* 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. | ||
*/ | ||
|
||
CREATE SEQUENCE IF NOT EXISTS un_partial_stated_event_stream_sequence; | ||
|
||
SELECT setval('un_partial_stated_event_stream_sequence', ( | ||
SELECT COALESCE(MAX(stream_id), 1) FROM un_partial_stated_event_stream | ||
)); |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With rooms, the same room can be un-partial stated multiple times.
Can events really only be un-partial stated once? I'm not clear on what happens when the last user leaves a room.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess I should be a bit more stringent about researching this (possibly need to 'prove' that we only make an event partial-stated when it's initially persisted(?)), but I can't for the life of me imagine how it makes sense to turn a full-state event into a partial-stated event (that we then intend to make full-state again).
When a user leaves a room, we should keep the events and state around so that the user can access the room in their 'archive' section.
Only when a room is purged (e.g. because all users forgot the room and we do it automatically, or by admin action) should we start removing information we already hold. In this case, events will be removed but then so too will the stream entries for those events.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I have confirmed this: an event can only be made partial-stated when it is created and possibly when it is de-outliered. But note that an event can't be both an outlier and partial-stated, so exactly one of those can be true for the lifetime of an event.
An event is only un-partial-stated upon deletion (at which point we also remove the stream row for it) or after we fetch the full state for it (it can't revert to being an outlier from this state, except by being deleted first and being persisted anew later).