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

Commit fe8ed1b

Browse files
authored
Make StreamToken.room_key be a RoomStreamToken instance. (#8281)
1 parent c312ee3 commit fe8ed1b

File tree

16 files changed

+114
-99
lines changed

16 files changed

+114
-99
lines changed

changelog.d/8281.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Change `StreamToken.room_key` to be a `RoomStreamToken` instance.

mypy.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@ files =
4646
synapse/server_notices,
4747
synapse/spam_checker_api,
4848
synapse/state,
49+
synapse/storage/databases/main/events.py,
4950
synapse/storage/databases/main/stream.py,
5051
synapse/storage/databases/main/ui_auth.py,
5152
synapse/storage/database.py,
5253
synapse/storage/engines,
54+
synapse/storage/persist_events.py,
5355
synapse/storage/state.py,
5456
synapse/storage/util,
5557
synapse/streams,

synapse/handlers/admin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ async def export_user_data(self, user_id, writer):
125125
else:
126126
stream_ordering = room.stream_ordering
127127

128-
from_key = str(RoomStreamToken(0, 0))
129-
to_key = str(RoomStreamToken(None, stream_ordering))
128+
from_key = RoomStreamToken(0, 0)
129+
to_key = RoomStreamToken(None, stream_ordering)
130130

131131
written_events = set() # Events that we've processed in this room
132132

@@ -153,7 +153,7 @@ async def export_user_data(self, user_id, writer):
153153
if not events:
154154
break
155155

156-
from_key = events[-1].internal_metadata.after
156+
from_key = RoomStreamToken.parse(events[-1].internal_metadata.after)
157157

158158
events = await filter_events_for_client(self.storage, user_id, events)
159159

synapse/handlers/device.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from synapse.metrics.background_process_metrics import run_as_background_process
3030
from synapse.types import (
3131
RoomStreamToken,
32+
StreamToken,
3233
get_domain_from_id,
3334
get_verify_key_from_cross_signing_key,
3435
)
@@ -104,18 +105,15 @@ async def get_device(self, user_id: str, device_id: str) -> Dict[str, Any]:
104105

105106
@trace
106107
@measure_func("device.get_user_ids_changed")
107-
async def get_user_ids_changed(self, user_id, from_token):
108+
async def get_user_ids_changed(self, user_id: str, from_token: StreamToken):
108109
"""Get list of users that have had the devices updated, or have newly
109110
joined a room, that `user_id` may be interested in.
110-
111-
Args:
112-
user_id (str)
113-
from_token (StreamToken)
114111
"""
115112

116113
set_tag("user_id", user_id)
117114
set_tag("from_token", from_token)
118-
now_room_key = await self.store.get_room_events_max_id()
115+
now_room_id = self.store.get_room_max_stream_ordering()
116+
now_room_key = RoomStreamToken(None, now_room_id)
119117

120118
room_ids = await self.store.get_rooms_for_user(user_id)
121119

@@ -142,7 +140,7 @@ async def get_user_ids_changed(self, user_id, from_token):
142140
)
143141
rooms_changed.update(event.room_id for event in member_events)
144142

145-
stream_ordering = RoomStreamToken.parse_stream_token(from_token.room_key).stream
143+
stream_ordering = from_token.room_key.stream
146144

147145
possibly_changed = set(changed)
148146
possibly_left = set()

synapse/handlers/initial_sync.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from synapse.logging.context import make_deferred_yieldable, run_in_background
2626
from synapse.storage.roommember import RoomsForUser
2727
from synapse.streams.config import PaginationConfig
28-
from synapse.types import JsonDict, Requester, StreamToken, UserID
28+
from synapse.types import JsonDict, Requester, RoomStreamToken, StreamToken, UserID
2929
from synapse.util import unwrapFirstError
3030
from synapse.util.async_helpers import concurrently_execute
3131
from synapse.util.caches.response_cache import ResponseCache
@@ -167,7 +167,7 @@ async def handle_room(event: RoomsForUser):
167167
self.state_handler.get_current_state, event.room_id
168168
)
169169
elif event.membership == Membership.LEAVE:
170-
room_end_token = "s%d" % (event.stream_ordering,)
170+
room_end_token = RoomStreamToken(None, event.stream_ordering,)
171171
deferred_room_state = run_in_background(
172172
self.state_store.get_state_for_events, [event.event_id]
173173
)

