Optimise CheckServerAllowedToSeeEvent (#1602)
* Try to limit how many state events we have to unmarshal * Commentsmain
parent
d5b8260196
commit
b4c3692dcc
|
@ -5,6 +5,7 @@ import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/roomserver/api"
|
"github.com/matrix-org/dendrite/roomserver/api"
|
||||||
"github.com/matrix-org/dendrite/roomserver/auth"
|
"github.com/matrix-org/dendrite/roomserver/auth"
|
||||||
|
@ -222,12 +223,45 @@ func CheckServerAllowedToSeeEvent(
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
return false, err
|
return false, fmt.Errorf("roomState.LoadStateAtEvent: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We probably want to make it so that we don't have to pull
|
// Extract all of the event state key NIDs from the room state.
|
||||||
// out all the state if possible.
|
var stateKeyNIDs []types.EventStateKeyNID
|
||||||
stateAtEvent, err := LoadStateEvents(ctx, db, stateEntries)
|
for _, entry := range stateEntries {
|
||||||
|
stateKeyNIDs = append(stateKeyNIDs, entry.EventStateKeyNID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then request those state key NIDs from the database.
|
||||||
|
stateKeys, err := db.EventStateKeys(ctx, stateKeyNIDs)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("db.EventStateKeys: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the event state key doesn't match the given servername
|
||||||
|
// then we'll filter it out. This does preserve state keys that
|
||||||
|
// are "" since these will contain history visibility etc.
|
||||||
|
for nid, key := range stateKeys {
|
||||||
|
if key != "" && !strings.HasSuffix(key, ":"+string(serverName)) {
|
||||||
|
delete(stateKeys, nid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now filter through all of the state events for the room.
|
||||||
|
// If the state key NID appears in the list of valid state
|
||||||
|
// keys then we'll add it to the list of filtered entries.
|
||||||
|
var filteredEntries []types.StateEntry
|
||||||
|
for _, entry := range stateEntries {
|
||||||
|
if _, ok := stateKeys[entry.EventStateKeyNID]; ok {
|
||||||
|
filteredEntries = append(filteredEntries, entry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(filteredEntries) == 0 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
stateAtEvent, err := LoadStateEvents(ctx, db, filteredEntries)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue