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

get rid of (most of) have_events from _update_auth_events_and_context_for_auth #6468

Merged
merged 1 commit into from
Dec 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -2122,14 +2122,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 @@ -2175,9 +2170,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 @@ -2207,39 +2199,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 @@ -770,40 +770,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