mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-09 01:15:04 -04:00
Discard RDATA from already seen positions. (#7648)
This commit is contained in:
parent
bd6dc17221
commit
7d2532be36
6 changed files with 175 additions and 27 deletions
|
@ -16,10 +16,15 @@ from mock import Mock
|
|||
|
||||
from synapse.handlers.typing import RoomMember
|
||||
from synapse.replication.tcp.streams import TypingStream
|
||||
from synapse.util.caches.stream_change_cache import StreamChangeCache
|
||||
|
||||
from tests.replication._base import BaseStreamTestCase
|
||||
|
||||
USER_ID = "@feeling:blue"
|
||||
USER_ID_2 = "@da-ba-dee:blue"
|
||||
|
||||
ROOM_ID = "!bar:blue"
|
||||
ROOM_ID_2 = "!foo:blue"
|
||||
|
||||
|
||||
class TypingStreamTestCase(BaseStreamTestCase):
|
||||
|
@ -29,11 +34,9 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
def test_typing(self):
|
||||
typing = self.hs.get_typing_handler()
|
||||
|
||||
room_id = "!bar:blue"
|
||||
|
||||
self.reconnect()
|
||||
|
||||
typing._push_update(member=RoomMember(room_id, USER_ID), typing=True)
|
||||
typing._push_update(member=RoomMember(ROOM_ID, USER_ID), typing=True)
|
||||
|
||||
self.reactor.advance(0)
|
||||
|
||||
|
@ -46,7 +49,7 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0] # type: TypingStream.TypingStreamRow
|
||||
self.assertEqual(room_id, row.room_id)
|
||||
self.assertEqual(ROOM_ID, row.room_id)
|
||||
self.assertEqual([USER_ID], row.user_ids)
|
||||
|
||||
# Now let's disconnect and insert some data.
|
||||
|
@ -54,7 +57,7 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
|
||||
self.test_handler.on_rdata.reset_mock()
|
||||
|
||||
typing._push_update(member=RoomMember(room_id, USER_ID), typing=False)
|
||||
typing._push_update(member=RoomMember(ROOM_ID, USER_ID), typing=False)
|
||||
|
||||
self.test_handler.on_rdata.assert_not_called()
|
||||
|
||||
|
@ -73,5 +76,78 @@ class TypingStreamTestCase(BaseStreamTestCase):
|
|||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0]
|
||||
self.assertEqual(room_id, row.room_id)
|
||||
self.assertEqual(ROOM_ID, row.room_id)
|
||||
self.assertEqual([], row.user_ids)
|
||||
|
||||
def test_reset(self):
|
||||
"""
|
||||
Test what happens when a typing stream resets.
|
||||
|
||||
This is emulated by jumping the stream ahead, then reconnecting (which
|
||||
sends the proper position and RDATA).
|
||||
"""
|
||||
typing = self.hs.get_typing_handler()
|
||||
|
||||
self.reconnect()
|
||||
|
||||
typing._push_update(member=RoomMember(ROOM_ID, USER_ID), typing=True)
|
||||
|
||||
self.reactor.advance(0)
|
||||
|
||||
# We should now see an attempt to connect to the master
|
||||
request = self.handle_http_replication_attempt()
|
||||
self.assert_request_is_get_repl_stream_updates(request, "typing")
|
||||
|
||||
self.test_handler.on_rdata.assert_called_once()
|
||||
stream_name, _, token, rdata_rows = self.test_handler.on_rdata.call_args[0]
|
||||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0] # type: TypingStream.TypingStreamRow
|
||||
self.assertEqual(ROOM_ID, row.room_id)
|
||||
self.assertEqual([USER_ID], row.user_ids)
|
||||
|
||||
# Push the stream forward a bunch so it can be reset.
|
||||
for i in range(100):
|
||||
typing._push_update(
|
||||
member=RoomMember(ROOM_ID, "@test%s:blue" % i), typing=True
|
||||
)
|
||||
self.reactor.advance(0)
|
||||
|
||||
# Disconnect.
|
||||
self.disconnect()
|
||||
|
||||
# Reset the typing handler
|
||||
self.hs.get_replication_streams()["typing"].last_token = 0
|
||||
self.hs.get_tcp_replication()._streams["typing"].last_token = 0
|
||||
typing._latest_room_serial = 0
|
||||
typing._typing_stream_change_cache = StreamChangeCache(
|
||||
"TypingStreamChangeCache", typing._latest_room_serial
|
||||
)
|
||||
typing._reset()
|
||||
|
||||
# Reconnect.
|
||||
self.reconnect()
|
||||
self.pump(0.1)
|
||||
|
||||
# We should now see an attempt to connect to the master
|
||||
request = self.handle_http_replication_attempt()
|
||||
self.assert_request_is_get_repl_stream_updates(request, "typing")
|
||||
|
||||
# Reset the test code.
|
||||
self.test_handler.on_rdata.reset_mock()
|
||||
self.test_handler.on_rdata.assert_not_called()
|
||||
|
||||
# Push additional data.
|
||||
typing._push_update(member=RoomMember(ROOM_ID_2, USER_ID_2), typing=False)
|
||||
self.reactor.advance(0)
|
||||
|
||||
self.test_handler.on_rdata.assert_called_once()
|
||||
stream_name, _, token, rdata_rows = self.test_handler.on_rdata.call_args[0]
|
||||
self.assertEqual(stream_name, "typing")
|
||||
self.assertEqual(1, len(rdata_rows))
|
||||
row = rdata_rows[0]
|
||||
self.assertEqual(ROOM_ID_2, row.room_id)
|
||||
self.assertEqual([], row.user_ids)
|
||||
|
||||
# The token should have been reset.
|
||||
self.assertEqual(token, 1)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue