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

Mitigate against incorrect old state in /sync. #573

Merged
merged 1 commit into from
Feb 18, 2016
Merged
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
17 changes: 12 additions & 5 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,15 +823,17 @@ def compute_state_delta(self, room_id, batch, sync_config, since_token, now_toke
# TODO(mjark) Check for new redactions in the state events.

with Measure(self.clock, "compute_state_delta"):
current_state = yield self.get_state_at(
room_id, stream_position=now_token
)

if full_state:
if batch:
state = yield self.store.get_state_for_event(
batch.events[0].event_id
)
else:
state = yield self.get_state_at(
room_id, stream_position=now_token
)
state = current_state

timeline_state = {
(event.type, event.state_key): event
Expand All @@ -842,6 +844,7 @@ def compute_state_delta(self, room_id, batch, sync_config, since_token, now_toke
timeline_contains=timeline_state,
timeline_start=state,
previous={},
current=current_state,
)
elif batch.limited:
state_at_previous_sync = yield self.get_state_at(
Expand All @@ -861,6 +864,7 @@ def compute_state_delta(self, room_id, batch, sync_config, since_token, now_toke
timeline_contains=timeline_state,
timeline_start=state_at_timeline_start,
previous=state_at_previous_sync,
current=current_state,
)
else:
state = {}
Expand Down Expand Up @@ -920,14 +924,15 @@ def _action_has_highlight(actions):
return False


def _calculate_state(timeline_contains, timeline_start, previous):
def _calculate_state(timeline_contains, timeline_start, previous, current):
"""Works out what state to include in a sync response.

Args:
timeline_contains (dict): state in the timeline
timeline_start (dict): state at the start of the timeline
previous (dict): state at the end of the previous sync (or empty dict
if this is an initial sync)
current (dict): state at the end of the timeline

Returns:
dict
Expand All @@ -938,14 +943,16 @@ def _calculate_state(timeline_contains, timeline_start, previous):
timeline_contains.values(),
previous.values(),
timeline_start.values(),
current.values(),
)
}

c_ids = set(e.event_id for e in current.values())
tc_ids = set(e.event_id for e in timeline_contains.values())
p_ids = set(e.event_id for e in previous.values())
ts_ids = set(e.event_id for e in timeline_start.values())

state_ids = (ts_ids - p_ids) - tc_ids
state_ids = ((c_ids | ts_ids) - p_ids) - tc_ids

evs = (event_id_to_state[e] for e in state_ids)
return {
Expand Down