Test some ideas that might help performance a bit

This commit is contained in:
Erik Johnston 2014-12-17 23:37:08 +00:00
parent dec5b62339
commit f3788e3c78
4 changed files with 32 additions and 23 deletions

View File

@ -91,7 +91,7 @@ class FederationHandler(BaseHandler):
yield run_on_reactor() yield run_on_reactor()
yield self.replication_layer.send_pdu(event, destinations) self.replication_layer.send_pdu(event, destinations)
@log_function @log_function
@defer.inlineCallbacks @defer.inlineCallbacks
@ -527,7 +527,7 @@ class FederationHandler(BaseHandler):
event.signatures, event.signatures,
) )
yield self.replication_layer.send_pdu(new_pdu, destinations) self.replication_layer.send_pdu(new_pdu, destinations)
state_ids = [e.event_id for e in context.current_state.values()] state_ids = [e.event_id for e in context.current_state.values()]
auth_chain = yield self.store.get_auth_chain(set( auth_chain = yield self.store.get_auth_chain(set(

View File

@ -440,14 +440,29 @@ class SQLBaseStore(object):
) )
def _get_events_txn(self, txn, event_ids): def _get_events_txn(self, txn, event_ids):
events = [] if not event_ids:
for e_id in event_ids: return []
ev = self._get_event_txn(txn, e_id)
if ev: if len(event_ids) > 50:
events.append(ev) events = []
n = 50
for e_ids in [event_ids[i:i + n] for i in range(0, len(event_ids), n)]:
events.extend(self._get_events_txn(txn, e_ids))
return events
return events where_clause = " OR ".join(["e.event_id = ?" for _ in event_ids])
sql = (
"SELECT internal_metadata, json, r.event_id FROM event_json as e "
"LEFT JOIN redactions as r ON e.event_id = r.redacts "
"WHERE %s"
) % (where_clause,)
txn.execute(sql, event_ids)
res = txn.fetchall()
return [self._get_event_from_row_txn(txn, *r) for r in res]
def _get_event_txn(self, txn, event_id, check_redacted=True, def _get_event_txn(self, txn, event_id, check_redacted=True,
get_prev_content=True): get_prev_content=True):
@ -467,6 +482,13 @@ class SQLBaseStore(object):
internal_metadata, js, redacted = res internal_metadata, js, redacted = res
return self._get_event_from_row_txn(
txn, internal_metadata, js, redacted, check_redacted=check_redacted,
get_prev_content=get_prev_content,
)
def _get_event_from_row_txn(self, txn, internal_metadata, js, redacted,
check_redacted=True, get_prev_content=True):
d = json.loads(js) d = json.loads(js)
internal_metadata = json.loads(internal_metadata) internal_metadata = json.loads(internal_metadata)

View File

@ -183,20 +183,14 @@ class RoomMemberStore(SQLBaseStore):
) )
def _get_members_query_txn(self, txn, where_clause, where_values): def _get_members_query_txn(self, txn, where_clause, where_values):
del_sql = (
"SELECT event_id FROM redactions WHERE redacts = e.event_id "
"LIMIT 1"
)
sql = ( sql = (
"SELECT e.*, (%(redacted)s) AS redacted FROM events as e " "SELECT e.* FROM events as e "
"INNER JOIN room_memberships as m " "INNER JOIN room_memberships as m "
"ON e.event_id = m.event_id " "ON e.event_id = m.event_id "
"INNER JOIN current_state_events as c " "INNER JOIN current_state_events as c "
"ON m.event_id = c.event_id " "ON m.event_id = c.event_id "
"WHERE %(where)s " "WHERE %(where)s "
) % { ) % {
"redacted": del_sql,
"where": where_clause, "where": where_clause,
} }

View File

@ -62,14 +62,7 @@ class StateStore(SQLBaseStore):
keyvalues={"state_group": group}, keyvalues={"state_group": group},
retcol="event_id", retcol="event_id",
) )
state = [] state = self._get_events_txn(txn, state_ids)
for state_id in state_ids:
s = self._get_events_txn(
txn,
[state_id],
)
if s:
state.extend(s)
res[group] = state res[group] = state