Skip to content

Commit

Permalink
Always return OTK counts (#17275)
Browse files Browse the repository at this point in the history
Broke in #17215
  • Loading branch information
erikjohnston committed Jun 6, 2024
1 parent fcbc79b commit 3f06bbc
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog.d/17275.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix bug where OTKs were not always included in `/sync` response when using workers.
33 changes: 29 additions & 4 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,11 @@ def __bool__(self) -> bool:
)

@staticmethod
def empty(next_batch: StreamToken) -> "SyncResult":
def empty(
next_batch: StreamToken,
device_one_time_keys_count: JsonMapping,
device_unused_fallback_key_types: List[str],
) -> "SyncResult":
"Return a new empty result"
return SyncResult(
next_batch=next_batch,
Expand All @@ -297,8 +301,8 @@ def empty(next_batch: StreamToken) -> "SyncResult":
archived=[],
to_device=[],
device_lists=DeviceListUpdates(),
device_one_time_keys_count={},
device_unused_fallback_key_types=[],
device_one_time_keys_count=device_one_time_keys_count,
device_unused_fallback_key_types=device_unused_fallback_key_types,
)


Expand Down Expand Up @@ -523,7 +527,28 @@ async def _wait_for_sync_for_user(
logger.warning(
"Timed out waiting for worker to catch up. Returning empty response"
)
return SyncResult.empty(since_token)
device_id = sync_config.device_id
one_time_keys_count: JsonMapping = {}
unused_fallback_key_types: List[str] = []
if device_id:
user_id = sync_config.user.to_string()
# TODO: We should have a way to let clients differentiate between the states of:
# * no change in OTK count since the provided since token
# * the server has zero OTKs left for this device
# Spec issue: https://github.com/matrix-org/matrix-doc/issues/3298
one_time_keys_count = await self.store.count_e2e_one_time_keys(
user_id, device_id
)
unused_fallback_key_types = list(
await self.store.get_e2e_unused_fallback_key_types(
user_id, device_id
)
)

cache_context.should_cache = False # Don't cache empty responses
return SyncResult.empty(
since_token, one_time_keys_count, unused_fallback_key_types
)

# If we've spent significant time waiting to catch up, take it off
# the timeout.
Expand Down

0 comments on commit 3f06bbc

Please sign in to comment.