synapse/handlers/message.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,7 @@ async def persist_and_notify_client_event(
973973
This should only be run on the instance in charge of persisting events.
974974
"""
975975
assert self._is_event_writer
976+
assert self.storage.persistence is not None
976977

977978
if ratelimit:
978979
# We check if this is a room admin redacting an event so that we

synapse/handlers/pagination.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ async def get_messages(
344344
# gets called.
345345
raise Exception("limit not set")
346346

347-
room_token = RoomStreamToken.parse(from_token.room_key)
347+
room_token = from_token.room_key
348348

349349
with await self.pagination_lock.read(room_id):
350350
(
@@ -381,7 +381,7 @@ async def get_messages(
381381

382382
if leave_token.topological < max_topo:
383383
from_token = from_token.copy_and_replace(
384-
"room_key", leave_token_str
384+
"room_key", leave_token
385385
)
386386

387387
await self.hs.get_handlers().federation_handler.maybe_backfill(

synapse/handlers/room.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,20 +1091,19 @@ def __init__(self, hs: "HomeServer"):
10911091
async def get_new_events(
10921092
self,
10931093
user: UserID,
1094-
from_key: str,
1094+
from_key: RoomStreamToken,
10951095
limit: int,
10961096
room_ids: List[str],
10971097
is_guest: bool,
10981098
explicit_room_id: Optional[str] = None,
1099-
) -> Tuple[List[EventBase], str]:
1099+
) -> Tuple[List[EventBase], RoomStreamToken]:
11001100
# We just ignore the key for now.
11011101

11021102
to_key = self.get_current_key()
11031103

1104-
from_token = RoomStreamToken.parse(from_key)
1105-
if from_token.topological:
1104+
if from_key.topological:
11061105
logger.warning("Stream has topological part!!!! %r", from_key)
1107-
from_key = "s%s" % (from_token.stream,)
1106+
from_key = RoomStreamToken(None, from_key.stream)
11081107

11091108
app_service = self.store.get_app_service_by_user_id(user.to_string())
11101109
if app_service:
@@ -1133,14 +1132,14 @@ async def get_new_events(
11331132
events[:] = events[:limit]
11341133

11351134
if events:
1136-
end_key = events[-1].internal_metadata.after
1135+
end_key = RoomStreamToken.parse(events[-1].internal_metadata.after)
11371136
else:
11381137
end_key = to_key
11391138

11401139
return (events, end_key)
11411140

1142-
def get_current_key(self) -> str:
1143-
return "s%d" % (self.store.get_room_max_stream_ordering(),)
1141+
def get_current_key(self) -> RoomStreamToken:
1142+
return RoomStreamToken(None, self.store.get_room_max_stream_ordering())
11441143

11451144
def get_current_key_for_room(self, room_id: str) -> Awaitable[str]:
11461145
return self.store.get_room_events_max_id(room_id)

synapse/handlers/sync.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ async def ephemeral_by_room(
378378
sync_config = sync_result_builder.sync_config
379379

380380
with Measure(self.clock, "ephemeral_by_room"):
381-
typing_key = since_token.typing_key if since_token else "0"
381+
typing_key = since_token.typing_key if since_token else 0
382382

383383
room_ids = sync_result_builder.joined_room_ids
384384

@@ -402,7 +402,7 @@ async def ephemeral_by_room(
402402
event_copy = {k: v for (k, v) in event.items() if k != "room_id"}
403403
ephemeral_by_room.setdefault(room_id, []).append(event_copy)
404404

405-
receipt_key = since_token.receipt_key if since_token else "0"
405+
receipt_key = since_token.receipt_key if since_token else 0
406406

407407
receipt_source = self.event_sources.sources["receipt"]
408408
receipts, receipt_key = await receipt_source.get_new_events(
@@ -533,7 +533,7 @@ async def _load_filtered_recents(
533533
if len(recents) > timeline_limit:
534534
limited = True
535535
recents = recents[-timeline_limit:]
536-
room_key = recents[0].internal_metadata.before
536+
room_key = RoomStreamToken.parse(recents[0].internal_metadata.before)
537537

538538
prev_batch_token = now_token.copy_and_replace("room_key", room_key)
539539

@@ -1322,6 +1322,7 @@ async def _generate_sync_entry_for_presence(
13221322
is_guest=sync_config.is_guest,
13231323
include_offline=include_offline,
13241324
)
1325+
assert presence_key
13251326
sync_result_builder.now_token = now_token.copy_and_replace(
13261327
"presence_key", presence_key
13271328
)
@@ -1484,7 +1485,7 @@ async def _have_rooms_changed(
14841485
if rooms_changed:
14851486
return True
14861487

1487-
stream_id = RoomStreamToken.parse_stream_token(since_token.room_key).stream
1488+
stream_id = since_token.room_key.stream
14881489
for room_id in sync_result_builder.joined_room_ids:
14891490
if self.store.has_room_changed_since(room_id, stream_id):
14901491
return True
@@ -1750,7 +1751,7 @@ async def _get_all_rooms(
17501751
continue
17511752

17521753
leave_token = now_token.copy_and_replace(
1753-
"room_key", "s%d" % (event.stream_ordering,)
1754+
"room_key", RoomStreamToken(None, event.stream_ordering)
17541755
)
17551756
room_entries.append(
17561757
RoomSyncResultBuilder(

synapse/notifier.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
Set,
2626
Tuple,
2727
TypeVar,
28+
Union,
2829
)
2930

3031
from prometheus_client import Counter
@@ -41,7 +42,7 @@
4142
from synapse.metrics import LaterGauge
4243
from synapse.metrics.background_process_metrics import run_as_background_process
4344
from synapse.streams.config import PaginationConfig
44-
from synapse.types import Collection, StreamToken, UserID
45+
from synapse.types import Collection, RoomStreamToken, StreamToken, UserID
4546
from synapse.util.async_helpers import ObservableDeferred, timeout_deferred
4647
from synapse.util.metrics import Measure
4748
from synapse.visibility import filter_events_for_client
@@ -111,7 +112,9 @@ def __init__(
111112
with PreserveLoggingContext():
112113
self.notify_deferred = ObservableDeferred(defer.Deferred())
113114

114-
def notify(self, stream_key: str, stream_id: int, time_now_ms: int):
115+
def notify(
116+
self, stream_key: str, stream_id: Union[int, RoomStreamToken], time_now_ms: int,
117+
):
115118
"""Notify any listeners for this user of a new event from an
116119
event source.
117120
Args:
@@ -294,7 +297,12 @@ def _notify_pending_new_room_events(self, max_room_stream_id: int):
294297
rooms.add(event.room_id)
295298

296299
if users or rooms:
297-
self.on_new_event("room_key", max_room_stream_id, users=users, rooms=rooms)
300+
self.on_new_event(
301+
"room_key",
302+
RoomStreamToken(None, max_room_stream_id),
303+
users=users,
304+
rooms=rooms,
305+
)
298306
self._on_updated_room_token(max_room_stream_id)
299307

300308
def _on_updated_room_token(self, max_room_stream_id: int):
@@ -329,7 +337,7 @@ async def _notify_pusher_pool(self, max_room_stream_id: int):
329337
def on_new_event(
330338
self,
331339
stream_key: str,
332-
new_token: int,
340+
new_token: Union[int, RoomStreamToken],
333341
users: Collection[UserID] = [],
334342
rooms: Collection[str] = [],
335343
):

0 commit comments

Comments
 (0)