Disable aggregation bundling on /sync responses (#11583)

* Disable aggregation bundling on `/sync` responses

A partial revert of #11478. This turns out to have had a significant CPU impact
on initial-sync handling. For now, let's disable it, until we find a more
efficient way of achieving this.

* Fix tests.

Co-authored-by: Patrick Cloke <patrickc@matrix.org>
This commit is contained in:
Richard van der Hoff 2021-12-20 16:33:35 +00:00 committed by GitHub
parent 92906e1b60
commit 76aa5537ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 6 deletions

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

@ -0,0 +1 @@
Fix a performance regression in `/sync` handling, introduced in 1.49.0.

View File

@ -522,7 +522,15 @@ class SyncRestServlet(RestServlet):
time_now=time_now, time_now=time_now,
# Don't bother to bundle aggregations if the timeline is unlimited, # Don't bother to bundle aggregations if the timeline is unlimited,
# as clients will have all the necessary information. # as clients will have all the necessary information.
bundle_aggregations=room.timeline.limited, # bundle_aggregations=room.timeline.limited,
#
# richvdh 2021-12-15: disable this temporarily as it has too high an
# overhead for initialsyncs. We need to figure out a way that the
# bundling can be done *before* the events are stored in the
# SyncResponseCache so that this part can be synchronous.
#
# Ensure to re-enable the test at tests/rest/client/test_relations.py::RelationsTestCase.test_bundled_aggregations.
bundle_aggregations=False,
token_id=token_id, token_id=token_id,
event_format=event_formatter, event_format=event_formatter,
only_event_fields=only_fields, only_event_fields=only_fields,

View File

@ -574,11 +574,11 @@ class RelationsTestCase(unittest.HomeserverTestCase):
assert_bundle(channel.json_body["event"]["unsigned"].get("m.relations")) assert_bundle(channel.json_body["event"]["unsigned"].get("m.relations"))
# Request sync. # Request sync.
channel = self.make_request("GET", "/sync", access_token=self.user_token) # channel = self.make_request("GET", "/sync", access_token=self.user_token)
self.assertEquals(200, channel.code, channel.json_body) # self.assertEquals(200, channel.code, channel.json_body)
room_timeline = channel.json_body["rooms"]["join"][self.room]["timeline"] # room_timeline = channel.json_body["rooms"]["join"][self.room]["timeline"]
self.assertTrue(room_timeline["limited"]) # self.assertTrue(room_timeline["limited"])
_find_and_assert_event(room_timeline["events"]) # _find_and_assert_event(room_timeline["events"])
# Note that /relations is tested separately in test_aggregation_get_event_for_thread # Note that /relations is tested separately in test_aggregation_get_event_for_thread
# since it needs different data configured. # since it needs different data configured.