mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-09 15:13:12 -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
|
// handle newly joined rooms and non-joined rooms
|
||||||
for roomID, stateStreamEvents := range state {
|
for roomID, stateStreamEvents := range state {
|
||||||
for _, ev := range stateStreamEvents {
|
for _, ev := range stateStreamEvents {
|
||||||
|
|
@ -784,6 +785,7 @@ func (d *Database) GetStateDeltas(
|
||||||
}
|
}
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
membershipPositions[roomID] = ev.StreamPosition
|
||||||
state[roomID] = s
|
state[roomID] = s
|
||||||
continue // we'll add this room in when we do joined rooms
|
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
|
// Add in currently joined rooms
|
||||||
for _, joinedRoomID := range joinedRoomIDs {
|
for _, joinedRoomID := range joinedRoomIDs {
|
||||||
deltas = append(deltas, types.StateDelta{
|
deltas = append(deltas, types.StateDelta{
|
||||||
Membership: gomatrixserverlib.Join,
|
Membership: gomatrixserverlib.Join,
|
||||||
StateEvents: d.StreamEventsToEvents(device, state[joinedRoomID]),
|
MembershipPos: membershipPositions[joinedRoomID],
|
||||||
RoomID: 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.
|
// This is all "okay" assuming history_visibility == "shared" which it is by default.
|
||||||
r.To = delta.MembershipPos
|
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(
|
recentStreamEvents, limited, err := p.DB.RecentEvents(
|
||||||
ctx, delta.RoomID, r,
|
ctx, delta.RoomID, r,
|
||||||
eventFilter, true, true,
|
eventFilter, true, true,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue