Skip to content

Commit 4fc1ce7

Browse files
committed
Add logging when sync tokens unexpectedly go backwards
1 parent 4c6e78f commit 4fc1ce7

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

synapse/rest/client/sync.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
4646
from synapse.http.site import SynapseRequest
4747
from synapse.logging.opentracing import trace_with_opname
48-
from synapse.types import JsonDict, Requester, StreamToken
48+
from synapse.types import JsonDict, Requester, RoomStreamToken, StreamToken
4949
from synapse.util import json_decoder
5050

5151
from ._base import client_patterns, set_timeline_upper_limit
@@ -238,9 +238,52 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
238238
time_now, sync_result, requester, filter_collection
239239
)
240240

241+
if (
242+
since_token is not None
243+
and sync_result.next_batch is not None
244+
and self._sync_token_went_backwards(
245+
since_token.room_key, sync_result.next_batch.room_key
246+
)
247+
):
248+
since_str = await since_token.to_string(self.store)
249+
next_str = await sync_result.next_batch.to_string(self.store)
250+
logger.warning(
251+
"sync token went backwards! from %s to %s", since_str, next_str
252+
)
253+
241254
logger.debug("Event formatting complete")
242255
return 200, response_content
243256

257+
def _sync_token_went_backwards(
258+
self, since: RoomStreamToken, next: RoomStreamToken
259+
) -> bool:
260+
"""
261+
Returns true if and only if the given token went backwards.
262+
"""
263+
if next.stream < since.stream:
264+
return True
265+
266+
if since.instance_map:
267+
for instance, pos in since.instance_map.items():
268+
if (
269+
next.instance_map
270+
and next.instance_map.get(instance, next.stream) < pos
271+
):
272+
return True
273+
elif next.stream < pos:
274+
return True
275+
276+
if next.instance_map:
277+
for instance, pos in next.instance_map.items():
278+
if since.instance_map and pos < since.instance_map.get(
279+
instance, since.stream
280+
):
281+
return True
282+
elif pos < since.stream:
283+
return True
284+
285+
return False
286+
244287
@trace_with_opname("sync.encode_response")
245288
async def encode_response(
246289
self,

0 commit comments

Comments
 (0)