From a270a1012a0acaa9b8452b51aafec1044365a3fa Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 7 Oct 2020 12:46:01 +0100 Subject: [PATCH] Use latest events updater to row-lock prev events --- roomserver/storage/shared/storage.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/roomserver/storage/shared/storage.go b/roomserver/storage/shared/storage.go index 1624f6831..a06b4b696 100644 --- a/roomserver/storage/shared/storage.go +++ b/roomserver/storage/shared/storage.go @@ -468,12 +468,22 @@ func (d *Database) StoreEvent( if !isRejected { // ignore rejected redaction events redactionEvent, redactedEventID, err = d.handleRedactions(ctx, txn, eventNID, event) } - for _, prev := range event.PrevEvents() { - if err = d.PrevEventsTable.InsertPreviousEvent(ctx, txn, prev.EventID, prev.EventSHA256, eventNID); err != nil { - return fmt.Errorf("d.PrevEventsTable.InsertPreviousEvent: %w", err) - } + + var roomInfo *types.RoomInfo + var updater *LatestEventsUpdater + roomInfo, err = d.RoomInfo(ctx, event.RoomID()) + if err != nil { + return fmt.Errorf("d.RoomInfo: %w", err) } - return nil + updater, err = d.GetLatestEventsForUpdate(ctx, *roomInfo) + if err != nil { + return fmt.Errorf("NewLatestEventsUpdater: %w", err) + } + if err = updater.StorePreviousEvents(eventNID, event.PrevEvents()); err != nil { + return fmt.Errorf("updater.StorePreviousEvents: %w", err) + } + succeeded := false + return sqlutil.EndTransaction(updater, &succeeded) }) if err != nil { return 0, types.StateAtEvent{}, nil, "", fmt.Errorf("d.Writer.Do: %w", err)