mirror of
https://github.com/element-hq/synapse
synced 2024-10-02 08:02:41 +00:00
Grab prev_membership
to see whether the server left the room (fixes tests)
See https://github.com/element-hq/synapse/pull/17320#discussion_r1657170493 `prev_membership` helps determine whether we should include the `event_id=null` row because we can check whether we have already left. - When we leave the room causing the server to leave the room, the `prev_event_id` will be our join event - When the server leaves the room after us, the `prev_event_id` will be leave event - In the state reset case, `prev_event_id` will be our join event
This commit is contained in:
parent
956f20ef74
commit
830e09d2de
2 changed files with 9 additions and 18 deletions
|
@ -877,10 +877,12 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||
COALESCE(e.instance_name, s.instance_name),
|
||||
COALESCE(e.stream_ordering, s.stream_id),
|
||||
m.membership,
|
||||
e.sender
|
||||
e.sender,
|
||||
m_prev.membership AS prev_membership
|
||||
FROM current_state_delta_stream AS s
|
||||
LEFT JOIN events AS e ON e.event_id = s.event_id
|
||||
LEFT JOIN room_memberships AS m ON m.event_id = s.event_id
|
||||
LEFT JOIN room_memberships AS m_prev ON s.prev_event_id = m_prev.event_id
|
||||
WHERE s.stream_id > ? AND s.stream_id <= ?
|
||||
AND s.state_key = ?
|
||||
AND s.type = ?
|
||||
|
@ -890,7 +892,6 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||
txn.execute(sql, args)
|
||||
|
||||
membership_changes: List[CurrentStateDeltaMembership] = []
|
||||
membership_change_map: Dict[str, CurrentStateDeltaMembership] = {}
|
||||
for (
|
||||
event_id,
|
||||
prev_event_id,
|
||||
|
@ -899,6 +900,7 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||
stream_ordering,
|
||||
membership,
|
||||
sender,
|
||||
prev_membership,
|
||||
) in txn:
|
||||
assert room_id is not None
|
||||
assert instance_name is not None
|
||||
|
@ -918,16 +920,8 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||
# `event_id = null` row is a `leave` and we don't want duplicate
|
||||
# membership changes in our results, let's get rid of those
|
||||
# (deduplicate) (see `test_server_left_after_us_room`).
|
||||
if event_id is None:
|
||||
already_tracked_membership_change = membership_change_map.get(
|
||||
prev_event_id
|
||||
)
|
||||
if (
|
||||
already_tracked_membership_change is not None
|
||||
and already_tracked_membership_change.membership
|
||||
== Membership.LEAVE
|
||||
):
|
||||
continue
|
||||
if event_id is None and prev_membership == Membership.LEAVE:
|
||||
continue
|
||||
|
||||
membership_change = CurrentStateDeltaMembership(
|
||||
event_id=event_id,
|
||||
|
@ -944,8 +938,6 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||
)
|
||||
|
||||
membership_changes.append(membership_change)
|
||||
if event_id:
|
||||
membership_change_map[event_id] = membership_change
|
||||
|
||||
return membership_changes
|
||||
|
||||
|
|
|
@ -1019,7 +1019,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
|||
user2_tok = self.login(user2_id, "pass")
|
||||
|
||||
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
|
||||
self.helper.join(room_id1, user1_id, tok=user1_tok)
|
||||
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
|
||||
|
||||
before_reset_token = self.event_sources.get_current_token()
|
||||
|
||||
|
@ -1056,8 +1056,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
|||
"type": EventTypes.Member,
|
||||
"state_key": user1_id,
|
||||
"event_id": None,
|
||||
# FIXME: I'm not sure if a state reset should have a prev_event_id
|
||||
"prev_event_id": None,
|
||||
"prev_event_id": join_response1["event_id"],
|
||||
"instance_name": dummy_state_pos.instance_name,
|
||||
},
|
||||
desc="state reset user in current_state_delta_stream",
|
||||
|
@ -1088,7 +1087,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
|||
CurrentStateDeltaMembership(
|
||||
event_id=None,
|
||||
event_pos=dummy_state_pos,
|
||||
prev_event_id=None,
|
||||
prev_event_id=join_response1["event_id"],
|
||||
room_id=room_id1,
|
||||
membership="leave",
|
||||
sender=None, # user1_id,
|
||||
|
|
Loading…
Reference in a new issue