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

Commit 126a157

Browse files
authored
Do not allow a None-limit on PaginationConfig. (#14146)
The callers either set a default limit or manually handle a None-limit later on (by setting a default value). Update the callers to always instantiate PaginationConfig with a default limit and then assume the limit is non-None.
1 parent c744690 commit 126a157

File tree

16 files changed

+29
-50
lines changed

16 files changed

+29
-50
lines changed

changelog.d/14146.removal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove the unstable identifier for [MSC3715](https://github.com/matrix-org/matrix-doc/pull/3715).

synapse/handlers/account_data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ async def get_new_events(
225225
self,
226226
user: UserID,
227227
from_key: int,
228-
limit: Optional[int],
228+
limit: int,
229229
room_ids: Collection[str],
230230
is_guest: bool,
231231
explicit_room_id: Optional[str] = None,

synapse/handlers/initial_sync.py

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,7 @@ def __init__(self, hs: "HomeServer"):
5757
self.validator = EventValidator()
5858
self.snapshot_cache: ResponseCache[
5959
Tuple[
60-
str,
61-
Optional[StreamToken],
62-
Optional[StreamToken],
63-
str,
64-
Optional[int],
65-
bool,
66-
bool,
60+
str, Optional[StreamToken], Optional[StreamToken], str, int, bool, bool
6761
]
6862
] = ResponseCache(hs.get_clock(), "initial_sync_cache")
6963
self._event_serializer = hs.get_event_client_serializer()
@@ -154,11 +148,6 @@ async def _snapshot_all_rooms(
154148

155149
public_room_ids = await self.store.get_public_room_ids()
156150

157-
if pagin_config.limit is not None:
158-
limit = pagin_config.limit
159-
else:
160-
limit = 10
161-
162151
serializer_options = SerializeEventConfig(as_client_event=as_client_event)
163152

164153
async def handle_room(event: RoomsForUser) -> None:
@@ -210,7 +199,7 @@ async def handle_room(event: RoomsForUser) -> None:
210199
run_in_background(
211200
self.store.get_recent_events_for_room,
212201
event.room_id,
213-
limit=limit,
202+
limit=pagin_config.limit,
214203
end_token=room_end_token,
215204
),
216205
deferred_room_state,
@@ -360,15 +349,11 @@ async def _room_initial_sync_parted(
360349
member_event_id
361350
)
362351

363-
limit = pagin_config.limit if pagin_config else None
364-
if limit is None:
365-
limit = 10
366-
367352
leave_position = await self.store.get_position_for_event(member_event_id)
368353
stream_token = leave_position.to_room_stream_token()
369354

370355
messages, token = await self.store.get_recent_events_for_room(
371-
room_id, limit=limit, end_token=stream_token
356+
room_id, limit=pagin_config.limit, end_token=stream_token
372357
)
373358

374359
messages = await filter_events_for_client(
@@ -420,10 +405,6 @@ async def _room_initial_sync_joined(
420405

421406
now_token = self.hs.get_event_sources().get_current_token()
422407

423-
limit = pagin_config.limit if pagin_config else None
424-
if limit is None:
425-
limit = 10
426-
427408
room_members = [
428409
m
429410
for m in current_state.values()
@@ -467,7 +448,7 @@ async def get_receipts() -> List[JsonDict]:
467448
run_in_background(
468449
self.store.get_recent_events_for_room,
469450
room_id,
470-
limit=limit,
451+
limit=pagin_config.limit,
471452
end_token=now_token.room_key,
472453
),
473454
),

synapse/handlers/pagination.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -458,11 +458,6 @@ async def get_messages(
458458
# `/messages` should still works with live tokens when manually provided.
459459
assert from_token.room_key.topological is not None
460460

461-
if pagin_config.limit is None:
462-
# This shouldn't happen as we've set a default limit before this
463-
# gets called.
464-
raise Exception("limit not set")
465-
466461
room_token = from_token.room_key
467462

468463
async with self.pagination_lock.read(room_id):

synapse/handlers/presence.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,9 @@ async def get_new_events(
15961596
self,
15971597
user: UserID,
15981598
from_key: Optional[int],
1599-
limit: Optional[int] = None,
1599+
# Having a default limit doesn't match the EventSource API, but some
1600+
# callers do not provide it. It is unused in this class.
1601+
limit: int = 0,
16001602
room_ids: Optional[Collection[str]] = None,
16011603
is_guest: bool = False,
16021604
explicit_room_id: Optional[str] = None,

synapse/handlers/receipts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ async def get_new_events(
257257
self,
258258
user: UserID,
259259
from_key: int,
260-
limit: Optional[int],
260+
limit: int,
261261
room_ids: Iterable[str],
262262
is_guest: bool,
263263
explicit_room_id: Optional[str] = None,

synapse/handlers/relations.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,6 @@ async def get_relations(
116116
if event is None:
117117
raise SynapseError(404, "Unknown parent event.")
118118

119-
# TODO Update pagination config to not allow None limits.
120-
assert pagin_config.limit is not None
121-
122119
# Note that ignored users are not passed into get_relations_for_event
123120
# below. Ignored users are handled in filter_events_for_client (and by
124121
# not passing them in here we should get a better cache hit rate).

synapse/handlers/room.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1646,7 +1646,7 @@ async def get_new_events(
16461646
self,
16471647
user: UserID,
16481648
from_key: RoomStreamToken,
1649-
limit: Optional[int],
1649+
limit: int,
16501650
room_ids: Collection[str],
16511651
is_guest: bool,
16521652
explicit_room_id: Optional[str] = None,

synapse/handlers/typing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ async def get_new_events(
513513
self,
514514
user: UserID,
515515
from_key: int,
516-
limit: Optional[int],
516+
limit: int,
517517
room_ids: Iterable[str],
518518
is_guest: bool,
519519
explicit_room_id: Optional[str] = None,

synapse/rest/client/events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
5050
raise SynapseError(400, "Guest users must specify room_id param")
5151
room_id = parse_string(request, "room_id")
5252

53-
pagin_config = await PaginationConfig.from_request(self.store, request)
53+
pagin_config = await PaginationConfig.from_request(
54+
self.store, request, default_limit=10
55+
)
5456
timeout = EventStreamRestServlet.DEFAULT_LONGPOLL_TIME_MS
5557
if b"timeout" in args:
5658
try:

synapse/rest/client/initial_sync.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
3939
requester = await self.auth.get_user_by_req(request)
4040
args: Dict[bytes, List[bytes]] = request.args # type: ignore
4141
as_client_event = b"raw" not in args
42-
pagination_config = await PaginationConfig.from_request(self.store, request)
42+
pagination_config = await PaginationConfig.from_request(
43+
self.store, request, default_limit=10
44+
)
4345
include_archived = parse_boolean(request, "archived", default=False)
4446
content = await self.initial_sync_handler.snapshot_all_rooms(
4547
user_id=requester.user.to_string(),

synapse/rest/client/room.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,9 @@ async def on_GET(
729729
self, request: SynapseRequest, room_id: str
730730
) -> Tuple[int, JsonDict]:
731731
requester = await self.auth.get_user_by_req(request, allow_guest=True)
732-
pagination_config = await PaginationConfig.from_request(self.store, request)
732+
pagination_config = await PaginationConfig.from_request(
733+
self.store, request, default_limit=10
734+
)
733735
content = await self.initial_sync_handler.room_initial_sync(
734736
room_id=room_id, requester=requester, pagin_config=pagination_config
735737
)

synapse/storage/databases/main/stream.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,8 +1200,6 @@ def _paginate_room_events_txn(
12001200
`to_token`), or `limit` is zero.
12011201
"""
12021202

1203-
assert int(limit) >= 0
1204-
12051203
# Tokens really represent positions between elements, but we use
12061204
# the convention of pointing to the event before the gap. Hence
12071205
# we have a bit of asymmetry when it comes to equalities.

synapse/streams/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async def get_new_events(
2727
self,
2828
user: UserID,
2929
from_key: K,
30-
limit: Optional[int],
30+
limit: int,
3131
room_ids: Collection[str],
3232
is_guest: bool,
3333
explicit_room_id: Optional[str] = None,

synapse/streams/config.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ class PaginationConfig:
3535
from_token: Optional[StreamToken]
3636
to_token: Optional[StreamToken]
3737
direction: str
38-
limit: Optional[int]
38+
limit: int
3939

4040
@classmethod
4141
async def from_request(
4242
cls,
4343
store: "DataStore",
4444
request: SynapseRequest,
45-
default_limit: Optional[int] = None,
45+
default_limit: int,
4646
default_dir: str = "f",
4747
) -> "PaginationConfig":
4848
direction = parse_string(
@@ -69,12 +69,10 @@ async def from_request(
6969
raise SynapseError(400, "'to' parameter is invalid")
7070

7171
limit = parse_integer(request, "limit", default=default_limit)
72+
if limit < 0:
73+
raise SynapseError(400, "Limit must be 0 or above")
7274

73-
if limit:
74-
if limit < 0:
75-
raise SynapseError(400, "Limit must be 0 or above")
76-
77-
limit = min(int(limit), MAX_LIMIT)
75+
limit = min(limit, MAX_LIMIT)
7876

7977
try:
8078
return PaginationConfig(from_tok, to_tok, direction, limit)

tests/rest/client/test_typing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ def test_set_typing(self) -> None:
5959
self.event_source.get_new_events(
6060
user=UserID.from_string(self.user_id),
6161
from_key=0,
62-
limit=None,
62+
# Limit is unused.
63+
limit=0,
6364
room_ids=[self.room_id],
6465
is_guest=False,
6566
)

0 commit comments

Comments
 (0)