Progress on #267

This commit is contained in:
Remi Reuvekamp 2017-11-15 21:15:37 +01:00
parent 528f7b8903
commit 30c65f1352
4 changed files with 42 additions and 2 deletions

View file

@ -20,7 +20,6 @@ import (
_ "net/http/pprof" _ "net/http/pprof"
"os" "os"
log "github.com/sirupsen/logrus"
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/common/config" "github.com/matrix-org/dendrite/common/config"
"github.com/matrix-org/dendrite/roomserver/alias" "github.com/matrix-org/dendrite/roomserver/alias"
@ -28,6 +27,7 @@ import (
"github.com/matrix-org/dendrite/roomserver/query" "github.com/matrix-org/dendrite/roomserver/query"
"github.com/matrix-org/dendrite/roomserver/storage" "github.com/matrix-org/dendrite/roomserver/storage"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
log "github.com/sirupsen/logrus"
sarama "gopkg.in/Shopify/sarama.v1" sarama "gopkg.in/Shopify/sarama.v1"
) )

View file

@ -16,8 +16,10 @@ package query
import ( import (
"context" "context"
"database/sql"
"encoding/json" "encoding/json"
"net/http" "net/http"
"time"
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
@ -74,6 +76,10 @@ type RoomserverQueryAPIDatabase interface {
EventStateKeys( EventStateKeys(
context.Context, []types.EventStateKeyNID, context.Context, []types.EventStateKeyNID,
) (map[types.EventStateKeyNID]string, error) ) (map[types.EventStateKeyNID]string, error)
// Lookup if the roomID has been reserved, and when that reservation was made.
RoomIDReserved(ctx context.Context, roomID string) (time.Time, error)
// Reserve the room ID.
ReserveRoomID(ctx context.Context, roomID string) error
} }
// RoomserverQueryAPI is an implementation of api.RoomserverQueryAPI // RoomserverQueryAPI is an implementation of api.RoomserverQueryAPI
@ -425,14 +431,34 @@ func (r *RoomserverQueryAPI) QueryReserveRoomID(
response *api.QueryReserveRoomIDResponse, response *api.QueryReserveRoomIDResponse,
) error { ) error {
nid, err := r.DB.RoomNID(ctx, request.RoomID) nid, err := r.DB.RoomNID(ctx, request.RoomID)
if err != nil && err != sql.ErrNoRows {
return err
}
if nid != 0 { if nid != 0 {
response.Success = false response.Success = false
return nil return nil
} }
// Check if Room ID has already been reserved.
reservedSince, err := r.DB.RoomIDReserved(ctx, request.RoomID)
if reservedSince != (time.Time{}) {
response.Success = false
return nil
}
if err != nil && err != sql.ErrNoRows {
return err
}
err = r.DB.ReserveRoomID(ctx, request.RoomID)
if err != nil {
return err
}
response.Success = true response.Success = true
return err return nil
} }
// SetupHTTP adds the RoomserverQueryAPI handlers to the http.ServeMux. // SetupHTTP adds the RoomserverQueryAPI handlers to the http.ServeMux.

View file

@ -30,6 +30,7 @@ type statements struct {
roomAliasesStatements roomAliasesStatements
inviteStatements inviteStatements
membershipStatements membershipStatements
reservedRoomStatements
} }
func (s *statements) prepare(db *sql.DB) error { func (s *statements) prepare(db *sql.DB) error {
@ -47,6 +48,7 @@ func (s *statements) prepare(db *sql.DB) error {
s.roomAliasesStatements.prepare, s.roomAliasesStatements.prepare,
s.inviteStatements.prepare, s.inviteStatements.prepare,
s.membershipStatements.prepare, s.membershipStatements.prepare,
s.reservedRoomStatements.prepare,
} { } {
if err = prepare(db); err != nil { if err = prepare(db); err != nil {
return err return err

View file

@ -17,6 +17,7 @@ package storage
import ( import (
"context" "context"
"database/sql" "database/sql"
"time"
// Import the postgres database driver. // Import the postgres database driver.
_ "github.com/lib/pq" _ "github.com/lib/pq"
@ -651,6 +652,17 @@ func (d *Database) GetMembershipEventNIDsForRoom(
return d.statements.selectMembershipsFromRoom(ctx, roomNID) return d.statements.selectMembershipsFromRoom(ctx, roomNID)
} }
// RoomIDReserved implements query.RoomserverQueryAPIDB
func (d *Database) RoomIDReserved(ctx context.Context, roomID string) (time.Time, error) {
return d.statements.selectReservedRoom(ctx, roomID)
}
// ReserveRoomID implements query.RoomserverQueryAPIDB
// It saved the given room ID as reserved.
func (d *Database) ReserveRoomID(ctx context.Context, roomID string) error {
return d.statements.insertReservedRoom(ctx, roomID, time.Now())
}
type transaction struct { type transaction struct {
ctx context.Context ctx context.Context
txn *sql.Tx txn *sql.Tx