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 #549 from matrix-org/erikj/sync
Browse files Browse the repository at this point in the history
Fetch events in a separate transaction.
  • Loading branch information
erikjohnston committed Feb 2, 2016
2 parents 04ad93e + 8a391e3 commit 43e13db
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 29 deletions.
2 changes: 1 addition & 1 deletion synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,7 @@ def get_new_events(
limit=limit,
)
else:
room_events = yield self.store.get_room_changes_for_user(
room_events = yield self.store.get_membership_changes_for_user(
user.to_string(), from_key, to_key
)

Expand Down
2 changes: 1 addition & 1 deletion synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ def incremental_sync_with_gap(self, sync_config, since_token):
)

# Get a list of membership change events that have happened.
rooms_changed = yield self.store.get_room_changes_for_user(
rooms_changed = yield self.store.get_membership_changes_for_user(
user_id, since_token.room_key, now_token.room_key
)

Expand Down
57 changes: 30 additions & 27 deletions synapse/storage/stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,43 +220,45 @@ def f(txn):

rows = self.cursor_to_dict(txn)

ret = self._get_events_txn(
txn,
[r["event_id"] for r in rows],
get_prev_content=True
)
return rows

self._set_before_and_after(ret, rows, topo_order=False)
rows = yield self.runInteraction("get_room_events_stream_for_room", f)

ret.reverse()
ret = yield self._get_events(
[r["event_id"] for r in rows],
get_prev_content=True
)

if rows:
key = "s%d" % min(r["stream_ordering"] for r in rows)
else:
# Assume we didn't get anything because there was nothing to
# get.
key = from_key
self._set_before_and_after(ret, rows, topo_order=False)

return ret, key
res = yield self.runInteraction("get_room_events_stream_for_room", f)
defer.returnValue(res)
ret.reverse()

def get_room_changes_for_user(self, user_id, from_key, to_key):
if rows:
key = "s%d" % min(r["stream_ordering"] for r in rows)
else:
# Assume we didn't get anything because there was nothing to
# get.
key = from_key

defer.returnValue((ret, key))

@defer.inlineCallbacks
def get_membership_changes_for_user(self, user_id, from_key, to_key):
if from_key is not None:
from_id = RoomStreamToken.parse_stream_token(from_key).stream
else:
from_id = None
to_id = RoomStreamToken.parse_stream_token(to_key).stream

if from_key == to_key:
return defer.succeed([])
defer.returnValue([])

if from_id:
has_changed = self._membership_stream_cache.has_entity_changed(
user_id, int(from_id)
)
if not has_changed:
return defer.succeed([])
defer.returnValue([])

def f(txn):
if from_id is not None:
Expand All @@ -281,17 +283,18 @@ def f(txn):
txn.execute(sql, (user_id, to_id,))
rows = self.cursor_to_dict(txn)

ret = self._get_events_txn(
txn,
[r["event_id"] for r in rows],
get_prev_content=True
)
return rows

rows = yield self.runInteraction("get_membership_changes_for_user", f)

self._set_before_and_after(ret, rows, topo_order=False)
ret = yield self._get_events(
[r["event_id"] for r in rows],
get_prev_content=True
)

return ret
self._set_before_and_after(ret, rows, topo_order=False)

return self.runInteraction("get_room_changes_for_user", f)
defer.returnValue(ret)

def get_room_events_stream(
self,
Expand Down

0 comments on commit 43e13db

Please sign in to comment.