Do work in parellel when joining a room

This commit is contained in:
Erik Johnston 2015-05-18 17:17:04 +01:00
parent 9396723995
commit ef910a0358
1 changed files with 50 additions and 19 deletions

View File

@ -516,30 +516,59 @@ class FederationHandler(BaseHandler):
# FIXME # FIXME
pass pass
for e in auth_chain: auth_ids_to_deferred = {}
e.internal_metadata.outlier = True
if e.event_id == event.event_id: def process_auth_ev(ev):
continue auth_ids = [e_id for e_id, _ in ev.auth_events]
prev_ds = [
auth_ids_to_deferred[i]
for i in auth_ids
if i in auth_ids_to_deferred
]
d = defer.Deferred()
auth_ids_to_deferred[ev.event_id] = d
@defer.inlineCallbacks
def f(*_):
ev.internal_metadata.outlier = True
try: try:
auth_ids = [e_id for e_id, _ in e.auth_events]
auth = { auth = {
(e.type, e.state_key): e for e in auth_chain (e.type, e.state_key): e for e in auth_chain
if e.event_id in auth_ids if e.event_id in auth_ids
} }
yield self._handle_new_event( yield self._handle_new_event(
origin, e, auth_events=auth origin, ev, auth_events=auth
) )
except: except:
logger.exception( logger.exception(
"Failed to handle auth event %s", "Failed to handle auth event %s",
e.event_id, ev.event_id,
) )
for e in state: d.callback(None)
if prev_ds:
dx = defer.DeferredList(prev_ds)
dx.addBoth(f)
else:
f()
for e in auth_chain:
if e.event_id == event.event_id: if e.event_id == event.event_id:
continue return
process_auth_ev(e)
yield defer.DeferredList(auth_ids_to_deferred.values())
@defer.inlineCallbacks
def handle_state(e):
if e.event_id == event.event_id:
return
e.internal_metadata.outlier = True e.internal_metadata.outlier = True
try: try:
@ -557,6 +586,8 @@ class FederationHandler(BaseHandler):
e.event_id, e.event_id,
) )
yield defer.DeferredList([handle_state(e) for e in state])
auth_ids = [e_id for e_id, _ in event.auth_events] auth_ids = [e_id for e_id, _ in event.auth_events]
auth_events = { auth_events = {
(e.type, e.state_key): e for e in auth_chain (e.type, e.state_key): e for e in auth_chain