Skip to content

Commit

Permalink
Fix bug where typing replication breaks (#17252)
Browse files Browse the repository at this point in the history
This can happen on restarts of the service, due to old rooms being
pruned.
  • Loading branch information
erikjohnston authored May 31, 2024
1 parent 64f5a4a commit 5c2a837
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog.d/17252.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix bug where typing updates would not be sent when using workers after a restart.
6 changes: 3 additions & 3 deletions synapse/handlers/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,9 +477,9 @@ async def get_all_typing_updates(

rows = []
for room_id in changed_rooms:
serial = self._room_serials[room_id]
if last_id < serial <= current_id:
typing = self._room_typing[room_id]
serial = self._room_serials.get(room_id)
if serial and last_id < serial <= current_id:
typing = self._room_typing.get(room_id, set())
rows.append((serial, [room_id, list(typing)]))
rows.sort()

Expand Down
53 changes: 52 additions & 1 deletion tests/handlers/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
from synapse.api.constants import EduTypes
from synapse.api.errors import AuthError
from synapse.federation.transport.server import TransportLayerServer
from synapse.handlers.typing import TypingWriterHandler
from synapse.handlers.typing import FORGET_TIMEOUT, TypingWriterHandler
from synapse.http.federation.matrix_federation_agent import MatrixFederationAgent
from synapse.server import HomeServer
from synapse.types import JsonDict, Requester, StreamKeyType, UserID, create_requester
Expand Down Expand Up @@ -501,3 +501,54 @@ def test_typing_timeout(self) -> None:
}
],
)

def test_prune_typing_replication(self) -> None:
"""Regression test for `get_all_typing_updates` breaking when we prune
old updates
"""
self.room_members = [U_APPLE, U_BANANA]

instance_name = self.hs.get_instance_name()

self.get_success(
self.handler.started_typing(
target_user=U_APPLE,
requester=create_requester(U_APPLE),
room_id=ROOM_ID,
timeout=10000,
)
)

rows, _, _ = self.get_success(
self.handler.get_all_typing_updates(
instance_name=instance_name,
last_id=0,
current_id=self.handler.get_current_token(),
limit=100,
)
)
self.assertEqual(rows, [(1, [ROOM_ID, [U_APPLE.to_string()]])])

self.reactor.advance(20000)

rows, _, _ = self.get_success(
self.handler.get_all_typing_updates(
instance_name=instance_name,
last_id=1,
current_id=self.handler.get_current_token(),
limit=100,
)
)
self.assertEqual(rows, [(2, [ROOM_ID, []])])

self.reactor.advance(FORGET_TIMEOUT)

rows, _, _ = self.get_success(
self.handler.get_all_typing_updates(
instance_name=instance_name,
last_id=1,
current_id=self.handler.get_current_token(),
limit=100,
)
)
self.assertEqual(rows, [])

0 comments on commit 5c2a837

Please sign in to comment.