From 3f3c6494922dff0c426c787cfc21bd43c0902a77 Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Fri, 24 Jul 2026 15:08:23 +0300 Subject: [PATCH] Fix field tracking never re-sending fields --- synapse/handlers/sliding_sync/extensions.py | 9 ++++--- .../sliding_sync/test_extension_profiles.py | 25 ++++++++++++++++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/synapse/handlers/sliding_sync/extensions.py b/synapse/handlers/sliding_sync/extensions.py index 26852eef26..516a54a19c 100644 --- a/synapse/handlers/sliding_sync/extensions.py +++ b/synapse/handlers/sliding_sync/extensions.py @@ -1264,19 +1264,20 @@ class SlidingSyncExtensionHandler: # We don't use a cache here as for non-lazy sync we always # send changes and/or fields the client asked for, if relevant # as above joined condition. + updated_fields: set[str] = updated_user_fields.get( + profile_user_id, set() + ) user_fields = ( user_fields if profile_user_id in joined_room_user_ids - else set(updated_user_fields.get(profile_user_id, [])).intersection( - profile_data.keys() - ) + else updated_fields.intersection(profile_data.keys()) ) for field_name in user_fields: # Ensure we don't send the field unnecessarely to the client, if # we've sent it down in this connection before, and it hasn't been # updated. if ( - field_name in updated_user_fields.keys() + field_name in updated_fields or previous_connection_state.profile_updates.have_sent_field( profile_user_id, field_name ).status diff --git a/tests/rest/client/sliding_sync/test_extension_profiles.py b/tests/rest/client/sliding_sync/test_extension_profiles.py index 63b08d7896..58871dfb3b 100644 --- a/tests/rest/client/sliding_sync/test_extension_profiles.py +++ b/tests/rest/client/sliding_sync/test_extension_profiles.py @@ -644,12 +644,35 @@ class SlidingSyncProfilesTestCase(SlidingSyncBase): } # Make an incremental Sliding Sync request - response_body, _ = self.do_sync(sync_body, since=from_token, tok=self.tok) + response_body, from_token = self.do_sync( + sync_body, since=from_token, tok=self.tok + ) # We should not get other user re-sent self.assertIsNone( response_body["extensions"].get("org.matrix.msc4262.profiles"), ) + # Set a new field value and ensure our tracking doesn't swallow updates + self.get_success( + self.profile_handler.set_field( + target_user=UserID.from_string(self.other_user), + requester=create_requester(self.other_user), + field_name="displayname", + new_value="new displayname", + ) + ) + response_body, _ = self.do_sync(sync_body, since=from_token, tok=self.tok) + self.assertEqual( + response_body["extensions"]["org.matrix.msc4262.profiles"]["users"][ + "@other_user:test" + ], + { + "updated": { + "displayname": "new displayname", + }, + }, + ) + @override_config({"include_profile_updates_in_sync": True}) def test_removed_fields_get_sent_down_as_removed(self) -> None: """