Adjust StoreEvent order to select->check->insert, rather than insert->check->select

This commit is contained in:
Neil Alexander 2020-08-18 10:31:25 +01:00
parent 6274bc5c63
commit 2d08280152
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -398,34 +398,38 @@ func (d *Database) StoreEvent(
} }
} }
if eventNID, stateNID, err = d.EventsTable.InsertEvent( if eventNID, stateNID, err = d.EventsTable.SelectEvent(ctx, txn, event.EventID()); err != nil {
ctx,
txn,
roomNID,
eventTypeNID,
eventStateKeyNID,
event.EventID(),
event.EventReference().EventSHA256,
authEventNIDs,
event.Depth(),
); err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// We've already inserted the event so select the numeric event ID // The event doesn't already exist in the database so try to
eventNID, stateNID, err = d.EventsTable.SelectEvent(ctx, txn, event.EventID()) // insert an event entry for it.
} if eventNID, stateNID, err = d.EventsTable.InsertEvent(
if err != nil { ctx,
return err txn,
roomNID,
eventTypeNID,
eventStateKeyNID,
event.EventID(),
event.EventReference().EventSHA256,
authEventNIDs,
event.Depth(),
); err != nil {
return fmt.Errorf("d.EventsTable.InsertEvent: %w", err)
}
// Then insert the event JSON itself.
if err = d.EventJSONTable.InsertEventJSON(ctx, txn, eventNID, event.JSON()); err != nil {
return fmt.Errorf("d.EventJSONTable.InsertEventJSON: %w", err)
}
} else {
return fmt.Errorf("d.EventsTable.SelectEvent: %w", err)
} }
} }
if err = d.EventJSONTable.InsertEventJSON(ctx, txn, eventNID, event.JSON()); err != nil {
return fmt.Errorf("d.EventJSONTable.InsertEventJSON: %w", err)
}
redactionEvent, redactedEventID, err = d.handleRedactions(ctx, txn, eventNID, event) redactionEvent, redactedEventID, err = d.handleRedactions(ctx, txn, eventNID, event)
return nil return nil
}) })
if err != nil { if err != nil {
return 0, types.StateAtEvent{}, nil, "", err return 0, types.StateAtEvent{}, nil, "", fmt.Errorf("sqlutil.WithTransaction: %w", err)
} }
return roomNID, types.StateAtEvent{ return roomNID, types.StateAtEvent{