diff options
author | Erik Johnston <erik@matrix.org> | 2019-07-17 15:33:37 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2019-07-18 14:15:57 +0100 |
commit | 6de09e07a6f7d043589205c25594852900a6626b (patch) | |
tree | 0511584c8c2e6bb4d1c27e0715a4bea95b4a4a9a /synapse/storage/events.py | |
parent | Merge pull request #5597 from matrix-org/erikj/admin_api_cmd (diff) | |
download | synapse-6de09e07a6f7d043589205c25594852900a6626b.tar.xz |
Add membership column to current_state_events table.
It turns out that doing a join is surprisingly expensive for the DB to do when room_membership table is larger than the disk cache.
Diffstat (limited to 'synapse/storage/events.py')
-rw-r--r-- | synapse/storage/events.py | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/synapse/storage/events.py b/synapse/storage/events.py index b486ca50eb..b70457bfc6 100644 --- a/synapse/storage/events.py +++ b/synapse/storage/events.py @@ -918,8 +918,6 @@ class EventsStore( min_stream_order = events_and_contexts[0][0].internal_metadata.stream_ordering max_stream_order = events_and_contexts[-1][0].internal_metadata.stream_ordering - self._update_current_state_txn(txn, state_delta_for_room, min_stream_order) - self._update_forward_extremities_txn( txn, new_forward_extremities=new_forward_extremeties, @@ -993,6 +991,10 @@ class EventsStore( backfilled=backfilled, ) + # We call this last as it assumes we've inserted the events into + # room_memberships, where applicable. + self._update_current_state_txn(txn, state_delta_for_room, min_stream_order) + def _update_current_state_txn(self, txn, state_delta_by_room, stream_id): for room_id, current_state_tuple in iteritems(state_delta_by_room): to_delete, to_insert = current_state_tuple @@ -1062,16 +1064,16 @@ class EventsStore( ), ) - self._simple_insert_many_txn( - txn, - table="current_state_events", - values=[ - { - "event_id": ev_id, - "room_id": room_id, - "type": key[0], - "state_key": key[1], - } + # We include the membership in the current state table, hence we do + # a lookup when we insert. This assumes that all events have already + # been inserted into room_memberships. + txn.executemany( + """INSERT INTO current_state_events + (room_id, type, state_key, event_id, membership) + VALUES (?, ?, ?, ?, (SELECT membership FROM room_memberships WHERE event_id = ?)) + """, + [ + (room_id, key[0], key[1], ev_id, ev_id) for key, ev_id in iteritems(to_insert) ], ) |