Juggle around things a bit

This commit is contained in:
Neil Alexander 2020-08-18 14:02:27 +01:00
parent 2d08280152
commit 93f996bda3
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
2 changed files with 31 additions and 27 deletions

View file

@ -3,6 +3,7 @@ package shared
import ( import (
"context" "context"
"database/sql" "database/sql"
"fmt"
"github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/gomatrixserverlib"
@ -20,25 +21,28 @@ type roomRecentEventsUpdater struct {
func NewRoomRecentEventsUpdater(d *Database, ctx context.Context, roomNID types.RoomNID, useTxns bool) (types.RoomRecentEventsUpdater, error) { func NewRoomRecentEventsUpdater(d *Database, ctx context.Context, roomNID types.RoomNID, useTxns bool) (types.RoomRecentEventsUpdater, error) {
txn, err := d.DB.Begin() txn, err := d.DB.Begin()
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("d.DB.Begin: %w", err)
} }
eventNIDs, lastEventNIDSent, currentStateSnapshotNID, err := eventNIDs, lastEventNIDSent, currentStateSnapshotNID, err :=
d.RoomsTable.SelectLatestEventsNIDsForUpdate(ctx, txn, roomNID) d.RoomsTable.SelectLatestEventsNIDsForUpdate(ctx, txn, roomNID)
if err != nil { if err != nil && err != sql.ErrNoRows {
txn.Rollback() // nolint: errcheck txn.Rollback() // nolint: errcheck
return nil, err return nil, fmt.Errorf("d.RoomsTable.SelectLatestEventsNIDsForUpdate: %w", err)
}
stateAndRefs, err := d.EventsTable.BulkSelectStateAtEventAndReference(ctx, txn, eventNIDs)
if err != nil {
txn.Rollback() // nolint: errcheck
return nil, err
} }
var stateAndRefs []types.StateAtEventAndReference
var lastEventIDSent string var lastEventIDSent string
if lastEventNIDSent != 0 { if err == nil {
lastEventIDSent, err = d.EventsTable.SelectEventID(ctx, txn, lastEventNIDSent) stateAndRefs, err = d.EventsTable.BulkSelectStateAtEventAndReference(ctx, txn, eventNIDs)
if err != nil { if err != nil {
txn.Rollback() // nolint: errcheck txn.Rollback() // nolint: errcheck
return nil, err return nil, fmt.Errorf("d.EventsTable.BulkSelectStateAtEventAndReference: %w", err)
}
if lastEventNIDSent != 0 {
lastEventIDSent, err = d.EventsTable.SelectEventID(ctx, txn, lastEventNIDSent)
if err != nil {
txn.Rollback() // nolint: errcheck
return nil, fmt.Errorf("d.EventsTable.SelectEventID: %w", err)
}
} }
} }
if !useTxns { if !useTxns {

View file

@ -357,16 +357,16 @@ func (d *Database) StoreEvent(
err error err error
) )
err = sqlutil.WithTransaction(d.DB, func(txn *sql.Tx) error { if txnAndSessionID != nil {
if txnAndSessionID != nil { if err = d.TransactionsTable.InsertTransaction(
if err = d.TransactionsTable.InsertTransaction( ctx, nil, txnAndSessionID.TransactionID,
ctx, txn, txnAndSessionID.TransactionID, txnAndSessionID.SessionID, event.Sender(), event.EventID(),
txnAndSessionID.SessionID, event.Sender(), event.EventID(), ); err != nil {
); err != nil { return 0, types.StateAtEvent{}, nil, "", fmt.Errorf("d.TransactionsTable.InsertTransaction: %w", err)
return fmt.Errorf("d.TransactionsTable.InsertTransaction: %w", err)
}
} }
}
err = sqlutil.WithTransaction(d.DB, func(txn *sql.Tx) error {
// TODO: Here we should aim to have two different code paths for new rooms // TODO: Here we should aim to have two different code paths for new rooms
// vs existing ones. // vs existing ones.
@ -426,6 +426,9 @@ func (d *Database) StoreEvent(
} }
redactionEvent, redactedEventID, err = d.handleRedactions(ctx, txn, eventNID, event) redactionEvent, redactedEventID, err = d.handleRedactions(ctx, txn, eventNID, event)
if err != nil {
return fmt.Errorf("d.handleRedactions: %w", err)
}
return nil return nil
}) })
if err != nil { if err != nil {
@ -456,15 +459,12 @@ func (d *Database) assignRoomNID(
ctx context.Context, txn *sql.Tx, ctx context.Context, txn *sql.Tx,
roomID string, roomVersion gomatrixserverlib.RoomVersion, roomID string, roomVersion gomatrixserverlib.RoomVersion,
) (types.RoomNID, error) { ) (types.RoomNID, error) {
// Check if we already have a numeric ID in the database. // Try to insert the room. If it's ineffectual then we have the
roomNID, err := d.RoomsTable.SelectRoomNID(ctx, txn, roomID) // room in the database already.
roomNID, err := d.RoomsTable.InsertRoomNID(ctx, txn, roomID, roomVersion)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// We don't have a numeric ID so insert one into the database. // Look up the room NID that we already have.
roomNID, err = d.RoomsTable.InsertRoomNID(ctx, txn, roomID, roomVersion) roomNID, err = d.RoomsTable.SelectRoomNID(ctx, txn, roomID)
if err == sql.ErrNoRows {
// We raced with another insert so run the select again.
roomNID, err = d.RoomsTable.SelectRoomNID(ctx, txn, roomID)
}
} }
return roomNID, err return roomNID, err
} }