Fix bug where typing replication breaks (#17252)

This can happen on restarts of the service, due to old rooms being
pruned.
This commit is contained in:
Erik Johnston 2024-05-31 16:07:05 +01:00 committed by GitHub
parent 64f5a4a353
commit 5c2a837e3c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 56 additions and 4 deletions

1
changelog.d/17252.bugfix Normal file
View File

@ -0,0 +1 @@
Fix bug where typing updates would not be sent when using workers after a restart.

View File

@ -477,9 +477,9 @@ class TypingWriterHandler(FollowerTypingHandler):
rows = [] rows = []
for room_id in changed_rooms: for room_id in changed_rooms:
serial = self._room_serials[room_id] serial = self._room_serials.get(room_id)
if last_id < serial <= current_id: if serial and last_id < serial <= current_id:
typing = self._room_typing[room_id] typing = self._room_typing.get(room_id, set())
rows.append((serial, [room_id, list(typing)])) rows.append((serial, [room_id, list(typing)]))
rows.sort() rows.sort()

View File

@ -32,7 +32,7 @@ from twisted.web.resource import Resource
from synapse.api.constants import EduTypes from synapse.api.constants import EduTypes
from synapse.api.errors import AuthError from synapse.api.errors import AuthError
from synapse.federation.transport.server import TransportLayerServer 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.http.federation.matrix_federation_agent import MatrixFederationAgent
from synapse.server import HomeServer from synapse.server import HomeServer
from synapse.types import JsonDict, Requester, StreamKeyType, UserID, create_requester from synapse.types import JsonDict, Requester, StreamKeyType, UserID, create_requester
@ -501,3 +501,54 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
} }
], ],
) )
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, [])