Fix redaction deadlocks

This commit is contained in:
Neil Alexander 2020-08-18 17:26:59 +01:00
parent 352a4a896c
commit 2e65e0d160
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
3 changed files with 17 additions and 13 deletions

View file

@ -18,7 +18,7 @@ type roomRecentEventsUpdater struct {
currentStateSnapshotNID types.StateSnapshotNID
}
func NewRoomRecentEventsUpdater(d *Database, ctx context.Context, roomNID types.RoomNID) (types.RoomRecentEventsUpdater, func() error, error) {
func NewRoomRecentEventsUpdater(d *Database, ctx context.Context, roomNID types.RoomNID, useTxns bool) (types.RoomRecentEventsUpdater, func() error, error) {
eventNIDs, lastEventNIDSent, currentStateSnapshotNID, err :=
d.RoomsTable.SelectLatestEventsNIDsForUpdate(ctx, nil, roomNID)
if err != nil && err != sql.ErrNoRows {
@ -40,13 +40,13 @@ func NewRoomRecentEventsUpdater(d *Database, ctx context.Context, roomNID types.
}
var txn *sql.Tx
cancel := func() error { return nil }
/*
if useTxns {
txn, err := d.DB.Begin()
if err != nil {
return nil, nil, fmt.Errorf("d.DB.Begin: %w", err)
}
cancel = func() error { return txn.Commit() }
*/
}
return &roomRecentEventsUpdater{
transaction{ctx, txn}, d, roomNID, stateAndRefs, lastEventIDSent, currentStateSnapshotNID,
}, cancel, nil

View file

@ -353,7 +353,7 @@ func (d *Database) MembershipUpdater(
func (d *Database) GetLatestEventsForUpdate(
ctx context.Context, roomNID types.RoomNID,
) (types.RoomRecentEventsUpdater, func() error, error) {
return NewRoomRecentEventsUpdater(d, ctx, roomNID)
return NewRoomRecentEventsUpdater(d, ctx, roomNID, true)
}
// nolint:gocyclo
@ -570,13 +570,11 @@ func (d *Database) handleRedactions(
return nil, "", nil
}
err = d.Writer.Do(d.DB, txn, func(txn *sql.Tx) error {
return d.RedactionsTable.InsertRedaction(ctx, txn, tables.RedactionInfo{
err = d.RedactionsTable.InsertRedaction(ctx, txn, tables.RedactionInfo{
Validated: false,
RedactionEventID: event.EventID(),
RedactsEventID: event.Redacts(),
})
})
if err != nil {
return nil, "", err
}
@ -604,9 +602,7 @@ func (d *Database) handleRedactions(
redactedEvent.Event = redactedEvent.Redact()
}
// overwrite the eventJSON table
err = d.Writer.Do(d.DB, txn, func(txn *sql.Tx) error {
return d.EventJSONTable.InsertEventJSON(ctx, txn, redactedEvent.EventNID, redactedEvent.JSON())
})
err = d.EventJSONTable.InsertEventJSON(ctx, txn, redactedEvent.EventNID, redactedEvent.JSON())
if err != nil {
return nil, "", err
}

View file

@ -16,12 +16,14 @@
package sqlite3
import (
"context"
"database/sql"
"github.com/matrix-org/dendrite/internal/config"
"github.com/matrix-org/dendrite/internal/sqlutil"
"github.com/matrix-org/dendrite/roomserver/storage/shared"
"github.com/matrix-org/dendrite/roomserver/storage/tables"
"github.com/matrix-org/dendrite/roomserver/types"
_ "github.com/mattn/go-sqlite3"
)
@ -133,3 +135,9 @@ func Open(dbProperties *config.DatabaseOptions) (*Database, error) {
}
return &d, nil
}
func (d *Database) GetLatestEventsForUpdate(
ctx context.Context, roomNID types.RoomNID,
) (types.RoomRecentEventsUpdater, func() error, error) {
return shared.NewRoomRecentEventsUpdater(d, ctx, roomNID, false)
}