mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2024-10-01 11:49:51 -04:00
Speed up get_current_state_ids
Using _simple_select_list is fairly expensive for functions that return a lot of rows and/or get called a lot. (This is because it carefully constructs a list of dicts). get_current_state_ids gets called a lot on startup and e.g. when the IRC bridge decided to send tonnes of joins/leaves (as it invalidates the cache). We therefore replace it with a custon txn function that builds up the final result dict without building up and intermediate representation.
This commit is contained in:
parent
54f59bd7d4
commit
d72667fcce
@ -14,7 +14,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from ._base import SQLBaseStore
|
from ._base import SQLBaseStore
|
||||||
from synapse.util.caches.descriptors import cached, cachedList, cachedInlineCallbacks
|
from synapse.util.caches.descriptors import cached, cachedList
|
||||||
from synapse.util.caches import intern_string
|
from synapse.util.caches import intern_string
|
||||||
from synapse.storage.engines import PostgresEngine
|
from synapse.storage.engines import PostgresEngine
|
||||||
|
|
||||||
@ -69,17 +69,24 @@ class StateStore(SQLBaseStore):
|
|||||||
where_clause="type='m.room.member'",
|
where_clause="type='m.room.member'",
|
||||||
)
|
)
|
||||||
|
|
||||||
@cachedInlineCallbacks(max_entries=100000, iterable=True)
|
@cached(max_entries=100000, iterable=True)
|
||||||
def get_current_state_ids(self, room_id):
|
def get_current_state_ids(self, room_id):
|
||||||
rows = yield self._simple_select_list(
|
def _get_current_state_ids_txn(txn):
|
||||||
table="current_state_events",
|
txn.execute(
|
||||||
keyvalues={"room_id": room_id},
|
"""SELECT type, state_key, event_id FROM current_state_events
|
||||||
retcols=["event_id", "type", "state_key"],
|
WHERE room_id = ?
|
||||||
desc="_calculate_state_delta",
|
""",
|
||||||
|
(room_id,)
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
(r[0], r[1]): r[2] for r in txn
|
||||||
|
}
|
||||||
|
|
||||||
|
return self.runInteraction(
|
||||||
|
"get_current_state_ids",
|
||||||
|
_get_current_state_ids_txn,
|
||||||
)
|
)
|
||||||
defer.returnValue({
|
|
||||||
(r["type"], r["state_key"]): r["event_id"] for r in rows
|
|
||||||
})
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_state_groups_ids(self, room_id, event_ids):
|
def get_state_groups_ids(self, room_id, event_ids):
|
||||||
|
Loading…
Reference in New Issue
Block a user