mirror of
https://github.com/element-hq/synapse
synced 2024-07-04 08:43:29 +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
|
@ -877,10 +877,12 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
||||||
COALESCE(e.instance_name, s.instance_name),
|
COALESCE(e.instance_name, s.instance_name),
|
||||||
COALESCE(e.stream_ordering, s.stream_id),
|
COALESCE(e.stream_ordering, s.stream_id),
|
||||||
m.membership,
|
m.membership,
|
||||||
e.sender
|
e.sender,
|
||||||
|
m_prev.membership AS prev_membership
|
||||||
FROM current_state_delta_stream AS s
|
FROM current_state_delta_stream AS s
|
||||||
LEFT JOIN events AS e ON e.event_id = s.event_id
|
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 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 <= ?
|
WHERE s.stream_id > ? AND s.stream_id <= ?
|
||||||
AND s.state_key = ?
|
AND s.state_key = ?
|
||||||
AND s.type = ?
|
AND s.type = ?
|
||||||
|
@ -890,7 +892,6 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
||||||
txn.execute(sql, args)
|
txn.execute(sql, args)
|
||||||
|
|
||||||
membership_changes: List[CurrentStateDeltaMembership] = []
|
membership_changes: List[CurrentStateDeltaMembership] = []
|
||||||
membership_change_map: Dict[str, CurrentStateDeltaMembership] = {}
|
|
||||||
for (
|
for (
|
||||||
event_id,
|
event_id,
|
||||||
prev_event_id,
|
prev_event_id,
|
||||||
|
@ -899,6 +900,7 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
||||||
stream_ordering,
|
stream_ordering,
|
||||||
membership,
|
membership,
|
||||||
sender,
|
sender,
|
||||||
|
prev_membership,
|
||||||
) in txn:
|
) in txn:
|
||||||
assert room_id is not None
|
assert room_id is not None
|
||||||
assert instance_name 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
|
# `event_id = null` row is a `leave` and we don't want duplicate
|
||||||
# membership changes in our results, let's get rid of those
|
# membership changes in our results, let's get rid of those
|
||||||
# (deduplicate) (see `test_server_left_after_us_room`).
|
# (deduplicate) (see `test_server_left_after_us_room`).
|
||||||
if event_id is None:
|
if event_id is None and prev_membership == Membership.LEAVE:
|
||||||
already_tracked_membership_change = membership_change_map.get(
|
continue
|
||||||
prev_event_id
|
|
||||||
)
|
|
||||||
if (
|
|
||||||
already_tracked_membership_change is not None
|
|
||||||
and already_tracked_membership_change.membership
|
|
||||||
== Membership.LEAVE
|
|
||||||
):
|
|
||||||
continue
|
|
||||||
|
|
||||||
membership_change = CurrentStateDeltaMembership(
|
membership_change = CurrentStateDeltaMembership(
|
||||||
event_id=event_id,
|
event_id=event_id,
|
||||||
|
@ -944,8 +938,6 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
||||||
)
|
)
|
||||||
|
|
||||||
membership_changes.append(membership_change)
|
membership_changes.append(membership_change)
|
||||||
if event_id:
|
|
||||||
membership_change_map[event_id] = membership_change
|
|
||||||
|
|
||||||
return membership_changes
|
return membership_changes
|
||||||
|
|
||||||
|
|
|
@ -1019,7 +1019,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
||||||
user2_tok = self.login(user2_id, "pass")
|
user2_tok = self.login(user2_id, "pass")
|
||||||
|
|
||||||
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
|
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()
|
before_reset_token = self.event_sources.get_current_token()
|
||||||
|
|
||||||
|
@ -1056,8 +1056,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
||||||
"type": EventTypes.Member,
|
"type": EventTypes.Member,
|
||||||
"state_key": user1_id,
|
"state_key": user1_id,
|
||||||
"event_id": None,
|
"event_id": None,
|
||||||
# FIXME: I'm not sure if a state reset should have a prev_event_id
|
"prev_event_id": join_response1["event_id"],
|
||||||
"prev_event_id": None,
|
|
||||||
"instance_name": dummy_state_pos.instance_name,
|
"instance_name": dummy_state_pos.instance_name,
|
||||||
},
|
},
|
||||||
desc="state reset user in current_state_delta_stream",
|
desc="state reset user in current_state_delta_stream",
|
||||||
|
@ -1088,7 +1087,7 @@ class GetCurrentStateDeltaMembershipChangesForUserTestCase(HomeserverTestCase):
|
||||||
CurrentStateDeltaMembership(
|
CurrentStateDeltaMembership(
|
||||||
event_id=None,
|
event_id=None,
|
||||||
event_pos=dummy_state_pos,
|
event_pos=dummy_state_pos,
|
||||||
prev_event_id=None,
|
prev_event_id=join_response1["event_id"],
|
||||||
room_id=room_id1,
|
room_id=room_id1,
|
||||||
membership="leave",
|
membership="leave",
|
||||||
sender=None, # user1_id,
|
sender=None, # user1_id,
|
||||||
|
|
Loading…
Reference in a new issue