diff options
author | Erik Johnston <erik@matrix.org> | 2016-04-19 17:22:03 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2016-04-19 17:22:03 +0100 |
commit | 61c7edfd34abdb9eaa7c8d3dd3dbef95b60de5de (patch) | |
tree | a7ab508f38a2006b32702e91ead6105d366e48ba | |
parent | Merge pull request #737 from matrix-org/erikj/spider_ssl_factory (diff) | |
download | synapse-61c7edfd34abdb9eaa7c8d3dd3dbef95b60de5de.tar.xz |
Add cache to _get_state_groups_from_groups
Diffstat (limited to '')
-rw-r--r-- | synapse/storage/state.py | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/synapse/storage/state.py b/synapse/storage/state.py index c5d2a3a6df..5b743db67a 100644 --- a/synapse/storage/state.py +++ b/synapse/storage/state.py @@ -174,6 +174,12 @@ class StateStore(SQLBaseStore): return [r[0] for r in results] return self.runInteraction("get_current_state_for_key", f) + @cached(num_args=2, lru=True, max_entries=1000) + def _get_state_group_from_group(self, group, types): + raise NotImplementedError() + + @cachedList(cached_method_name="_get_state_group_from_group", + list_name="groups", num_args=2, inlineCallbacks=True) def _get_state_groups_from_groups(self, groups, types): """Returns dictionary state_group -> (dict of (type, state_key) -> event id) """ @@ -201,18 +207,23 @@ class StateStore(SQLBaseStore): txn.execute(sql, args) rows = self.cursor_to_dict(txn) - results = {} + results = {group: {} for group in groups} for row in rows: key = (row["type"], row["state_key"]) - results.setdefault(row["state_group"], {})[key] = row["event_id"] + results[row["state_group"]][key] = row["event_id"] return results + results = {} + chunks = [groups[i:i + 100] for i in xrange(0, len(groups), 100)] for chunk in chunks: - return self.runInteraction( + res = yield self.runInteraction( "_get_state_groups_from_groups", f, chunk ) + results.update(res) + + defer.returnValue(results) @defer.inlineCallbacks def get_state_for_events(self, event_ids, types): @@ -359,6 +370,8 @@ class StateStore(SQLBaseStore): a `state_key` of None matches all state_keys. If `types` is None then all events are returned. """ + if types: + types = frozenset(types) results = {} missing_groups = [] if types is not None: |