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

Commit cd1ae3d

Browse files
authored
Remove backwards compatibility with RelationPaginationToken. (#12138)
1 parent 36071d3 commit cd1ae3d

File tree

4 files changed

+16
-144
lines changed

4 files changed

+16
-144
lines changed

changelog.d/12138.removal

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove backwards compatibilty with pagination tokens from the `/relations` and `/aggregations` endpoints generated from Synapse < v1.52.0.

synapse/rest/client/relations.py

+14-41
Original file line numberDiff line numberDiff line change
@@ -27,50 +27,15 @@
2727
from synapse.http.servlet import RestServlet, parse_integer, parse_string
2828
from synapse.http.site import SynapseRequest
2929
from synapse.rest.client._base import client_patterns
30-
from synapse.storage.relations import (
31-
AggregationPaginationToken,
32-
PaginationChunk,
33-
RelationPaginationToken,
34-
)
35-
from synapse.types import JsonDict, RoomStreamToken, StreamToken
30+
from synapse.storage.relations import AggregationPaginationToken, PaginationChunk
31+
from synapse.types import JsonDict, StreamToken
3632

3733
if TYPE_CHECKING:
3834
from synapse.server import HomeServer
39-
from synapse.storage.databases.main import DataStore
4035

4136
logger = logging.getLogger(__name__)
4237

4338

44-
async def _parse_token(
45-
store: "DataStore", token: Optional[str]
46-
) -> Optional[StreamToken]:
47-
"""
48-
For backwards compatibility support RelationPaginationToken, but new pagination
49-
tokens are generated as full StreamTokens, to be compatible with /sync and /messages.
50-
"""
51-
if not token:
52-
return None
53-
# Luckily the format for StreamToken and RelationPaginationToken differ enough
54-
# that they can easily be separated. An "_" appears in the serialization of
55-
# RoomStreamToken (as part of StreamToken), but RelationPaginationToken uses
56-
# "-" only for separators.
57-
if "_" in token:
58-
return await StreamToken.from_string(store, token)
59-
else:
60-
relation_token = RelationPaginationToken.from_string(token)
61-
return StreamToken(
62-
room_key=RoomStreamToken(relation_token.topological, relation_token.stream),
63-
presence_key=0,
64-
typing_key=0,
65-
receipt_key=0,
66-
account_data_key=0,
67-
push_rules_key=0,
68-
to_device_key=0,
69-
device_list_key=0,
70-
groups_key=0,
71-
)
72-
73-
7439
class RelationPaginationServlet(RestServlet):
7540
"""API to paginate relations on an event by topological ordering, optionally
7641
filtered by relation type and event type.
@@ -122,8 +87,12 @@ async def on_GET(
12287
pagination_chunk = PaginationChunk(chunk=[])
12388
else:
12489
# Return the relations
125-
from_token = await _parse_token(self.store, from_token_str)
126-
to_token = await _parse_token(self.store, to_token_str)
90+
from_token = None
91+
if from_token_str:
92+
from_token = await StreamToken.from_string(self.store, from_token_str)
93+
to_token = None
94+
if to_token_str:
95+
to_token = await StreamToken.from_string(self.store, to_token_str)
12796

12897
pagination_chunk = await self.store.get_relations_for_event(
12998
event_id=parent_id,
@@ -317,8 +286,12 @@ async def on_GET(
317286
from_token_str = parse_string(request, "from")
318287
to_token_str = parse_string(request, "to")
319288

320-
from_token = await _parse_token(self.store, from_token_str)
321-
to_token = await _parse_token(self.store, to_token_str)
289+
from_token = None
290+
if from_token_str:
291+
from_token = await StreamToken.from_string(self.store, from_token_str)
292+
to_token = None
293+
if to_token_str:
294+
to_token = await StreamToken.from_string(self.store, to_token_str)
322295

323296
result = await self.store.get_relations_for_event(
324297
event_id=parent_id,

synapse/storage/relations.py

-31
Original file line numberDiff line numberDiff line change
@@ -54,37 +54,6 @@ async def to_dict(self, store: "DataStore") -> Dict[str, Any]:
5454
return d
5555

5656

57-
@attr.s(frozen=True, slots=True, auto_attribs=True)
58-
class RelationPaginationToken:
59-
"""Pagination token for relation pagination API.
60-
61-
As the results are in topological order, we can use the
62-
`topological_ordering` and `stream_ordering` fields of the events at the
63-
boundaries of the chunk as pagination tokens.
64-
65-
Attributes:
66-
topological: The topological ordering of the boundary event
67-
stream: The stream ordering of the boundary event.
68-
"""
69-
70-
topological: int
71-
stream: int
72-
73-
@staticmethod
74-
def from_string(string: str) -> "RelationPaginationToken":
75-
try:
76-
t, s = string.split("-")
77-
return RelationPaginationToken(int(t), int(s))
78-
except ValueError:
79-
raise SynapseError(400, "Invalid relation pagination token")
80-
81-
async def to_string(self, store: "DataStore") -> str:
82-
return "%d-%d" % (self.topological, self.stream)
83-
84-
def as_tuple(self) -> Tuple[Any, ...]:
85-
return attr.astuple(self)
86-
87-
8857
@attr.s(frozen=True, slots=True, auto_attribs=True)
8958
class AggregationPaginationToken:
9059
"""Pagination token for relation aggregation pagination API.

tests/rest/client/test_relations.py

+1-72
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
from synapse.rest import admin
2525
from synapse.rest.client import login, register, relations, room, sync
2626
from synapse.server import HomeServer
27-
from synapse.storage.relations import RelationPaginationToken
28-
from synapse.types import JsonDict, StreamToken
27+
from synapse.types import JsonDict
2928
from synapse.util import Clock
3029

3130
from tests import unittest
@@ -281,15 +280,6 @@ def test_basic_paginate_relations(self) -> None:
281280
channel.json_body["chunk"][0],
282281
)
283282

