diff --git a/roomserver/internal/alias.go b/roomserver/internal/alias.go index 4139582b6..d576a8175 100644 --- a/roomserver/internal/alias.go +++ b/roomserver/internal/alias.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "time" "github.com/matrix-org/dendrite/roomserver/api" @@ -239,16 +240,19 @@ func (r *RoomserverInternalAPI) sendUpdatedAliasesEvent( } builder.AuthEvents = refs - roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, roomID) + roomInfo, err := r.DB.RoomInfo(ctx, roomID) if err != nil { return err } + if roomInfo == nil { + return fmt.Errorf("room %s does not exist", roomID) + } // Build the event now := time.Now() event, err := builder.Build( now, r.Cfg.Matrix.ServerName, r.Cfg.Matrix.KeyID, - r.Cfg.Matrix.PrivateKey, roomVersion, + r.Cfg.Matrix.PrivateKey, roomInfo.RoomVersion, ) if err != nil { return err @@ -257,7 +261,7 @@ func (r *RoomserverInternalAPI) sendUpdatedAliasesEvent( // Create the request ire := api.InputRoomEvent{ Kind: api.KindNew, - Event: event.Headered(roomVersion), + Event: event.Headered(roomInfo.RoomVersion), AuthEventIDs: event.AuthEventIDs(), SendAsServer: serverName, } diff --git a/roomserver/internal/input_events.go b/roomserver/internal/input_events.go index a63082990..dabf4ee47 100644 --- a/roomserver/internal/input_events.go +++ b/roomserver/internal/input_events.go @@ -98,9 +98,17 @@ func (r *RoomserverInternalAPI) processRoomEvent( } } + roomInfo, err := r.DB.RoomInfo(ctx, event.RoomID()) + if err != nil { + return "", fmt.Errorf("r.DB.RoomInfo: %w", err) + } + if roomInfo == nil { + return "", fmt.Errorf("r.DB.RoomInfo missing for room %s", event.RoomID()) + } + if err = r.updateLatestEvents( ctx, // context - roomNID, // room NID to update + roomInfo, // room info for the room being updated stateAtEvent, // state at event (below) event, // event input.SendAsServer, // send as server diff --git a/roomserver/internal/input_latest_events.go b/roomserver/internal/input_latest_events.go index f11a78d72..76dda3999 100644 --- a/roomserver/internal/input_latest_events.go +++ b/roomserver/internal/input_latest_events.go @@ -49,13 +49,13 @@ import ( // Can only be called once at a time func (r *RoomserverInternalAPI) updateLatestEvents( ctx context.Context, - roomNID types.RoomNID, + roomInfo *types.RoomInfo, stateAtEvent types.StateAtEvent, event gomatrixserverlib.Event, sendAsServer string, transactionID *api.TransactionID, ) (err error) { - updater, err := r.DB.GetLatestEventsForUpdate(ctx, roomNID) + updater, err := r.DB.GetLatestEventsForUpdate(ctx, roomInfo.RoomNID) if err != nil { return fmt.Errorf("r.DB.GetLatestEventsForUpdate: %w", err) } @@ -66,7 +66,7 @@ func (r *RoomserverInternalAPI) updateLatestEvents( ctx: ctx, api: r, updater: updater, - roomNID: roomNID, + roomInfo: roomInfo, stateAtEvent: stateAtEvent, event: event, sendAsServer: sendAsServer, @@ -89,7 +89,7 @@ type latestEventsUpdater struct { ctx context.Context api *RoomserverInternalAPI updater *shared.LatestEventsUpdater - roomNID types.RoomNID + roomInfo *types.RoomInfo stateAtEvent types.StateAtEvent event gomatrixserverlib.Event transactionID *api.TransactionID @@ -196,7 +196,7 @@ func (u *latestEventsUpdater) doUpdateLatestEvents() error { return fmt.Errorf("u.api.WriteOutputEvents: %w", err) } - if err = u.updater.SetLatestEvents(u.roomNID, u.latest, u.stateAtEvent.EventNID, u.newStateNID); err != nil { + if err = u.updater.SetLatestEvents(u.roomInfo.RoomNID, u.latest, u.stateAtEvent.EventNID, u.newStateNID); err != nil { return fmt.Errorf("u.updater.SetLatestEvents: %w", err) } @@ -221,7 +221,7 @@ func (u *latestEventsUpdater) latestState() error { // of the state after the events. The snapshot state will be resolved // using the correct state resolution algorithm for the room. u.newStateNID, err = roomState.CalculateAndStoreStateAfterEvents( - u.ctx, u.roomNID, latestStateAtEvents, + u.ctx, u.roomInfo.RoomNID, latestStateAtEvents, ) if err != nil { return fmt.Errorf("roomState.CalculateAndStoreStateAfterEvents: %w", err) @@ -303,13 +303,8 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error) latestEventIDs[i] = u.latest[i].EventID } - roomVersion, err := u.api.DB.GetRoomVersionForRoom(u.ctx, u.event.RoomID()) - if err != nil { - return nil, err - } - ore := api.OutputNewRoomEvent{ - Event: u.event.Headered(roomVersion), + Event: u.event.Headered(u.roomInfo.RoomVersion), LastSentEventID: u.lastEventIDSent, LatestEventIDs: latestEventIDs, TransactionID: u.transactionID, @@ -337,7 +332,7 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error) // include extra state events if they were added as nearly every downstream component will care about it // and we'd rather not have them all hit QueryEventsByID at the same time! if len(ore.AddsStateEventIDs) > 0 { - ore.AddStateEvents, err = u.extraEventsForIDs(roomVersion, ore.AddsStateEventIDs) + ore.AddStateEvents, err = u.extraEventsForIDs(u.roomInfo.RoomVersion, ore.AddsStateEventIDs) if err != nil { return nil, fmt.Errorf("failed to load add_state_events from db: %w", err) } diff --git a/roomserver/internal/query.go b/roomserver/internal/query.go index 897164330..266e7100d 100644 --- a/roomserver/internal/query.go +++ b/roomserver/internal/query.go @@ -38,7 +38,7 @@ func (r *RoomserverInternalAPI) QueryLatestEventsAndState( request *api.QueryLatestEventsAndStateRequest, response *api.QueryLatestEventsAndStateResponse, ) error { - roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, request.RoomID) + roomVersion, err := r.roomVersion(request.RoomID) if err != nil { response.RoomExists = false return nil @@ -97,7 +97,7 @@ func (r *RoomserverInternalAPI) QueryStateAfterEvents( request *api.QueryStateAfterEventsRequest, response *api.QueryStateAfterEventsResponse, ) error { - roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, request.RoomID) + roomVersion, err := r.roomVersion(request.RoomID) if err != nil { response.RoomExists = false return nil @@ -168,7 +168,7 @@ func (r *RoomserverInternalAPI) QueryEventsByID( } for _, event := range events { - roomVersion, verr := r.DB.GetRoomVersionForRoom(ctx, event.RoomID()) + roomVersion, verr := r.roomVersion(event.RoomID()) if verr != nil { return verr } @@ -432,7 +432,7 @@ func (r *RoomserverInternalAPI) QueryMissingEvents( response.Events = make([]gomatrixserverlib.HeaderedEvent, 0, len(loadedEvents)-len(eventsToFilter)) for _, event := range loadedEvents { if !eventsToFilter[event.EventID()] { - roomVersion, verr := r.DB.GetRoomVersionForRoom(ctx, event.RoomID()) + roomVersion, verr := r.roomVersion(event.RoomID()) if verr != nil { return verr } @@ -481,7 +481,7 @@ func (r *RoomserverInternalAPI) PerformBackfill( } for _, event := range loadedEvents { - roomVersion, verr := r.DB.GetRoomVersionForRoom(ctx, event.RoomID()) + roomVersion, verr := r.roomVersion(event.RoomID()) if verr != nil { return verr } @@ -493,7 +493,7 @@ func (r *RoomserverInternalAPI) PerformBackfill( } func (r *RoomserverInternalAPI) backfillViaFederation(ctx context.Context, req *api.PerformBackfillRequest, res *api.PerformBackfillResponse) error { - roomVer, err := r.DB.GetRoomVersionForRoom(ctx, req.RoomID) + roomVer, err := r.roomVersion(req.RoomID) if err != nil { return fmt.Errorf("backfillViaFederation: unknown room version for room %s : %w", req.RoomID, err) } @@ -937,15 +937,23 @@ func (r *RoomserverInternalAPI) QueryRoomVersionForRoom( return nil } - roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, request.RoomID) + info, err := r.DB.RoomInfo(ctx, request.RoomID) if err != nil { return err } - response.RoomVersion = roomVersion + response.RoomVersion = info.RoomVersion r.Cache.StoreRoomVersion(request.RoomID, response.RoomVersion) return nil } +func (r *RoomserverInternalAPI) roomVersion(roomID string) (gomatrixserverlib.RoomVersion, error) { + var res api.QueryRoomVersionForRoomResponse + err := r.QueryRoomVersionForRoom(context.Background(), &api.QueryRoomVersionForRoomRequest{ + RoomID: roomID, + }, &res) + return res.RoomVersion, err +} + func (r *RoomserverInternalAPI) QueryPublishedRooms( ctx context.Context, req *api.QueryPublishedRoomsRequest, diff --git a/roomserver/storage/interface.go b/roomserver/storage/interface.go index 5f6416145..2dfaebd10 100644 --- a/roomserver/storage/interface.go +++ b/roomserver/storage/interface.go @@ -136,8 +136,6 @@ type Database interface { // not found. // Returns an error if the retrieval went wrong. EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, error) - // Look up the room version for a given room. - GetRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error) // Publish or unpublish a room from the room directory. PublishRoom(ctx context.Context, roomID string, publish bool) error // Returns a list of room IDs for rooms which are published. diff --git a/roomserver/storage/postgres/rooms_table.go b/roomserver/storage/postgres/rooms_table.go index 691c04ba6..13c8e703d 100644 --- a/roomserver/storage/postgres/rooms_table.go +++ b/roomserver/storage/postgres/rooms_table.go @@ -68,9 +68,6 @@ const selectLatestEventNIDsForUpdateSQL = "" + const updateLatestEventNIDsSQL = "" + "UPDATE roomserver_rooms SET latest_event_nids = $2, last_event_sent_nid = $3, state_snapshot_nid = $4 WHERE room_nid = $1" -const selectRoomVersionForRoomIDSQL = "" + - "SELECT room_version FROM roomserver_rooms WHERE room_id = $1" - const selectRoomVersionForRoomNIDSQL = "" + "SELECT room_version FROM roomserver_rooms WHERE room_nid = $1" @@ -83,7 +80,6 @@ type roomStatements struct { selectLatestEventNIDsStmt *sql.Stmt selectLatestEventNIDsForUpdateStmt *sql.Stmt updateLatestEventNIDsStmt *sql.Stmt - selectRoomVersionForRoomIDStmt *sql.Stmt selectRoomVersionForRoomNIDStmt *sql.Stmt selectRoomInfoStmt *sql.Stmt } @@ -100,7 +96,6 @@ func NewPostgresRoomsTable(db *sql.DB) (tables.Rooms, error) { {&s.selectLatestEventNIDsStmt, selectLatestEventNIDsSQL}, {&s.selectLatestEventNIDsForUpdateStmt, selectLatestEventNIDsForUpdateSQL}, {&s.updateLatestEventNIDsStmt, updateLatestEventNIDsSQL}, - {&s.selectRoomVersionForRoomIDStmt, selectRoomVersionForRoomIDSQL}, {&s.selectRoomVersionForRoomNIDStmt, selectRoomVersionForRoomNIDSQL}, {&s.selectRoomInfoStmt, selectRoomInfoSQL}, }.Prepare(db) @@ -192,18 +187,6 @@ func (s *roomStatements) UpdateLatestEventNIDs( return err } -func (s *roomStatements) SelectRoomVersionForRoomID( - ctx context.Context, txn *sql.Tx, roomID string, -) (gomatrixserverlib.RoomVersion, error) { - var roomVersion gomatrixserverlib.RoomVersion - stmt := sqlutil.TxStmt(txn, s.selectRoomVersionForRoomIDStmt) - err := stmt.QueryRowContext(ctx, roomID).Scan(&roomVersion) - if err == sql.ErrNoRows { - return roomVersion, errors.New("room not found") - } - return roomVersion, err -} - func (s *roomStatements) SelectRoomVersionForRoomNID( ctx context.Context, roomNID types.RoomNID, ) (gomatrixserverlib.RoomVersion, error) { diff --git a/roomserver/storage/shared/storage.go b/roomserver/storage/shared/storage.go index 4af61be8f..cba1dcf00 100644 --- a/roomserver/storage/shared/storage.go +++ b/roomserver/storage/shared/storage.go @@ -229,17 +229,6 @@ func (d *Database) StateEntries( return d.StateBlockTable.BulkSelectStateBlockEntries(ctx, stateBlockNIDs) } -func (d *Database) GetRoomVersionForRoom( - ctx context.Context, roomID string, -) (gomatrixserverlib.RoomVersion, error) { - if roomVersion, ok := d.Cache.GetRoomVersion(roomID); ok { - return roomVersion, nil - } - return d.RoomsTable.SelectRoomVersionForRoomID( - ctx, nil, roomID, - ) -} - func (d *Database) GetRoomVersionForRoomNID( ctx context.Context, roomNID types.RoomNID, ) (gomatrixserverlib.RoomVersion, error) { diff --git a/roomserver/storage/sqlite3/rooms_table.go b/roomserver/storage/sqlite3/rooms_table.go index fc1bcf22f..4c1699d00 100644 --- a/roomserver/storage/sqlite3/rooms_table.go +++ b/roomserver/storage/sqlite3/rooms_table.go @@ -58,9 +58,6 @@ const selectLatestEventNIDsForUpdateSQL = "" + const updateLatestEventNIDsSQL = "" + "UPDATE roomserver_rooms SET latest_event_nids = $1, last_event_sent_nid = $2, state_snapshot_nid = $3 WHERE room_nid = $4" -const selectRoomVersionForRoomIDSQL = "" + - "SELECT room_version FROM roomserver_rooms WHERE room_id = $1" - const selectRoomVersionForRoomNIDSQL = "" + "SELECT room_version FROM roomserver_rooms WHERE room_nid = $1" @@ -74,7 +71,6 @@ type roomStatements struct { selectLatestEventNIDsStmt *sql.Stmt selectLatestEventNIDsForUpdateStmt *sql.Stmt updateLatestEventNIDsStmt *sql.Stmt - selectRoomVersionForRoomIDStmt *sql.Stmt selectRoomVersionForRoomNIDStmt *sql.Stmt selectRoomInfoStmt *sql.Stmt } @@ -93,7 +89,6 @@ func NewSqliteRoomsTable(db *sql.DB) (tables.Rooms, error) { {&s.selectLatestEventNIDsStmt, selectLatestEventNIDsSQL}, {&s.selectLatestEventNIDsForUpdateStmt, selectLatestEventNIDsForUpdateSQL}, {&s.updateLatestEventNIDsStmt, updateLatestEventNIDsSQL}, - {&s.selectRoomVersionForRoomIDStmt, selectRoomVersionForRoomIDSQL}, {&s.selectRoomVersionForRoomNIDStmt, selectRoomVersionForRoomNIDSQL}, {&s.selectRoomInfoStmt, selectRoomInfoSQL}, }.Prepare(db) @@ -198,18 +193,6 @@ func (s *roomStatements) UpdateLatestEventNIDs( return err } -func (s *roomStatements) SelectRoomVersionForRoomID( - ctx context.Context, txn *sql.Tx, roomID string, -) (gomatrixserverlib.RoomVersion, error) { - var roomVersion gomatrixserverlib.RoomVersion - stmt := sqlutil.TxStmt(txn, s.selectRoomVersionForRoomIDStmt) - err := stmt.QueryRowContext(ctx, roomID).Scan(&roomVersion) - if err == sql.ErrNoRows { - return roomVersion, errors.New("room not found") - } - return roomVersion, err -} - func (s *roomStatements) SelectRoomVersionForRoomNID( ctx context.Context, roomNID types.RoomNID, ) (gomatrixserverlib.RoomVersion, error) { diff --git a/roomserver/storage/tables/interface.go b/roomserver/storage/tables/interface.go index ca9159d07..c599dd3fe 100644 --- a/roomserver/storage/tables/interface.go +++ b/roomserver/storage/tables/interface.go @@ -63,7 +63,6 @@ type Rooms interface { SelectLatestEventNIDs(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID) ([]types.EventNID, types.StateSnapshotNID, error) SelectLatestEventsNIDsForUpdate(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID) ([]types.EventNID, types.EventNID, types.StateSnapshotNID, error) UpdateLatestEventNIDs(ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, eventNIDs []types.EventNID, lastEventSentNID types.EventNID, stateSnapshotNID types.StateSnapshotNID) error - SelectRoomVersionForRoomID(ctx context.Context, txn *sql.Tx, roomID string) (gomatrixserverlib.RoomVersion, error) SelectRoomVersionForRoomNID(ctx context.Context, roomNID types.RoomNID) (gomatrixserverlib.RoomVersion, error) SelectRoomInfo(ctx context.Context, roomID string) (*types.RoomInfo, error) }