aboutsummaryrefslogtreecommitdiff
path: root/syncapi/storage/postgres
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-03-11 12:48:45 +0000
committerGitHub <noreply@github.com>2022-03-11 12:48:45 +0000
commit507a8e67739c2cfd89f5be48fdf96bdb0d1698d5 (patch)
tree773105022c8510931403d118e8f4c843573d7079 /syncapi/storage/postgres
parente485f9c2bd15bca397229444399fa7e168eca43d (diff)
Don't range entire state for `/sync` (#2270)
* Don't range entire state for rooms the user has no reason to care about * Remove unnecessary db field in postgresql
Diffstat (limited to 'syncapi/storage/postgres')
-rw-r--r--syncapi/storage/postgres/current_room_state_table.go48
-rw-r--r--syncapi/storage/postgres/output_room_events_table.go17
2 files changed, 49 insertions, 16 deletions
diff --git a/syncapi/storage/postgres/current_room_state_table.go b/syncapi/storage/postgres/current_room_state_table.go
index ee649c16..d646a0e4 100644
--- a/syncapi/storage/postgres/current_room_state_table.go
+++ b/syncapi/storage/postgres/current_room_state_table.go
@@ -77,6 +77,9 @@ const DeleteRoomStateForRoomSQL = "" +
const selectRoomIDsWithMembershipSQL = "" +
"SELECT DISTINCT room_id FROM syncapi_current_room_state WHERE type = 'm.room.member' AND state_key = $1 AND membership = $2"
+const selectRoomIDsWithAnyMembershipSQL = "" +
+ "SELECT DISTINCT room_id, membership FROM syncapi_current_room_state WHERE type = 'm.room.member' AND state_key = $1"
+
const selectCurrentStateSQL = "" +
"SELECT event_id, headered_event_json FROM syncapi_current_room_state WHERE room_id = $1" +
" AND ( $2::text[] IS NULL OR sender = ANY($2) )" +
@@ -102,14 +105,15 @@ const selectEventsWithEventIDsSQL = "" +
" FROM syncapi_current_room_state WHERE event_id = ANY($1)"
type currentRoomStateStatements struct {
- upsertRoomStateStmt *sql.Stmt
- deleteRoomStateByEventIDStmt *sql.Stmt
- DeleteRoomStateForRoomStmt *sql.Stmt
- selectRoomIDsWithMembershipStmt *sql.Stmt
- selectCurrentStateStmt *sql.Stmt
- selectJoinedUsersStmt *sql.Stmt
- selectEventsWithEventIDsStmt *sql.Stmt
- selectStateEventStmt *sql.Stmt
+ upsertRoomStateStmt *sql.Stmt
+ deleteRoomStateByEventIDStmt *sql.Stmt
+ DeleteRoomStateForRoomStmt *sql.Stmt
+ selectRoomIDsWithMembershipStmt *sql.Stmt
+ selectRoomIDsWithAnyMembershipStmt *sql.Stmt
+ selectCurrentStateStmt *sql.Stmt
+ selectJoinedUsersStmt *sql.Stmt
+ selectEventsWithEventIDsStmt *sql.Stmt
+ selectStateEventStmt *sql.Stmt
}
func NewPostgresCurrentRoomStateTable(db *sql.DB) (tables.CurrentRoomState, error) {
@@ -130,6 +134,9 @@ func NewPostgresCurrentRoomStateTable(db *sql.DB) (tables.CurrentRoomState, erro
if s.selectRoomIDsWithMembershipStmt, err = db.Prepare(selectRoomIDsWithMembershipSQL); err != nil {
return nil, err
}
+ if s.selectRoomIDsWithAnyMembershipStmt, err = db.Prepare(selectRoomIDsWithAnyMembershipSQL); err != nil {
+ return nil, err
+ }
if s.selectCurrentStateStmt, err = db.Prepare(selectCurrentStateSQL); err != nil {
return nil, err
}
@@ -194,6 +201,31 @@ func (s *currentRoomStateStatements) SelectRoomIDsWithMembership(
return result, rows.Err()
}
+// SelectRoomIDsWithAnyMembership returns a map of all memberships for the given user.
+func (s *currentRoomStateStatements) SelectRoomIDsWithAnyMembership(
+ ctx context.Context,
+ txn *sql.Tx,
+ userID string,
+) (map[string]string, error) {
+ stmt := sqlutil.TxStmt(txn, s.selectRoomIDsWithAnyMembershipStmt)
+ rows, err := stmt.QueryContext(ctx, userID)
+ if err != nil {
+ return nil, err
+ }
+ defer internal.CloseAndLogIfError(ctx, rows, "selectRoomIDsWithAnyMembership: rows.close() failed")
+
+ result := map[string]string{}
+ for rows.Next() {
+ var roomID string
+ var membership string
+ if err := rows.Scan(&roomID, &membership); err != nil {
+ return nil, err
+ }
+ result[roomID] = membership
+ }
+ return result, rows.Err()
+}
+
// SelectCurrentState returns all the current state events for the given room.
func (s *currentRoomStateStatements) SelectCurrentState(
ctx context.Context, txn *sql.Tx, roomID string,
diff --git a/syncapi/storage/postgres/output_room_events_table.go b/syncapi/storage/postgres/output_room_events_table.go
index d4cc4f3f..26689f44 100644
--- a/syncapi/storage/postgres/output_room_events_table.go
+++ b/syncapi/storage/postgres/output_room_events_table.go
@@ -119,13 +119,14 @@ const selectStateInRangeSQL = "" +
"SELECT event_id, id, headered_event_json, exclude_from_sync, add_state_ids, remove_state_ids" +
" FROM syncapi_output_room_events" +
" WHERE (id > $1 AND id <= $2) AND (add_state_ids IS NOT NULL OR remove_state_ids IS NOT NULL)" +
- " AND ( $3::text[] IS NULL OR sender = ANY($3) )" +
- " AND ( $4::text[] IS NULL OR NOT(sender = ANY($4)) )" +
- " AND ( $5::text[] IS NULL OR type LIKE ANY($5) )" +
- " AND ( $6::text[] IS NULL OR NOT(type LIKE ANY($6)) )" +
- " AND ( $7::bool IS NULL OR contains_url = $7 )" +
+ " AND room_id = ANY($3)" +
+ " AND ( $4::text[] IS NULL OR sender = ANY($4) )" +
+ " AND ( $5::text[] IS NULL OR NOT(sender = ANY($5)) )" +
+ " AND ( $6::text[] IS NULL OR type LIKE ANY($6) )" +
+ " AND ( $7::text[] IS NULL OR NOT(type LIKE ANY($7)) )" +
+ " AND ( $8::bool IS NULL OR contains_url = $8 )" +
" ORDER BY id ASC" +
- " LIMIT $8"
+ " LIMIT $9"
const deleteEventsForRoomSQL = "" +
"DELETE FROM syncapi_output_room_events WHERE room_id = $1"
@@ -200,12 +201,12 @@ func (s *outputRoomEventsStatements) UpdateEventJSON(ctx context.Context, event
// two positions, only the most recent state is returned.
func (s *outputRoomEventsStatements) SelectStateInRange(
ctx context.Context, txn *sql.Tx, r types.Range,
- stateFilter *gomatrixserverlib.StateFilter,
+ stateFilter *gomatrixserverlib.StateFilter, roomIDs []string,
) (map[string]map[string]bool, map[string]types.StreamEvent, error) {
stmt := sqlutil.TxStmt(txn, s.selectStateInRangeStmt)
rows, err := stmt.QueryContext(
- ctx, r.Low(), r.High(),
+ ctx, r.Low(), r.High(), pq.StringArray(roomIDs),
pq.StringArray(stateFilter.Senders),
pq.StringArray(stateFilter.NotSenders),
pq.StringArray(filterConvertTypeWildcardToSQL(stateFilter.Types)),