Try to get right room version for state res (still need to fix getMembershipsBeforeEventNID and checkServerAllowedToSeeEvent)

This commit is contained in:
Neil Alexander 2020-02-20 11:52:47 +00:00
parent a562d7d793
commit f8e4d5bcb0
11 changed files with 50 additions and 24 deletions

2
go.mod
View file

@ -14,7 +14,7 @@ require (
github.com/lib/pq v1.2.0
github.com/matrix-org/dugong v0.0.0-20171220115018-ea0a4690a0d5
github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26
github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5
github.com/matrix-org/gomatrixserverlib v0.0.0-20200220111558-3d684b2c03ab
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1
github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5
github.com/mattn/go-sqlite3 v2.0.2+incompatible

2
go.sum
View file

@ -71,6 +71,8 @@ github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 h1:Hr3zjRsq2bh
github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26/go.mod h1:3fxX6gUjWyI/2Bt7J1OLhpCzOfO/bB3AiX0cJtEKud0=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5 h1:kmRjpmFOenVpOaV/DRlo9p6z/IbOKlUC+hhKsAAh8Qg=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200220111558-3d684b2c03ab h1:OSBUQmTJOwqsNhaPahRjT7QidbD42RVQYBZzgWyVsZA=
github.com/matrix-org/gomatrixserverlib v0.0.0-20200220111558-3d684b2c03ab/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI=
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 h1:osLoFdOy+ChQqVUn2PeTDETFftVkl4w9t/OW18g3lnk=
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1/go.mod h1:cXoYQIENbdWIQHt1SyCo6Bl3C3raHwJ0wgVrXHSqf+A=
github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5 h1:W7l5CP4V7wPyPb4tYE11dbmeAOwtFQBTW0rf4OonOS8=

View file

@ -72,6 +72,10 @@ type RoomEventDatabase interface {
ctx context.Context, transactionID string,
sessionID int64, userID string,
) (string, error)
// Look up the room version from the database.
GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID,
) (state.StateResolutionVersion, error)
}
// OutputRoomEventWriter has the APIs needed to write an event to the output logs.
@ -152,8 +156,11 @@ func calculateAndSetState(
stateAtEvent *types.StateAtEvent,
event gomatrixserverlib.Event,
) error {
// TODO: get the correct room version
roomState, err := state.GetStateResolutionAlgorithm(state.StateResolutionAlgorithmV1, db)
roomVersion, err := db.GetRoomVersionForRoom(ctx, roomNID)
if err != nil {
return err
}
roomState, err := state.GetStateResolutionAlgorithm(roomVersion, db)
if err != nil {
return err
}

View file

@ -178,8 +178,11 @@ func (u *latestEventsUpdater) doUpdateLatestEvents() error {
func (u *latestEventsUpdater) latestState() error {
var err error
// TODO: get the correct room version
roomState, err := state.GetStateResolutionAlgorithm(state.StateResolutionAlgorithmV1, u.db)
roomVersion, err := u.db.GetRoomVersionForRoom(u.ctx, u.roomNID)
if err != nil {
return err
}
roomState, err := state.GetStateResolutionAlgorithm(roomVersion, u.db)
if err != nil {
return err
}

View file

@ -90,6 +90,10 @@ type RoomserverQueryAPIDatabase interface {
EventStateKeys(
context.Context, []types.EventStateKeyNID,
) (map[types.EventStateKeyNID]string, error)
// Look up the room version from the database.
GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID,
) (state.StateResolutionVersion, error)
}
// RoomserverQueryAPI is an implementation of api.RoomserverQueryAPI
@ -103,11 +107,6 @@ func (r *RoomserverQueryAPI) QueryLatestEventsAndState(
request *api.QueryLatestEventsAndStateRequest,
response *api.QueryLatestEventsAndStateResponse,
) error {
// TODO: get the correct room version
roomState, err := state.GetStateResolutionAlgorithm(state.StateResolutionAlgorithmV1, r.DB)
if err != nil {
return err
}
response.QueryLatestEventsAndStateRequest = *request
roomNID, err := r.DB.RoomNID(ctx, request.RoomID)
if err != nil {
@ -116,6 +115,14 @@ func (r *RoomserverQueryAPI) QueryLatestEventsAndState(
if roomNID == 0 {
return nil
}
roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, roomNID)
if err != nil {
return err
}
roomState, err := state.GetStateResolutionAlgorithm(roomVersion, r.DB)
if err != nil {
return err
}
response.RoomExists = true
var currentStateSnapshotNID types.StateSnapshotNID
response.LatestEvents, currentStateSnapshotNID, response.Depth, err =
@ -147,11 +154,6 @@ func (r *RoomserverQueryAPI) QueryStateAfterEvents(
request *api.QueryStateAfterEventsRequest,
response *api.QueryStateAfterEventsResponse,
) error {
// TODO: get the correct room version
roomState, err := state.GetStateResolutionAlgorithm(state.StateResolutionAlgorithmV1, r.DB)
if err != nil {
return err
}
response.QueryStateAfterEventsRequest = *request
roomNID, err := r.DB.RoomNID(ctx, request.RoomID)
if err != nil {
@ -161,7 +163,14 @@ func (r *RoomserverQueryAPI) QueryStateAfterEvents(
return nil
}
response.RoomExists = true
roomVersion, err := r.DB.GetRoomVersionForRoom(ctx, roomNID)
if err != nil {
return err
}
roomState, err := state.GetStateResolutionAlgorithm(roomVersion, r.DB)
if err != nil {
return err
}
prevStates, err := r.DB.StateAtEventIDs(ctx, request.PrevEventIDs)
if err != nil {
switch err.(type) {

View file

@ -614,7 +614,7 @@ func (v StateResolutionV2) resolveConflicts(
}
// Resolve the conflicts.
resolvedEvents := gomatrixserverlib.ResolveStateConflicts(conflictedEvents, authEvents)
resolvedEvents := gomatrixserverlib.ResolveStateConflictsV2(conflictedEvents, authEvents)
// Map from the full events back to numeric state entries.
for _, resolvedEvent := range resolvedEvents {

View file

@ -21,6 +21,7 @@ import (
"github.com/lib/pq"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/state"
"github.com/matrix-org/dendrite/roomserver/types"
)
@ -165,8 +166,8 @@ func (s *roomStatements) updateLatestEventNIDs(
func (s *roomStatements) selectRoomVersionForRoomNID(
ctx context.Context, txn *sql.Tx, roomNID types.RoomNID,
) (int64, error) {
var roomVersion int64
) (state.StateResolutionVersion, error) {
var roomVersion state.StateResolutionVersion
stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt)
err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion)
return roomVersion, err

View file

@ -22,6 +22,7 @@ import (
// Import the postgres database driver.
_ "github.com/lib/pq"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/state"
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
)
@ -699,7 +700,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type
func (d *Database) GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID,
) (int64, error) {
) (state.StateResolutionVersion, error) {
return d.statements.selectRoomVersionForRoomNID(
ctx, nil, roomNID,
)

View file

@ -21,6 +21,7 @@ import (
"github.com/lib/pq"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/state"
"github.com/matrix-org/dendrite/roomserver/types"
)
@ -157,8 +158,8 @@ func (s *roomStatements) updateLatestEventNIDs(
func (s *roomStatements) selectRoomVersionForRoomNID(
ctx context.Context, txn *sql.Tx, roomNID types.RoomNID,
) (int64, error) {
var roomVersion int64
) (state.StateResolutionVersion, error) {
var roomVersion state.StateResolutionVersion
stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt)
err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion)
return roomVersion, err

View file

@ -23,6 +23,7 @@ import (
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/state"
"github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
_ "github.com/mattn/go-sqlite3"
@ -853,7 +854,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type
func (d *Database) GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID,
) (int64, error) {
) (state.StateResolutionVersion, error) {
return d.statements.selectRoomVersionForRoomNID(
ctx, nil, roomNID,
)

View file

@ -19,6 +19,7 @@ import (
"net/url"
"github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/state"
statedb "github.com/matrix-org/dendrite/roomserver/state/database"
"github.com/matrix-org/dendrite/roomserver/storage/postgres"
"github.com/matrix-org/dendrite/roomserver/storage/sqlite3"
@ -48,7 +49,7 @@ type Database interface {
GetMembership(ctx context.Context, roomNID types.RoomNID, requestSenderUserID string) (membershipEventNID types.EventNID, stillInRoom bool, err error)
GetMembershipEventNIDsForRoom(ctx context.Context, roomNID types.RoomNID, joinOnly bool) ([]types.EventNID, error)
EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, error)
GetRoomVersionForRoom(ctx context.Context, roomNID types.RoomNID) (int64, error)
GetRoomVersionForRoom(ctx context.Context, roomNID types.RoomNID) (state.StateResolutionVersion, error)
}
// NewPublicRoomsServerDatabase opens a database connection.