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.
This commit is contained in:
Jason Robinson
2026-07-06 15:08:10 +03:00
parent 425aa00a9b
commit b571fcef4e
2 changed files with 50 additions and 7 deletions
+3 -3
View File
@@ -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
+47 -4
View File
@@ -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",