Remove recursion from loadAuthEvents

This commit is contained in:
Neil Alexander 2022-06-01 09:30:05 +01:00
parent 992d324c10
commit 507616b77a
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -981,35 +981,38 @@ func (v *StateResolution) loadAuthEvents(
ctx context.Context, event *gomatrixserverlib.Event, ctx context.Context, event *gomatrixserverlib.Event,
) ([]*gomatrixserverlib.Event, map[string]types.StateEntry, error) { ) ([]*gomatrixserverlib.Event, map[string]types.StateEntry, error) {
eventMap := map[string]struct{}{} eventMap := map[string]struct{}{}
var getEvents func(eventIDs []string) ([]types.Event, error) var lookup []string
getEvents = func(eventIDs []string) ([]types.Event, error) { var authEvents []types.Event
lookup := make([]string, 0, len(event.AuthEventIDs())) queue := event.AuthEventIDs()
for _, eventID := range eventIDs { for i := 0; i < len(queue); i++ {
if _, ok := eventMap[eventID]; ok { lookup = lookup[:0]
for _, authEventID := range queue {
if _, ok := eventMap[authEventID]; ok {
continue continue
} }
lookup = append(lookup, eventID) lookup = append(lookup, authEventID)
} }
if len(lookup) == 0 { if len(lookup) == 0 {
return nil, nil break
} }
events, err := v.db.EventsFromIDs(ctx, lookup) events, err := v.db.EventsFromIDs(ctx, lookup)
if err != nil { if err != nil {
return nil, fmt.Errorf("v.db.EventsFromIDs: %w", err) return nil, nil, fmt.Errorf("v.db.EventsFromIDs: %w", err)
} }
add := map[string]struct{}{}
for _, event := range events { for _, event := range events {
eventMap[event.EventID()] = struct{}{} eventMap[event.EventID()] = struct{}{}
next, err := getEvents(event.AuthEventIDs()) authEvents = append(authEvents, event)
if err != nil { for _, authEventID := range event.AuthEventIDs() {
return nil, err if _, ok := eventMap[authEventID]; ok {
continue
}
add[authEventID] = struct{}{}
}
for authEventID := range add {
queue = append(queue, authEventID)
} }
events = append(events, next...)
} }
return events, nil
}
authEvents, err := getEvents(event.AuthEventIDs())
if err != nil {
return nil, nil, fmt.Errorf("getEvents: %w", err)
} }
authEventTypes := map[string]struct{}{} authEventTypes := map[string]struct{}{}
authEventStateKeys := map[string]struct{}{} authEventStateKeys := map[string]struct{}{}