diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index 2695975a16..a1c289b24a 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -739,17 +739,11 @@ class EventCreationHandler(object):
"Attempting to create an event with %i prev_events"
% (len(prev_events_and_hashes),)
)
+ prev_event_ids = [event_id for event_id, _, _ in prev_events_and_hashes]
else:
- prev_events_and_hashes = yield self.store.get_prev_events_and_hashes_for_room(
- builder.room_id
- )
-
- prev_events = [
- (event_id, prev_hashes)
- for event_id, prev_hashes, _ in prev_events_and_hashes
- ]
+ prev_event_ids = yield self.store.get_prev_events_for_room(builder.room_id)
- event = yield builder.build(prev_event_ids=[p for p, _ in prev_events])
+ event = yield builder.build(prev_event_ids=prev_event_ids)
context = yield self.state.compute_event_context(event)
if requester:
context.app_service = requester.app_service
diff --git a/synapse/storage/data_stores/main/event_federation.py b/synapse/storage/data_stores/main/event_federation.py
index 266fc9715f..88e6489576 100644
--- a/synapse/storage/data_stores/main/event_federation.py
+++ b/synapse/storage/data_stores/main/event_federation.py
@@ -177,6 +177,41 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
return res
+ def get_prev_events_for_room(self, room_id: str):
+ """
+ Gets a subset of the current forward extremities in the given room.
+
+ Limits the result to 10 extremities, so that we can avoid creating
+ events which refer to hundreds of prev_events.
+
+ Args:
+ room_id (str): room_id
+
+ Returns:
+ Deferred[List[str]]: the event ids of the forward extremites
+
+ """
+
+ return self.db.runInteraction(
+ "get_prev_events_for_room", self._get_prev_events_for_room_txn, room_id
+ )
+
+ def _get_prev_events_for_room_txn(self, txn, room_id: str):
+ # we just use the 10 newest events. Older events will become
+ # prev_events of future events.
+
+ sql = """
+ SELECT e.event_id FROM event_forward_extremities AS f
+ INNER JOIN events AS e USING (event_id)
+ WHERE f.room_id = ?
+ ORDER BY e.depth DESC
+ LIMIT 10
+ """
+
+ txn.execute(sql, (room_id,))
+
+ return [row[0] for row in txn]
+
def get_latest_event_ids_and_hashes_in_room(self, room_id):
"""
Gets the current forward extremities in the given room
|