diff options
author | Erik Johnston <erik@matrix.org> | 2016-10-24 13:35:51 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2016-10-24 13:35:51 +0100 |
commit | d04e2ff3a43cca3f7d393a4770f022c7bf1a372c (patch) | |
tree | 272dbeb66fc94a830c874945522cb188d42403e1 /synapse/streams | |
parent | Merge pull request #1177 from matrix-org/paul/standard-metric-names (diff) | |
download | synapse-d04e2ff3a43cca3f7d393a4770f022c7bf1a372c.tar.xz |
Fix incredubly slow back pagination query
If a client didn't specify a from token when paginating backwards synapse would attempt to query the (global) maximum topological token. This a) doesn't make much sense since they're room specific and b) there are no indices that lets postgres do this efficiently.
Diffstat (limited to 'synapse/streams')
-rw-r--r-- | synapse/streams/events.py | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/synapse/streams/events.py b/synapse/streams/events.py index 6bf21d6f5e..4018dbde56 100644 --- a/synapse/streams/events.py +++ b/synapse/streams/events.py @@ -41,13 +41,39 @@ class EventSources(object): self.store = hs.get_datastore() @defer.inlineCallbacks - def get_current_token(self, direction='f'): + def get_current_token(self): push_rules_key, _ = self.store.get_push_rules_stream_token() to_device_key = self.store.get_to_device_stream_token() token = StreamToken( room_key=( - yield self.sources["room"].get_current_key(direction) + yield self.sources["room"].get_current_key() + ), + presence_key=( + yield self.sources["presence"].get_current_key() + ), + typing_key=( + yield self.sources["typing"].get_current_key() + ), + receipt_key=( + yield self.sources["receipt"].get_current_key() + ), + account_data_key=( + yield self.sources["account_data"].get_current_key() + ), + push_rules_key=push_rules_key, + to_device_key=to_device_key, + ) + defer.returnValue(token) + + @defer.inlineCallbacks + def get_current_token_for_room(self, room_id): + push_rules_key, _ = self.store.get_push_rules_stream_token() + to_device_key = self.store.get_to_device_stream_token() + + token = StreamToken( + room_key=( + yield self.sources["room"].get_current_key() ), presence_key=( yield self.sources["presence"].get_current_key() |