From 2e65e0d16093be6fc709842453eadc5818f8badf Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 18 Aug 2020 17:26:59 +0100 Subject: [PATCH] Fix redaction deadlocks --- .../storage/shared/room_recent_events_updater.go | 6 +++--- roomserver/storage/shared/storage.go | 16 ++++++---------- roomserver/storage/sqlite3/storage.go | 8 ++++++++ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/roomserver/storage/shared/room_recent_events_updater.go b/roomserver/storage/shared/room_recent_events_updater.go index 55bc2e914..9b7611d49 100644 --- a/roomserver/storage/shared/room_recent_events_updater.go +++ b/roomserver/storage/shared/room_recent_events_updater.go @@ -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 diff --git a/roomserver/storage/shared/storage.go b/roomserver/storage/shared/storage.go index a048f9e6a..56bd8354d 100644 --- a/roomserver/storage/shared/storage.go +++ b/roomserver/storage/shared/storage.go @@ -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,12 +570,10 @@ 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{ - Validated: false, - RedactionEventID: event.EventID(), - RedactsEventID: event.Redacts(), - }) + 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 } diff --git a/roomserver/storage/sqlite3/storage.go b/roomserver/storage/sqlite3/storage.go index 8c79fa666..6a1c3a5ab 100644 --- a/roomserver/storage/sqlite3/storage.go +++ b/roomserver/storage/sqlite3/storage.go @@ -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) +}