Fetch more data for newly joined rooms in an incremental sync (#2657)

If we've joined a new room in an incremental sync, try fetching more data.
This deflakes the complement server notices test (at least in my tests).
This commit is contained in:
Till 2022-08-19 15:32:24 +02:00 committed by GitHub
parent 56b55a28f5
commit 9dc57122d9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 8 deletions

View file

@ -178,24 +178,24 @@ func (p *PDUStreamProvider) IncrementalSync(
var err error
var stateDeltas []types.StateDelta
var joinedRooms []string
var syncJoinedRooms []string
stateFilter := req.Filter.Room.State
eventFilter := req.Filter.Room.Timeline
if req.WantFullState {
if stateDeltas, joinedRooms, err = p.DB.GetStateDeltasForFullStateSync(ctx, req.Device, r, req.Device.UserID, &stateFilter); err != nil {
if stateDeltas, syncJoinedRooms, err = p.DB.GetStateDeltasForFullStateSync(ctx, req.Device, r, req.Device.UserID, &stateFilter); err != nil {
req.Log.WithError(err).Error("p.DB.GetStateDeltasForFullStateSync failed")
return
}
} else {
if stateDeltas, joinedRooms, err = p.DB.GetStateDeltas(ctx, req.Device, r, req.Device.UserID, &stateFilter); err != nil {
if stateDeltas, syncJoinedRooms, err = p.DB.GetStateDeltas(ctx, req.Device, r, req.Device.UserID, &stateFilter); err != nil {
req.Log.WithError(err).Error("p.DB.GetStateDeltas failed")
return
}
}
for _, roomID := range joinedRooms {
for _, roomID := range syncJoinedRooms {
req.Rooms[roomID] = gomatrixserverlib.Join
}
@ -222,6 +222,37 @@ func (p *PDUStreamProvider) IncrementalSync(
}
}
// If we joined a new room in this sync, make sure we add enough information about it.
// This does an "initial sync" for the newly joined rooms
newlyJoinedRooms := joinedRooms(req.Response, req.Device.UserID)
if len(newlyJoinedRooms) > 0 {
// remove already added rooms, as we're doing an "initial sync"
for _, x := range newlyJoinedRooms {
delete(req.Response.Rooms.Join, x)
}
r = types.Range{
From: to,
To: 0,
Backwards: true,
}
// We only care about the newly joined rooms, so update the stateFilter to reflect that
stateFilter.Rooms = &newlyJoinedRooms
if stateDeltas, _, err = p.DB.GetStateDeltas(ctx, req.Device, r, req.Device.UserID, &stateFilter); err != nil {
req.Log.WithError(err).Error("p.DB.GetStateDeltas failed")
return newPos
}
for _, delta := range stateDeltas {
// Ignore deltas for rooms we didn't newly join
if _, ok := req.Response.Rooms.Join[delta.RoomID]; ok {
continue
}
if _, err = p.addRoomDeltaToResponse(ctx, req.Device, r, delta, &eventFilter, &stateFilter, req.Response); err != nil {
req.Log.WithError(err).Error("d.addRoomDeltaToResponse failed")
return newPos
}
}
}
return newPos
}