mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-09 07:03:10 -06:00
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:
parent
962b76da44
commit
9539de714f
|
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue