Fix: Correctly handle joining room not previously synced

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 <austin@hntlabs.com>`
This commit is contained in:
texuf 2022-07-25 09:53:32 -07:00
parent 962b76da44
commit 9539de714f
2 changed files with 11 additions and 3 deletions

View file

@ -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,
})
}

View file

@ -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,