Do work in parellel when joining a room

pull/156/head
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
pass
for e in auth_chain:
e.internal_metadata.outlier = True
auth_ids_to_deferred = {}
if e.event_id == event.event_id:
continue
def process_auth_ev(ev):
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:
auth_ids = [e_id for e_id, _ in e.auth_events]
auth = {
(e.type, e.state_key): e for e in auth_chain
if e.event_id in auth_ids
}
yield self._handle_new_event(
origin, e, auth_events=auth
origin, ev, auth_events=auth
)
except:
logger.exception(
"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:
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
try:
@ -557,6 +586,8 @@ class FederationHandler(BaseHandler):
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_events = {
(e.type, e.state_key): e for e in auth_chain