mirror of
https://github.com/element-hq/dendrite.git
synced 2025-09-13 21:02:25 +03:00
Fix ordering issues in requesting backfill
Using a map means the orders are processed in an indeterminate order, which causes a lot of `/state_ids` requests as the `prev_events` are not known when the order is lost. Also topologically sort results from multiple servers when doing a `RequestBackfill` just to be safe, since otherwise results retrieved from multiple servers could end up out-of-order too. Signed-off-by: Neil Alexander <git@neilalexander.dev>
This commit is contained in:
parent
c15dee80f2
commit
2583ff05f7
1 changed files with 7 additions and 7 deletions
|
@ -128,9 +128,9 @@ func (r *Backfiller) backfillViaFederation(ctx context.Context, req *api.Perform
|
||||||
logrus.WithError(err).WithField("room_id", req.RoomID).Infof("backfilled %d events", len(events))
|
logrus.WithError(err).WithField("room_id", req.RoomID).Infof("backfilled %d events", len(events))
|
||||||
|
|
||||||
// persist these new events - auth checks have already been done
|
// persist these new events - auth checks have already been done
|
||||||
roomNID, backfilledEventMap := persistEvents(ctx, r.DB, r.Querier, events)
|
roomNID, storedEvents := persistEvents(ctx, r.DB, r.Querier, events)
|
||||||
|
|
||||||
for _, ev := range backfilledEventMap {
|
for _, ev := range storedEvents {
|
||||||
// now add state for these events
|
// now add state for these events
|
||||||
stateIDs, ok := requester.eventIDToBeforeStateIDs[ev.EventID()]
|
stateIDs, ok := requester.eventIDToBeforeStateIDs[ev.EventID()]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -591,10 +591,10 @@ func joinEventsFromHistoryVisibility(
|
||||||
return evs, visibility, err
|
return evs, visibility, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func persistEvents(ctx context.Context, db storage.Database, querier api.QuerySenderIDAPI, events []gomatrixserverlib.PDU) (types.RoomNID, map[string]types.Event) {
|
func persistEvents(ctx context.Context, db storage.Database, querier api.QuerySenderIDAPI, events []gomatrixserverlib.PDU) (types.RoomNID, []types.Event) {
|
||||||
var roomNID types.RoomNID
|
var roomNID types.RoomNID
|
||||||
var eventNID types.EventNID
|
var eventNID types.EventNID
|
||||||
backfilledEventMap := make(map[string]types.Event)
|
storedEvents := make([]types.Event, 0, len(events))
|
||||||
for j, ev := range events {
|
for j, ev := range events {
|
||||||
nidMap, err := db.EventNIDs(ctx, ev.AuthEventIDs())
|
nidMap, err := db.EventNIDs(ctx, ev.AuthEventIDs())
|
||||||
if err != nil { // this shouldn't happen as RequestBackfill already found them
|
if err != nil { // this shouldn't happen as RequestBackfill already found them
|
||||||
|
@ -647,10 +647,10 @@ func persistEvents(ctx context.Context, db storage.Database, querier api.QuerySe
|
||||||
ev = redactedEvent
|
ev = redactedEvent
|
||||||
events[j] = ev
|
events[j] = ev
|
||||||
}
|
}
|
||||||
backfilledEventMap[ev.EventID()] = types.Event{
|
storedEvents = append(storedEvents, types.Event{
|
||||||
EventNID: eventNID,
|
EventNID: eventNID,
|
||||||
PDU: ev,
|
PDU: ev,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
return roomNID, backfilledEventMap
|
return roomNID, storedEvents
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue