mirror of
https://mau.dev/maunium/synapse.git
synced 2024-11-16 06:51:46 +01:00
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:
parent
64f5a4a353
commit
5c2a837e3c
3 changed files with 56 additions and 4 deletions
1
changelog.d/17252.bugfix
Normal file
1
changelog.d/17252.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix bug where typing updates would not be sent when using workers after a restart.
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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, [])
|
||||||
|
|
Loading…
Reference in a new issue