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

Commit

Permalink
Merge pull request #573 from matrix-org/erikj/sync_fix
Browse files Browse the repository at this point in the history
Mitigate against incorrect old state in /sync.
  • Loading branch information
erikjohnston committed Feb 18, 2016
2 parents 9c90202 + 4d54d87 commit 220231d
Showing 1 changed file with 12 additions and 5 deletions.
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

0 comments on commit 220231d

Please sign in to comment.