Use a writer to assign state key NIDs (#2877)

This commit is contained in:
Till 2022-11-14 13:06:27 +01:00 committed by GitHub
parent 529df30b56
commit 1e79b0557e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -103,6 +103,7 @@ func (d *Database) eventStateKeyNIDs(
ctx context.Context, txn *sql.Tx, eventStateKeys []string,
) (map[string]types.EventStateKeyNID, error) {
result := make(map[string]types.EventStateKeyNID)
eventStateKeys = util.UniqueStrings(eventStateKeys)
nids, err := d.EventStateKeysTable.BulkSelectEventStateKeyNID(ctx, txn, eventStateKeys)
if err != nil {
return nil, err
@ -112,15 +113,23 @@ func (d *Database) eventStateKeyNIDs(
}
// We received some nids, but are still missing some, work out which and create them
if len(eventStateKeys) > len(result) {
for _, eventStateKey := range eventStateKeys {
if _, ok := result[eventStateKey]; ok {
continue
var nid types.EventStateKeyNID
err = d.Writer.Do(d.DB, txn, func(txn *sql.Tx) error {
for _, eventStateKey := range eventStateKeys {
if _, ok := result[eventStateKey]; ok {
continue
}
nid, err = d.assignStateKeyNID(ctx, txn, eventStateKey)
if err != nil {
return err
}
result[eventStateKey] = nid
}
nid, err := d.assignStateKeyNID(ctx, txn, eventStateKey)
if err != nil {
return result, err
}
result[eventStateKey] = nid
return nil
})
if err != nil {
return nil, err
}
}
return result, nil