From 9539de714f4bf92e21214e5d0a11d1a3bbc7385c Mon Sep 17 00:00:00 2001 From: texuf Date: Mon, 25 Jul 2022 09:53:32 -0700 Subject: [PATCH] Fix: Correctly handle joining room not previously synced MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mostly making this PR to see if I can flush out the intended behavior. Seems like the intended method would be to first `peek` the room, but peek is currently unimplemented in dendrite. What do you guys think? Test Plan: register new account bob bob creates public, shared history room bob sends a “hello world” message to the room register new account jane jane joins bobs room via room id ISSUE: Jane only sees her new membership event, doesn’t sync the name of the room, or bobs “hello world” message NOTE: this happens any time jane syncs something after bob sends "hello world" then joins the room. All that's needed is a more recent FROM offset for Jane to miss important information about the room FIX If a join event happened during a current sync delta, reset the to parameter to sync the entire room to Jane Signed-off-by: `Austin Ellis ` --- syncapi/storage/shared/syncserver.go | 9 ++++++--- syncapi/streams/stream_pdu.go | 5 +++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/syncapi/storage/shared/syncserver.go b/syncapi/storage/shared/syncserver.go index 932bda164..cb9789bb8 100644 --- a/syncapi/storage/shared/syncserver.go +++ b/syncapi/storage/shared/syncserver.go @@ -765,6 +765,7 @@ func (d *Database) GetStateDeltas( } } + var membershipPositions = make(map[string]types.StreamPosition) // handle newly joined rooms and non-joined rooms for roomID, stateStreamEvents := range state { for _, ev := range stateStreamEvents { @@ -784,6 +785,7 @@ func (d *Database) GetStateDeltas( } return nil, nil, err } + membershipPositions[roomID] = ev.StreamPosition state[roomID] = s continue // we'll add this room in when we do joined rooms } @@ -802,9 +804,10 @@ func (d *Database) GetStateDeltas( // Add in currently joined rooms for _, joinedRoomID := range joinedRoomIDs { deltas = append(deltas, types.StateDelta{ - Membership: gomatrixserverlib.Join, - StateEvents: d.StreamEventsToEvents(device, state[joinedRoomID]), - RoomID: joinedRoomID, + Membership: gomatrixserverlib.Join, + MembershipPos: membershipPositions[joinedRoomID], + StateEvents: d.StreamEventsToEvents(device, state[joinedRoomID]), + RoomID: joinedRoomID, }) } diff --git a/syncapi/streams/stream_pdu.go b/syncapi/streams/stream_pdu.go index 00b3dfe3b..2d193f4f2 100644 --- a/syncapi/streams/stream_pdu.go +++ b/syncapi/streams/stream_pdu.go @@ -229,6 +229,11 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse( // This is all "okay" assuming history_visibility == "shared" which it is by default. r.To = delta.MembershipPos } + // if we joined in between sync calls, send reset From to simulate a complete sync + if delta.Membership == gomatrixserverlib.Join && delta.MembershipPos <= r.To && delta.MembershipPos > r.From { + r.From = 0 + } + recentStreamEvents, limited, err := p.DB.RecentEvents( ctx, delta.RoomID, r, eventFilter, true, true,