284-
def _stream_token_to_relation_token(self, token: str) -> str:
285-
"""Convert a StreamToken into a legacy token (RelationPaginationToken)."""
286-
room_key = self.get_success(StreamToken.from_string(self.store, token)).room_key
287-
return self.get_success(
288-
RelationPaginationToken(
289-
topological=room_key.topological, stream=room_key.stream
290-
).to_string(self.store)
291-
)
292-
293283
def test_repeated_paginate_relations(self) -> None:
294284
"""Test that if we paginate using a limit and tokens then we get the
295285
expected events.
@@ -330,34 +320,6 @@ def test_repeated_paginate_relations(self) -> None:
330320
found_event_ids.reverse()
331321
self.assertEqual(found_event_ids, expected_event_ids)
332322

333-
# Reset and try again, but convert the tokens to the legacy format.
334-
prev_token = ""
335-
found_event_ids = []
336-
for _ in range(20):
337-
from_token = ""
338-
if prev_token:
339-
from_token = "&from=" + self._stream_token_to_relation_token(prev_token)
340-
341-
channel = self.make_request(
342-
"GET",
343-
f"/_matrix/client/unstable/rooms/{self.room}/relations/{self.parent_id}?limit=1{from_token}",
344-
access_token=self.user_token,
345-
)
346-
self.assertEqual(200, channel.code, channel.json_body)
347-
348-
found_event_ids.extend(e["event_id"] for e in channel.json_body["chunk"])
349-
next_batch = channel.json_body.get("next_batch")
350-
351-
self.assertNotEqual(prev_token, next_batch)
352-
prev_token = next_batch
353-
354-
if not prev_token:
355-
break
356-
357-
# We paginated backwards, so reverse
358-
found_event_ids.reverse()
359-
self.assertEqual(found_event_ids, expected_event_ids)
360-
361323
def test_pagination_from_sync_and_messages(self) -> None:
362324
"""Pagination tokens from /sync and /messages can be used to paginate /relations."""
363325
channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "A")
@@ -543,39 +505,6 @@ def test_aggregation_pagination_within_group(self) -> None:
543505
found_event_ids.reverse()
544506
self.assertEqual(found_event_ids, expected_event_ids)
545507

546-
# Reset and try again, but convert the tokens to the legacy format.
547-
prev_token = ""
548-
found_event_ids = []
549-
for _ in range(20):
550-
from_token = ""
551-
if prev_token:
552-
from_token = "&from=" + self._stream_token_to_relation_token(prev_token)
553-
554-
channel = self.make_request(
555-
"GET",
556-
f"/_matrix/client/unstable/rooms/{self.room}"
557-
f"/aggregations/{self.parent_id}/{RelationTypes.ANNOTATION}"
558-
f"/m.reaction/{encoded_key}?limit=1{from_token}",
559-
access_token=self.user_token,
560-
)
561-
self.assertEqual(200, channel.code, channel.json_body)
562-
563-
self.assertEqual(len(channel.json_body["chunk"]), 1, channel.json_body)
564-
565-
found_event_ids.extend(e["event_id"] for e in channel.json_body["chunk"])
566-
567-
next_batch = channel.json_body.get("next_batch")
568-
569-
self.assertNotEqual(prev_token, next_batch)
570-
prev_token = next_batch
571-
572-
if not prev_token:
573-
break
574-
575-
# We paginated backwards, so reverse
576-
found_event_ids.reverse()
577-
self.assertEqual(found_event_ids, expected_event_ids)
578-
579508
def test_aggregation(self) -> None:
580509
"""Test that annotations get correctly aggregated."""
581510

0 commit comments

Comments
 (0)