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
Don't table scan events on worker startup #8419
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
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 @@ | ||
Add experimental support for sharding event persister. |
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 |
---|---|---|
|
@@ -273,6 +273,19 @@ def _load_current_ids( | |
|
||
# Load the current positions of all writers for the stream. | ||
if self._writers: | ||
# We delete any stale entries in the positions table. This is | ||
# important if we add back a writer after a long time; we want to | ||
# consider that a "new" writer, rather than using the old stale | ||
# entry here. | ||
sql = """ | ||
DELETE FROM stream_positions | ||
WHERE | ||
stream_name = ? | ||
AND instance_name != ALL(?) | ||
Comment on lines
+281
to
+284
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Confusing,
So this is saying to delete any stream position where the stream name matches our current stream and the instance name is not any of the current writers. |
||
""" | ||
sql = self._db.engine.convert_param_style(sql) | ||
cur.execute(sql, (self._stream_name, self._writers)) | ||
|
||
sql = """ | ||
SELECT instance_name, stream_id FROM stream_positions | ||
WHERE stream_name = ? | ||
|
@@ -453,11 +466,22 @@ def get_current_token_for_writer(self, instance_name: str) -> int: | |
"""Returns the position of the given writer. | ||
""" | ||
|
||
# If we don't have an entry for the given instance name, we assume it's a | ||
# new writer. | ||
# | ||
# For new writers we assume their initial position to be the current | ||
# persisted up to position. This stops Synapse from doing a full table | ||
# scan when a new writer announces itself over replication. | ||
with self._lock: | ||
return self._return_factor * self._current_positions.get(instance_name, 0) | ||
return self._return_factor * self._current_positions.get( | ||
instance_name, self._persisted_upto_position | ||
) | ||
|
||
def get_positions(self) -> Dict[str, int]: | ||
"""Get a copy of the current positon map. | ||
|
||
Note that this won't necessarily include all configured writers if some | ||
writers haven't written anything yet. | ||
""" | ||
|
||
with self._lock: | ||
|
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
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.
Do we still need to the check on line 300
if instance in self._writers
? 😄I don't think it can hurt, especially since the
DELETE
andSELECT
queries are in different transactions?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.
Technically we don't, no. The
SELECT
andDELETE
are in the same transaction.Not sure if its clearer to leave it or remove the check tbh.
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.
🤷 The logic becomes simplified a bit, but you then need to combine the two SQL statements to understand exactly what that dictionary is made up of.