From b571fcef4e24688df634e781a8f5015406d522f8 Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Mon, 6 Jul 2026 15:08:10 +0300 Subject: [PATCH] Clear all old ProfileUpdate rows from `profile_updates_per_user` on a leave Regardless of action. This is cleaner and also ensures a join/leave/join/leave case might not get confused. --- synapse/storage/databases/main/profile.py | 6 +-- tests/handlers/test_profile.py | 51 +++++++++++++++++++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/synapse/storage/databases/main/profile.py b/synapse/storage/databases/main/profile.py index 173381e5fe..59e00bf36d 100644 --- a/synapse/storage/databases/main/profile.py +++ b/synapse/storage/databases/main/profile.py @@ -958,7 +958,7 @@ class ProfileWorkerStore(SQLBaseStore): self, user_id: UserID, users_to_remove: set[str] ) -> None: """ - Clear all the ProfileUpdateAction.UPDATE rows from the + Clear all the ProfileUpdateAction rows from the `profile_updates_per_user` table from a particular user for a list of target users. @@ -983,10 +983,10 @@ class ProfileWorkerStore(SQLBaseStore): ) -> None: sql = """ SELECT stream_id FROM profile_updates - WHERE user_id = ? AND action = ? + WHERE user_id = ? """ - txn.execute(sql, (user_id.to_string(), ProfileUpdateAction.UPDATE.value)) + txn.execute(sql, (user_id.to_string(),)) res = txn.fetchall() if not res: return diff --git a/tests/handlers/test_profile.py b/tests/handlers/test_profile.py index 0bf940d24b..f077ce12e7 100644 --- a/tests/handlers/test_profile.py +++ b/tests/handlers/test_profile.py @@ -439,6 +439,8 @@ class ProfileTestCase(unittest.HomeserverTestCase): roger_token = self.login("roger", "password") self.register_user("millie", "password") millie_token = self.login("millie", "password") + self.register_user("gracie", "password") + gracie_token = self.login("gracie", "password") room_id = self.helper.create_room_as( room_creator=self.frank.to_string(), tok=self.frank_token, @@ -449,6 +451,7 @@ class ProfileTestCase(unittest.HomeserverTestCase): ) self.helper.join(room_id, "@roger:test", tok=roger_token) self.helper.join(room_with_millie_id, "@millie:test", tok=millie_token) + self.helper.join(room_id, "@gracie:test", tok=gracie_token) self.get_success( self.handler.set_field( target_user=self.frank, @@ -470,6 +473,12 @@ class ProfileTestCase(unittest.HomeserverTestCase): [ ProfileUpdate( stream_id=4, + user_id="@gracie:test", + action="joined_room", + field_name=None, + ), + ProfileUpdate( + stream_id=5, user_id=self.frank.to_string(), action="update", field_name="m.status", @@ -488,7 +497,7 @@ class ProfileTestCase(unittest.HomeserverTestCase): per_user_updates, [ ProfileUpdate( - stream_id=4, + stream_id=5, user_id=self.frank.to_string(), action="update", field_name="m.status", @@ -496,7 +505,8 @@ class ProfileTestCase(unittest.HomeserverTestCase): ], ) - # Leave room and verify only the "left room" exists for roger + # Make frank leave room and verify only the "left room" + gracies join exists + # for roger self.helper.leave(room_id, self.frank.to_string(), tok=self.frank_token) per_user_updates = self.get_success( self.store.get_profile_updates_for_user_and_fields( @@ -510,13 +520,46 @@ class ProfileTestCase(unittest.HomeserverTestCase): per_user_updates, [ ProfileUpdate( - stream_id=5, + stream_id=4, + user_id="@gracie:test", + action="joined_room", + field_name=None, + ), + ProfileUpdate( + stream_id=6, user_id=self.frank.to_string(), action="left_room", field_name=None, ), ], ) + # Make gracie leave room and verify only the "left room"'s + self.helper.leave(room_id, "@gracie:test", tok=gracie_token) + per_user_updates = self.get_success( + self.store.get_profile_updates_for_user_and_fields( + from_id=0, + to_id=10, + user_id="@roger:test", + field_names={"m.status"}, + ) + ) + self.assertEqual( + per_user_updates, + [ + ProfileUpdate( + stream_id=6, + user_id=self.frank.to_string(), + action="left_room", + field_name=None, + ), + ProfileUpdate( + stream_id=7, + user_id="@gracie:test", + action="left_room", + field_name=None, + ), + ], + ) # Sanity check we didn't clear any rows for millie per_user_updates = self.get_success( @@ -531,7 +574,7 @@ class ProfileTestCase(unittest.HomeserverTestCase): per_user_updates, [ ProfileUpdate( - stream_id=4, + stream_id=5, user_id=self.frank.to_string(), action="update", field_name="m.status",