Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
get rid of (most of) have_events from _update_auth_events_and_context…
Browse files Browse the repository at this point in the history
…_for_auth (#6468)

* commit 'e203874ca':
  get rid of (most of) have_events from _update_auth_events_and_context_for_auth (#6468)
  • Loading branch information
anoadragon453 committed Mar 19, 2020
2 parents 663970c + e203874 commit 92d6b6c
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 72 deletions.
1 change: 1 addition & 0 deletions changelog.d/6468.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Refactor some code in the event authentication path for clarity.
62 changes: 24 additions & 38 deletions synapse/handlers/federation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2129,14 +2129,9 @@ def _update_auth_events_and_context_for_auth(
#
# we start by checking if they are in the store, and then try calling /event_auth/.
if missing_auth:
# TODO: can we use store.have_seen_events here instead?
have_events = yield self.store.get_seen_events_with_rejections(missing_auth)
logger.debug("Found events %s in the store", have_events)
missing_auth.difference_update(have_events.keys())
else:
have_events = {}

have_events.update({e.event_id: "" for e in auth_events.values()})
have_events = yield self.store.have_seen_events(missing_auth)
logger.debug("Events %s are in the store", have_events)
missing_auth.difference_update(have_events)

if missing_auth:
# If we don't have all the auth events, we need to get them.
Expand Down Expand Up @@ -2182,9 +2177,6 @@ def _update_auth_events_and_context_for_auth(
except AuthError:
pass

have_events = yield self.store.get_seen_events_with_rejections(
event.auth_event_ids()
)
except Exception:
logger.exception("Failed to get auth chain")

Expand Down Expand Up @@ -2214,39 +2206,33 @@ def _update_auth_events_and_context_for_auth(
# idea of them.

room_version = yield self.store.get_room_version(event.room_id)
different_event_ids = [
d for d in different_auth if d in have_events and not have_events[d]
]

if different_event_ids:
# XXX: currently this checks for redactions but I'm not convinced that is
# necessary?
different_events = yield self.store.get_events_as_list(different_event_ids)
# XXX: currently this checks for redactions but I'm not convinced that is
# necessary?
different_events = yield self.store.get_events_as_list(different_auth)

local_view = dict(auth_events)
remote_view = dict(auth_events)
remote_view.update({(d.type, d.state_key): d for d in different_events})
local_view = dict(auth_events)
remote_view = dict(auth_events)
remote_view.update({(d.type, d.state_key): d for d in different_events})

new_state = yield self.state_handler.resolve_events(
room_version,
[list(local_view.values()), list(remote_view.values())],
event,
)
new_state = yield self.state_handler.resolve_events(
room_version, [list(local_view.values()), list(remote_view.values())], event
)

logger.info(
"After state res: updating auth_events with new state %s",
{
(d.type, d.state_key): d.event_id
for d in new_state.values()
if auth_events.get((d.type, d.state_key)) != d
},
)
logger.info(
"After state res: updating auth_events with new state %s",
{
(d.type, d.state_key): d.event_id
for d in new_state.values()
if auth_events.get((d.type, d.state_key)) != d
},
)

auth_events.update(new_state)
auth_events.update(new_state)

context = yield self._update_context_for_auth_events(
event, context, auth_events
)
context = yield self._update_context_for_auth_events(
event, context, auth_events
)

return context

Expand Down
34 changes: 0 additions & 34 deletions synapse/storage/data_stores/main/events_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -783,40 +783,6 @@ def have_seen_events_txn(txn, chunk):
yield self.runInteraction("have_seen_events", have_seen_events_txn, chunk)
return results

def get_seen_events_with_rejections(self, event_ids):
"""Given a list of event ids, check if we rejected them.
Args:
event_ids (list[str])
Returns:
Deferred[dict[str, str|None):
Has an entry for each event id we already have seen. Maps to
the rejected reason string if we rejected the event, else maps
to None.
"""
if not event_ids:
return defer.succeed({})

def f(txn):
sql = (
"SELECT e.event_id, reason FROM events as e "
"LEFT JOIN rejections as r ON e.event_id = r.event_id "
"WHERE e.event_id = ?"
)

res = {}
for event_id in event_ids:
txn.execute(sql, (event_id,))
row = txn.fetchone()
if row:
_, rejected = row
res[event_id] = rejected

return res

return self.runInteraction("get_seen_events_with_rejections", f)

def _get_total_state_event_counts_txn(self, txn, room_id):
"""
See get_total_state_event_counts.
Expand Down

0 comments on commit 92d6b6c

Please sign in to comment.